spapr_cpu_core: migrate per-CPU data

A per-CPU machine data pointer was recently added to PowerPCCPU. The
motivation is to to hide platform specific details from the core CPU
code. This per-CPU data can hold state which is relevant to the guest
though, eg, Virtual Processor Areas, and we should migrate this state.

This patch adds the plumbing so that we can migrate the per-CPU data
for PAPR guests. We only do this for newer machine types for the sake
of backward compatibility. No state is migrated for the moment: the
vmstate_spapr_cpu_state structure will be populated by subsequent
patches.

Signed-off-by: Greg Kurz <groug@kaod.org>
[dwg: Fix some trivial spelling and spacing errors]
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
Greg Kurz 2018-06-18 14:26:35 +02:00 committed by David Gibson
parent 04026890f2
commit b94020268e
3 changed files with 27 additions and 3 deletions

View File

@ -4115,7 +4115,12 @@ DEFINE_SPAPR_MACHINE(3_0, "3.0", true);
HW_COMPAT_2_12 \ HW_COMPAT_2_12 \
{ \ { \
.driver = TYPE_POWERPC_CPU, \ .driver = TYPE_POWERPC_CPU, \
.property = "pre-3.0-migration", \ .property = "pre-3.0-migration", \
.value = "on", \
}, \
{ \
.driver = TYPE_SPAPR_CPU_CORE, \
.property = "pre-3.0-migration", \
.value = "on", \ .value = "on", \
}, },

View File

@ -129,6 +129,15 @@ static void spapr_cpu_core_unrealize(DeviceState *dev, Error **errp)
g_free(sc->threads); g_free(sc->threads);
} }
static const VMStateDescription vmstate_spapr_cpu_state = {
.name = "spapr_cpu",
.version_id = 1,
.minimum_version_id = 1,
.fields = (VMStateField[]) {
VMSTATE_END_OF_LIST()
},
};
static void spapr_realize_vcpu(PowerPCCPU *cpu, sPAPRMachineState *spapr, static void spapr_realize_vcpu(PowerPCCPU *cpu, sPAPRMachineState *spapr,
Error **errp) Error **errp)
{ {
@ -194,6 +203,10 @@ static PowerPCCPU *spapr_create_vcpu(sPAPRCPUCore *sc, int i, Error **errp)
} }
cpu->machine_data = g_new0(sPAPRCPUState, 1); cpu->machine_data = g_new0(sPAPRCPUState, 1);
if (!sc->pre_3_0_migration) {
vmstate_register(NULL, cs->cpu_index, &vmstate_spapr_cpu_state,
cpu->machine_data);
}
object_unref(obj); object_unref(obj);
return cpu; return cpu;
@ -204,10 +217,13 @@ err:
return NULL; return NULL;
} }
static void spapr_delete_vcpu(PowerPCCPU *cpu) static void spapr_delete_vcpu(PowerPCCPU *cpu, sPAPRCPUCore *sc)
{ {
sPAPRCPUState *spapr_cpu = spapr_cpu_state(cpu); sPAPRCPUState *spapr_cpu = spapr_cpu_state(cpu);
if (!sc->pre_3_0_migration) {
vmstate_unregister(NULL, &vmstate_spapr_cpu_state, cpu->machine_data);
}
cpu->machine_data = NULL; cpu->machine_data = NULL;
g_free(spapr_cpu); g_free(spapr_cpu);
object_unparent(OBJECT(cpu)); object_unparent(OBJECT(cpu));
@ -253,7 +269,7 @@ err_unrealize:
} }
err: err:
while (--i >= 0) { while (--i >= 0) {
spapr_delete_vcpu(sc->threads[i]); spapr_delete_vcpu(sc->threads[i], sc);
} }
g_free(sc->threads); g_free(sc->threads);
error_propagate(errp, local_err); error_propagate(errp, local_err);
@ -261,6 +277,8 @@ err:
static Property spapr_cpu_core_properties[] = { static Property spapr_cpu_core_properties[] = {
DEFINE_PROP_INT32("node-id", sPAPRCPUCore, node_id, CPU_UNSET_NUMA_NODE_ID), DEFINE_PROP_INT32("node-id", sPAPRCPUCore, node_id, CPU_UNSET_NUMA_NODE_ID),
DEFINE_PROP_BOOL("pre-3.0-migration", sPAPRCPUCore, pre_3_0_migration,
false),
DEFINE_PROP_END_OF_LIST() DEFINE_PROP_END_OF_LIST()
}; };

View File

@ -31,6 +31,7 @@ typedef struct sPAPRCPUCore {
/*< public >*/ /*< public >*/
PowerPCCPU **threads; PowerPCCPU **threads;
int node_id; int node_id;
bool pre_3_0_migration; /* older machine don't know about sPAPRCPUState */
} sPAPRCPUCore; } sPAPRCPUCore;
typedef struct sPAPRCPUCoreClass { typedef struct sPAPRCPUCoreClass {