machine: move dies from X86MachineState to CpuTopology

In order to make SMP configuration a Machine property, we need a getter as
well as a setter.  To simplify the implementation put everything that the
getter needs in the CpuTopology struct.

Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Message-Id: <20210617155308.928754-7-pbonzini@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Paolo Bonzini 2021-06-17 17:53:03 +02:00
parent bd80936a4f
commit 67872eb8ed
6 changed files with 10 additions and 13 deletions

View file

@ -970,6 +970,7 @@ static void machine_initfn(Object *obj)
ms->smp.cpus = mc->default_cpus; ms->smp.cpus = mc->default_cpus;
ms->smp.max_cpus = mc->default_cpus; ms->smp.max_cpus = mc->default_cpus;
ms->smp.cores = 1; ms->smp.cores = 1;
ms->smp.dies = 1;
ms->smp.threads = 1; ms->smp.threads = 1;
ms->smp.sockets = 1; ms->smp.sockets = 1;
} }

View file

@ -712,8 +712,6 @@ void pc_acpi_smi_interrupt(void *opaque, int irq, int level)
*/ */
void pc_smp_parse(MachineState *ms, QemuOpts *opts) void pc_smp_parse(MachineState *ms, QemuOpts *opts)
{ {
X86MachineState *x86ms = X86_MACHINE(ms);
if (opts) { if (opts) {
unsigned cpus = qemu_opt_get_number(opts, "cpus", 0); unsigned cpus = qemu_opt_get_number(opts, "cpus", 0);
unsigned sockets = qemu_opt_get_number(opts, "sockets", 0); unsigned sockets = qemu_opt_get_number(opts, "sockets", 0);
@ -769,7 +767,7 @@ void pc_smp_parse(MachineState *ms, QemuOpts *opts)
ms->smp.cores = cores; ms->smp.cores = cores;
ms->smp.threads = threads; ms->smp.threads = threads;
ms->smp.sockets = sockets; ms->smp.sockets = sockets;
x86ms->smp_dies = dies; ms->smp.dies = dies;
} }
if (ms->smp.cpus > 1) { if (ms->smp.cpus > 1) {

View file

@ -64,7 +64,7 @@ inline void init_topo_info(X86CPUTopoInfo *topo_info,
{ {
MachineState *ms = MACHINE(x86ms); MachineState *ms = MACHINE(x86ms);
topo_info->dies_per_pkg = x86ms->smp_dies; topo_info->dies_per_pkg = ms->smp.dies;
topo_info->cores_per_die = ms->smp.cores; topo_info->cores_per_die = ms->smp.cores;
topo_info->threads_per_core = ms->smp.threads; topo_info->threads_per_core = ms->smp.threads;
} }
@ -293,7 +293,7 @@ void x86_cpu_pre_plug(HotplugHandler *hotplug_dev,
init_topo_info(&topo_info, x86ms); init_topo_info(&topo_info, x86ms);
env->nr_dies = x86ms->smp_dies; env->nr_dies = ms->smp.dies;
/* /*
* If APIC ID is not set, * If APIC ID is not set,
@ -301,13 +301,13 @@ void x86_cpu_pre_plug(HotplugHandler *hotplug_dev,
*/ */
if (cpu->apic_id == UNASSIGNED_APIC_ID) { if (cpu->apic_id == UNASSIGNED_APIC_ID) {
int max_socket = (ms->smp.max_cpus - 1) / int max_socket = (ms->smp.max_cpus - 1) /
smp_threads / smp_cores / x86ms->smp_dies; smp_threads / smp_cores / ms->smp.dies;
/* /*
* die-id was optional in QEMU 4.0 and older, so keep it optional * die-id was optional in QEMU 4.0 and older, so keep it optional
* if there's only one die per socket. * if there's only one die per socket.
*/ */
if (cpu->die_id < 0 && x86ms->smp_dies == 1) { if (cpu->die_id < 0 && ms->smp.dies == 1) {
cpu->die_id = 0; cpu->die_id = 0;
} }
@ -322,9 +322,9 @@ void x86_cpu_pre_plug(HotplugHandler *hotplug_dev,
if (cpu->die_id < 0) { if (cpu->die_id < 0) {
error_setg(errp, "CPU die-id is not set"); error_setg(errp, "CPU die-id is not set");
return; return;
} else if (cpu->die_id > x86ms->smp_dies - 1) { } else if (cpu->die_id > ms->smp.dies - 1) {
error_setg(errp, "Invalid CPU die-id: %u must be in range 0:%u", error_setg(errp, "Invalid CPU die-id: %u must be in range 0:%u",
cpu->die_id, x86ms->smp_dies - 1); cpu->die_id, ms->smp.dies - 1);
return; return;
} }
if (cpu->core_id < 0) { if (cpu->core_id < 0) {
@ -477,7 +477,7 @@ const CPUArchIdList *x86_possible_cpu_arch_ids(MachineState *ms)
&topo_info, &topo_ids); &topo_info, &topo_ids);
ms->possible_cpus->cpus[i].props.has_socket_id = true; ms->possible_cpus->cpus[i].props.has_socket_id = true;
ms->possible_cpus->cpus[i].props.socket_id = topo_ids.pkg_id; ms->possible_cpus->cpus[i].props.socket_id = topo_ids.pkg_id;
if (x86ms->smp_dies > 1) { if (ms->smp.dies > 1) {
ms->possible_cpus->cpus[i].props.has_die_id = true; ms->possible_cpus->cpus[i].props.has_die_id = true;
ms->possible_cpus->cpus[i].props.die_id = topo_ids.die_id; ms->possible_cpus->cpus[i].props.die_id = topo_ids.die_id;
} }
@ -1269,7 +1269,6 @@ static void x86_machine_initfn(Object *obj)
x86ms->smm = ON_OFF_AUTO_AUTO; x86ms->smm = ON_OFF_AUTO_AUTO;
x86ms->acpi = ON_OFF_AUTO_AUTO; x86ms->acpi = ON_OFF_AUTO_AUTO;
x86ms->smp_dies = 1;
x86ms->pci_irq_mask = ACPI_BUILD_PCI_IRQS; x86ms->pci_irq_mask = ACPI_BUILD_PCI_IRQS;
x86ms->oem_id = g_strndup(ACPI_BUILD_APPNAME6, 6); x86ms->oem_id = g_strndup(ACPI_BUILD_APPNAME6, 6);
x86ms->oem_table_id = g_strndup(ACPI_BUILD_APPNAME8, 8); x86ms->oem_table_id = g_strndup(ACPI_BUILD_APPNAME8, 8);

View file

@ -282,6 +282,7 @@ typedef struct DeviceMemoryState {
*/ */
typedef struct CpuTopology { typedef struct CpuTopology {
unsigned int cpus; unsigned int cpus;
unsigned int dies;
unsigned int cores; unsigned int cores;
unsigned int threads; unsigned int threads;
unsigned int sockets; unsigned int sockets;

View file

@ -19,7 +19,6 @@
* PCMachineState: * PCMachineState:
* @acpi_dev: link to ACPI PM device that performs ACPI hotplug handling * @acpi_dev: link to ACPI PM device that performs ACPI hotplug handling
* @boot_cpus: number of present VCPUs * @boot_cpus: number of present VCPUs
* @smp_dies: number of dies per one package
*/ */
typedef struct PCMachineState { typedef struct PCMachineState {
/*< private >*/ /*< private >*/

View file

@ -62,7 +62,6 @@ struct X86MachineState {
unsigned pci_irq_mask; unsigned pci_irq_mask;
unsigned apic_id_limit; unsigned apic_id_limit;
uint16_t boot_cpus; uint16_t boot_cpus;
unsigned smp_dies;
OnOffAuto smm; OnOffAuto smm;
OnOffAuto acpi; OnOffAuto acpi;