hw/core/cpu-common.c | 10 +++++++++- system/cpus.c | 4 ---- 2 files changed, 9 insertions(+), 5 deletions(-)
Currently cpu->nr_cores and cpu->nr_threads are initialized in
qemu_init_vcpu(), which is called a bit late in *cpu_realizefn() for
each ARCHes.
x86 arch would like to use nr_cores and nr_threads earlier in its
realizefn(). To serve this purpose, initialize nr_cores and nr_threads
in cpu_common_initfn(), which is earlier than *cpu_realizefn().
Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com>
---
hw/core/cpu-common.c | 10 +++++++++-
system/cpus.c | 4 ----
2 files changed, 9 insertions(+), 5 deletions(-)
diff --git a/hw/core/cpu-common.c b/hw/core/cpu-common.c
index 09c79035949b..6de92ed854bc 100644
--- a/hw/core/cpu-common.c
+++ b/hw/core/cpu-common.c
@@ -237,14 +237,22 @@ static void cpu_common_unrealizefn(DeviceState *dev)
static void cpu_common_initfn(Object *obj)
{
CPUState *cpu = CPU(obj);
+ Object *machine = qdev_get_machine();
+ MachineState *ms;
gdb_init_cpu(cpu);
cpu->cpu_index = UNASSIGNED_CPU_INDEX;
cpu->cluster_index = UNASSIGNED_CLUSTER_INDEX;
/* user-mode doesn't have configurable SMP topology */
- /* the default value is changed by qemu_init_vcpu() for system-mode */
cpu->nr_cores = 1;
cpu->nr_threads = 1;
+#ifndef CONFIG_USER_ONLY
+ if (object_dynamic_cast(machine, TYPE_MACHINE)) {
+ ms = MACHINE(machine);
+ cpu->nr_cores = machine_topo_get_cores_per_socket(ms);
+ cpu->nr_threads = ms->smp.threads;
+ }
+#endif
cpu->cflags_next_tb = -1;
/* allocate storage for thread info, initialise condition variables */
diff --git a/system/cpus.c b/system/cpus.c
index 1c818ff6828c..c1547fbfd39b 100644
--- a/system/cpus.c
+++ b/system/cpus.c
@@ -664,10 +664,6 @@ const AccelOpsClass *cpus_get_accel(void)
void qemu_init_vcpu(CPUState *cpu)
{
- MachineState *ms = MACHINE(qdev_get_machine());
-
- cpu->nr_cores = machine_topo_get_cores_per_socket(ms);
- cpu->nr_threads = ms->smp.threads;
cpu->stopped = true;
cpu->random_seed = qemu_guest_random_seed_thread_part1();
--
2.34.1
On 22/11/24 17:03, Xiaoyao Li wrote: > Currently cpu->nr_cores and cpu->nr_threads are initialized in > qemu_init_vcpu(), which is called a bit late in *cpu_realizefn() for > each ARCHes. > > x86 arch would like to use nr_cores and nr_threads earlier in its > realizefn(). To serve this purpose, initialize nr_cores and nr_threads > in cpu_common_initfn(), which is earlier than *cpu_realizefn(). > > Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com> > --- > hw/core/cpu-common.c | 10 +++++++++- > system/cpus.c | 4 ---- > 2 files changed, 9 insertions(+), 5 deletions(-) > > diff --git a/hw/core/cpu-common.c b/hw/core/cpu-common.c > index 09c79035949b..6de92ed854bc 100644 > --- a/hw/core/cpu-common.c > +++ b/hw/core/cpu-common.c > @@ -237,14 +237,22 @@ static void cpu_common_unrealizefn(DeviceState *dev) > static void cpu_common_initfn(Object *obj) > { > CPUState *cpu = CPU(obj); > + Object *machine = qdev_get_machine(); > + MachineState *ms; > > gdb_init_cpu(cpu); > cpu->cpu_index = UNASSIGNED_CPU_INDEX; > cpu->cluster_index = UNASSIGNED_CLUSTER_INDEX; > /* user-mode doesn't have configurable SMP topology */ > - /* the default value is changed by qemu_init_vcpu() for system-mode */ > cpu->nr_cores = 1; > cpu->nr_threads = 1; > +#ifndef CONFIG_USER_ONLY Is CONFIG_USER_ONLY available in an common_ss[] object? I don't recall. Anyway, can we not use CONFIG_USER_ONLY in cpu-common.c? > + if (object_dynamic_cast(machine, TYPE_MACHINE)) { > + ms = MACHINE(machine); > + cpu->nr_cores = machine_topo_get_cores_per_socket(ms); > + cpu->nr_threads = ms->smp.threads; > + } > +#endif > cpu->cflags_next_tb = -1; > > /* allocate storage for thread info, initialise condition variables */ > diff --git a/system/cpus.c b/system/cpus.c > index 1c818ff6828c..c1547fbfd39b 100644 > --- a/system/cpus.c > +++ b/system/cpus.c > @@ -664,10 +664,6 @@ const AccelOpsClass *cpus_get_accel(void) > > void qemu_init_vcpu(CPUState *cpu) > { > - MachineState *ms = MACHINE(qdev_get_machine()); > - > - cpu->nr_cores = machine_topo_get_cores_per_socket(ms); > - cpu->nr_threads = ms->smp.threads; > cpu->stopped = true; > cpu->random_seed = qemu_guest_random_seed_thread_part1(); >
On 11/22/24 11:26, Philippe Mathieu-Daudé wrote: > On 22/11/24 17:03, Xiaoyao Li wrote: >> Currently cpu->nr_cores and cpu->nr_threads are initialized in >> qemu_init_vcpu(), which is called a bit late in *cpu_realizefn() for >> each ARCHes. >> >> x86 arch would like to use nr_cores and nr_threads earlier in its >> realizefn(). To serve this purpose, initialize nr_cores and nr_threads >> in cpu_common_initfn(), which is earlier than *cpu_realizefn(). >> >> Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com> >> --- >> hw/core/cpu-common.c | 10 +++++++++- >> system/cpus.c | 4 ---- >> 2 files changed, 9 insertions(+), 5 deletions(-) >> >> diff --git a/hw/core/cpu-common.c b/hw/core/cpu-common.c >> index 09c79035949b..6de92ed854bc 100644 >> --- a/hw/core/cpu-common.c >> +++ b/hw/core/cpu-common.c >> @@ -237,14 +237,22 @@ static void cpu_common_unrealizefn(DeviceState *dev) >> static void cpu_common_initfn(Object *obj) >> { >> CPUState *cpu = CPU(obj); >> + Object *machine = qdev_get_machine(); >> + MachineState *ms; >> gdb_init_cpu(cpu); >> cpu->cpu_index = UNASSIGNED_CPU_INDEX; >> cpu->cluster_index = UNASSIGNED_CLUSTER_INDEX; >> /* user-mode doesn't have configurable SMP topology */ >> - /* the default value is changed by qemu_init_vcpu() for system-mode */ >> cpu->nr_cores = 1; >> cpu->nr_threads = 1; >> +#ifndef CONFIG_USER_ONLY > > Is CONFIG_USER_ONLY available in an common_ss[] object? I don't recall. No. r~
© 2016 - 2024 Red Hat, Inc.