[RFC v9 2/4] hotplug/cpu: Add operation queuing function
Michael Bringmann
mwb at linux.vnet.ibm.com
Mon Jun 4 06:04:28 AEST 2018
[Testing delayed due to internal SAN problems.]
migration/dlpar: This patch adds function dlpar_queue_action()
which will add information about a CPU/Memory 'readd' operation
according to resource type, action code, and DRC index. Initial
usage is for the 'readd' CPU and Memory blocks identified as
having changed their associativity during a migration event.
Signed-off-by: Michael Bringmann <mwb at linux.vnet.ibm.com>
---
Changes in RFC:
-- Correct drc_index for dlpar_queue_action worker invocation
-- Correct text of notice
-- Revise queuing model to save up all of the DLPAR actions for
later execution.
---
arch/powerpc/platforms/pseries/dlpar.c | 51 ++++++++++++++++++++++++++++++
arch/powerpc/platforms/pseries/pseries.h | 2 +
2 files changed, 53 insertions(+)
diff --git a/arch/powerpc/platforms/pseries/dlpar.c b/arch/powerpc/platforms/pseries/dlpar.c
index a0b20c0..a1300d2 100644
--- a/arch/powerpc/platforms/pseries/dlpar.c
+++ b/arch/powerpc/platforms/pseries/dlpar.c
@@ -407,6 +407,57 @@ void queue_hotplug_event(struct pseries_hp_errorlog *hp_errlog,
}
}
+struct DlparWork {
+ struct list_head list;
+ int resource;
+ int action;
+ u32 drc_index;
+} DlparWorkQ;
+
+int dlpar_delayed_queue_action(int resource, int action, u32 drc_index)
+{
+ struct DlparWork *dwq;
+
+ dwq = kmalloc(sizeof(struct DlparWork), GFP_KERNEL);
+ if (!dwq)
+ return -ENOMEM;
+
+ dwq->resource = resource;
+ dwq->action = action;
+ dwq->drc_index = drc_index;
+
+ list_add_tail(&dwq->list, &DlparWorkQ.list);
+
+ return 0;
+}
+
+int dlpar_schedule_delayed_queue(void)
+{
+ struct DlparWork *iter;
+ struct list_head *pos, *q;
+
+ list_for_each_entry(iter, &DlparWorkQ.list, list) {
+ struct pseries_hp_errorlog hp_elog;
+
+ hp_elog.resource = iter->resource;
+ hp_elog.action = iter->action;
+ hp_elog.id_type = PSERIES_HP_ELOG_ID_DRC_INDEX;
+ hp_elog._drc_u.drc_index = cpu_to_be32(iter->drc_index);
+
+ handle_dlpar_errorlog(&hp_elog);
+ }
+
+ list_for_each_safe(pos, q, &DlparWorkQ.list) {
+ struct DlparWork *tmp;
+
+ tmp = list_entry(pos, struct DlparWork, list);
+ list_del(pos);
+ kfree(tmp);
+ }
+
+ return 0;
+}
+
static int dlpar_parse_resource(char **cmd, struct pseries_hp_errorlog *hp_elog)
{
char *arg;
diff --git a/arch/powerpc/platforms/pseries/pseries.h b/arch/powerpc/platforms/pseries/pseries.h
index 60db2ee..de73fda 100644
--- a/arch/powerpc/platforms/pseries/pseries.h
+++ b/arch/powerpc/platforms/pseries/pseries.h
@@ -61,6 +61,8 @@ extern struct device_node *dlpar_configure_connector(__be32,
void queue_hotplug_event(struct pseries_hp_errorlog *hp_errlog,
struct completion *hotplug_done, int *rc);
+int dlpar_delayed_queue_action(int resource, int action, u32 drc_index);
+int dlpar_schedule_delayed_queue(void);
#ifdef CONFIG_MEMORY_HOTPLUG
int dlpar_memory(struct pseries_hp_errorlog *hp_elog);
#else
More information about the Linuxppc-dev
mailing list