mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-08 02:03:56 -06:00
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
6 changed files with 10 additions and 13 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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 >*/
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue