Skip to content

Commit

Permalink
machine: move dies from X86MachineState to CpuTopology
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
bonzini committed Jun 25, 2021
1 parent bd80936 commit 67872eb
Show file tree
Hide file tree
Showing 6 changed files with 10 additions and 13 deletions.
1 change: 1 addition & 0 deletions hw/core/machine.c
Expand Up @@ -970,6 +970,7 @@ static void machine_initfn(Object *obj)
ms->smp.cpus = mc->default_cpus;
ms->smp.max_cpus = mc->default_cpus;
ms->smp.cores = 1;
ms->smp.dies = 1;
ms->smp.threads = 1;
ms->smp.sockets = 1;
}
Expand Down
4 changes: 1 addition & 3 deletions hw/i386/pc.c
Expand Up @@ -712,8 +712,6 @@ void pc_acpi_smi_interrupt(void *opaque, int irq, int level)
*/
void pc_smp_parse(MachineState *ms, QemuOpts *opts)
{
X86MachineState *x86ms = X86_MACHINE(ms);

if (opts) {
unsigned cpus = qemu_opt_get_number(opts, "cpus", 0);
unsigned sockets = qemu_opt_get_number(opts, "sockets", 0);
Expand Down Expand Up @@ -769,7 +767,7 @@ void pc_smp_parse(MachineState *ms, QemuOpts *opts)
ms->smp.cores = cores;
ms->smp.threads = threads;
ms->smp.sockets = sockets;
x86ms->smp_dies = dies;
ms->smp.dies = dies;
}

if (ms->smp.cpus > 1) {
Expand Down
15 changes: 7 additions & 8 deletions hw/i386/x86.c
Expand Up @@ -64,7 +64,7 @@ inline void init_topo_info(X86CPUTopoInfo *topo_info,
{
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->threads_per_core = ms->smp.threads;
}
Expand Down Expand Up @@ -293,21 +293,21 @@ void x86_cpu_pre_plug(HotplugHandler *hotplug_dev,

init_topo_info(&topo_info, x86ms);

env->nr_dies = x86ms->smp_dies;
env->nr_dies = ms->smp.dies;

/*
* If APIC ID is not set,
* set it based on socket/die/core/thread properties.
*/
if (cpu->apic_id == UNASSIGNED_APIC_ID) {
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
* 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;
}

Expand All @@ -322,9 +322,9 @@ void x86_cpu_pre_plug(HotplugHandler *hotplug_dev,
if (cpu->die_id < 0) {
error_setg(errp, "CPU die-id is not set");
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",
cpu->die_id, x86ms->smp_dies - 1);
cpu->die_id, ms->smp.dies - 1);
return;
}
if (cpu->core_id < 0) {
Expand Down Expand Up @@ -477,7 +477,7 @@ const CPUArchIdList *x86_possible_cpu_arch_ids(MachineState *ms)
&topo_info, &topo_ids);
ms->possible_cpus->cpus[i].props.has_socket_id = true;
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.die_id = topo_ids.die_id;
}
Expand Down Expand Up @@ -1269,7 +1269,6 @@ static void x86_machine_initfn(Object *obj)

x86ms->smm = ON_OFF_AUTO_AUTO;
x86ms->acpi = ON_OFF_AUTO_AUTO;
x86ms->smp_dies = 1;
x86ms->pci_irq_mask = ACPI_BUILD_PCI_IRQS;
x86ms->oem_id = g_strndup(ACPI_BUILD_APPNAME6, 6);
x86ms->oem_table_id = g_strndup(ACPI_BUILD_APPNAME8, 8);
Expand Down
1 change: 1 addition & 0 deletions include/hw/boards.h
Expand Up @@ -282,6 +282,7 @@ typedef struct DeviceMemoryState {
*/
typedef struct CpuTopology {
unsigned int cpus;
unsigned int dies;
unsigned int cores;
unsigned int threads;
unsigned int sockets;
Expand Down
1 change: 0 additions & 1 deletion include/hw/i386/pc.h
Expand Up @@ -19,7 +19,6 @@
* PCMachineState:
* @acpi_dev: link to ACPI PM device that performs ACPI hotplug handling
* @boot_cpus: number of present VCPUs
* @smp_dies: number of dies per one package
*/
typedef struct PCMachineState {
/*< private >*/
Expand Down
1 change: 0 additions & 1 deletion include/hw/i386/x86.h
Expand Up @@ -62,7 +62,6 @@ struct X86MachineState {
unsigned pci_irq_mask;
unsigned apic_id_limit;
uint16_t boot_cpus;
unsigned smp_dies;

OnOffAuto smm;
OnOffAuto acpi;
Expand Down

0 comments on commit 67872eb

Please sign in to comment.