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:
parent
bd80936a4f
commit
67872eb8ed
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
@ -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) {
|
||||
|
@ -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;
|
||||
}
|
||||
@ -293,7 +293,7 @@ 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,
|
||||
@ -301,13 +301,13 @@ void x86_cpu_pre_plug(HotplugHandler *hotplug_dev,
|
||||
*/
|
||||
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;
|
||||
}
|
||||
|
||||
@ -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) {
|
||||
@ -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;
|
||||
}
|
||||
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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 >*/
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user