@@ -1427,8 +1427,6 @@ static void qemu_dummy_start_vcpu(CPUState *cpu)
void qemu_init_vcpu(CPUState *cpu)
{
- cpu->nr_cores = smp_cores;
- cpu->nr_threads = smp_threads;
cpu->stopped = true;
if (!cpu->as) {
@@ -511,9 +511,22 @@ static void machine_set_smp_parameters(MachineState *ms)
ms->cpus = cpus;
}
+#define NR_CPUS_STRLEN sizeof(stringify(MAX_CPUMASK_BITS))
+
static void machine_pre_init(MachineState *ms)
{
MachineClass *mc = MACHINE_CLASS(object_get_class(OBJECT(ms)));
+ static char nr_cores[NR_CPUS_STRLEN], nr_threads[NR_CPUS_STRLEN];
+ static GlobalProperty cpu_nr_cores = {
+ .driver = "cpu",
+ .property = "nr-cores",
+ .value = nr_cores,
+ };
+ static GlobalProperty cpu_nr_threads = {
+ .driver = "cpu",
+ .property = "nr-threads",
+ .value = nr_threads,
+ };
machine_set_smp_parameters(ms);
smp_cores = ms->cores;
@@ -529,6 +542,11 @@ static void machine_pre_init(MachineState *ms)
exit(1);
}
+ snprintf(nr_cores, NR_CPUS_STRLEN, "%d", ms->cores);
+ snprintf(nr_threads, NR_CPUS_STRLEN, "%d", ms->threads);
+ qdev_prop_register_global(&cpu_nr_cores);
+ qdev_prop_register_global(&cpu_nr_threads);
+
if (ms->cpus > 1) {
Error *blocker = NULL;
error_setg(&blocker, QERR_REPLAY_NOT_SUPPORTED, "smp");
CPUState nr_cores and nr_threads are properties so we can set them using the GlobalProperty API. Doing this in machine pre_init allows us to easily propagate the values from the machine properties to all cpus. An excellent bonus of this is that we can now remove the references to the cpu topology globals smp_cores,smp_threads from cpus.c. Signed-off-by: Andrew Jones <drjones@redhat.com> --- cpus.c | 2 -- hw/core/machine.c | 18 ++++++++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) -- 2.4.11