mirror of
https://gitlab.com/qemu-project/qemu
synced 2024-11-05 20:35:44 +00:00
machine: Prefer cores over sockets in smp parsing since 6.2
In the real SMP hardware topology world, it's much more likely that we have high cores-per-socket counts and few sockets totally. While the current preference of sockets over cores in smp parsing results in a virtual cpu topology with low cores-per-sockets counts and a large number of sockets, which is just contrary to the real world. Given that it is better to make the virtual cpu topology be more reflective of the real world and also for the sake of compatibility, we start to prefer cores over sockets over threads in smp parsing since machine type 6.2 for different arches. In this patch, a boolean "smp_prefer_sockets" is added, and we only enable the old preference on older machines and enable the new one since type 6.2 for all arches by using the machine compat mechanism. Suggested-by: Daniel P. Berrange <berrange@redhat.com> Signed-off-by: Yanan Wang <wangyanan55@huawei.com> Acked-by: David Gibson <david@gibson.dropbear.id.au> Acked-by: Cornelia Huck <cohuck@redhat.com> Reviewed-by: Andrew Jones <drjones@redhat.com> Reviewed-by: Pankaj Gupta <pankaj.gupta@ionos.com> Reviewed-by: Daniel P. Berrangé <berrange@redhat.com> Message-Id: <20210929025816.21076-10-wangyanan55@huawei.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
bbb0c0ec6d
commit
4a0af2930a
9 changed files with 60 additions and 19 deletions
|
@ -2815,6 +2815,7 @@ static void virt_machine_6_1_options(MachineClass *mc)
|
|||
|
||||
virt_machine_6_2_options(mc);
|
||||
compat_props_add(mc->compat_props, hw_compat_6_1, hw_compat_6_1_len);
|
||||
mc->smp_prefer_sockets = true;
|
||||
|
||||
/* qemu ITS was introduced with 6.2 */
|
||||
vmc->no_tcg_its = true;
|
||||
|
|
|
@ -748,6 +748,7 @@ void machine_set_cpu_numa_node(MachineState *machine,
|
|||
|
||||
static void smp_parse(MachineState *ms, SMPConfiguration *config, Error **errp)
|
||||
{
|
||||
MachineClass *mc = MACHINE_GET_CLASS(ms);
|
||||
unsigned cpus = config->has_cpus ? config->cpus : 0;
|
||||
unsigned sockets = config->has_sockets ? config->sockets : 0;
|
||||
unsigned cores = config->has_cores ? config->cores : 0;
|
||||
|
@ -759,7 +760,7 @@ static void smp_parse(MachineState *ms, SMPConfiguration *config, Error **errp)
|
|||
return;
|
||||
}
|
||||
|
||||
/* compute missing values, prefer sockets over cores over threads */
|
||||
/* compute missing values based on the provided ones */
|
||||
if (cpus == 0 && maxcpus == 0) {
|
||||
sockets = sockets > 0 ? sockets : 1;
|
||||
cores = cores > 0 ? cores : 1;
|
||||
|
@ -767,14 +768,30 @@ static void smp_parse(MachineState *ms, SMPConfiguration *config, Error **errp)
|
|||
} else {
|
||||
maxcpus = maxcpus > 0 ? maxcpus : cpus;
|
||||
|
||||
if (sockets == 0) {
|
||||
cores = cores > 0 ? cores : 1;
|
||||
threads = threads > 0 ? threads : 1;
|
||||
sockets = maxcpus / (cores * threads);
|
||||
} else if (cores == 0) {
|
||||
threads = threads > 0 ? threads : 1;
|
||||
cores = maxcpus / (sockets * threads);
|
||||
} else if (threads == 0) {
|
||||
if (mc->smp_prefer_sockets) {
|
||||
/* prefer sockets over cores before 6.2 */
|
||||
if (sockets == 0) {
|
||||
cores = cores > 0 ? cores : 1;
|
||||
threads = threads > 0 ? threads : 1;
|
||||
sockets = maxcpus / (cores * threads);
|
||||
} else if (cores == 0) {
|
||||
threads = threads > 0 ? threads : 1;
|
||||
cores = maxcpus / (sockets * threads);
|
||||
}
|
||||
} else {
|
||||
/* prefer cores over sockets since 6.2 */
|
||||
if (cores == 0) {
|
||||
sockets = sockets > 0 ? sockets : 1;
|
||||
threads = threads > 0 ? threads : 1;
|
||||
cores = maxcpus / (sockets * threads);
|
||||
} else if (sockets == 0) {
|
||||
threads = threads > 0 ? threads : 1;
|
||||
sockets = maxcpus / (cores * threads);
|
||||
}
|
||||
}
|
||||
|
||||
/* try to calculate omitted threads at last */
|
||||
if (threads == 0) {
|
||||
threads = maxcpus / (sockets * cores);
|
||||
}
|
||||
}
|
||||
|
|
35
hw/i386/pc.c
35
hw/i386/pc.c
|
@ -716,6 +716,7 @@ void pc_acpi_smi_interrupt(void *opaque, int irq, int level)
|
|||
*/
|
||||
static void pc_smp_parse(MachineState *ms, SMPConfiguration *config, Error **errp)
|
||||
{
|
||||
MachineClass *mc = MACHINE_GET_CLASS(ms);
|
||||
unsigned cpus = config->has_cpus ? config->cpus : 0;
|
||||
unsigned sockets = config->has_sockets ? config->sockets : 0;
|
||||
unsigned dies = config->has_dies ? config->dies : 0;
|
||||
|
@ -726,7 +727,7 @@ static void pc_smp_parse(MachineState *ms, SMPConfiguration *config, Error **err
|
|||
/* directly default dies to 1 if it's omitted */
|
||||
dies = dies > 0 ? dies : 1;
|
||||
|
||||
/* compute missing values, prefer sockets over cores over threads */
|
||||
/* compute missing values based on the provided ones */
|
||||
if (cpus == 0 && maxcpus == 0) {
|
||||
sockets = sockets > 0 ? sockets : 1;
|
||||
cores = cores > 0 ? cores : 1;
|
||||
|
@ -734,14 +735,30 @@ static void pc_smp_parse(MachineState *ms, SMPConfiguration *config, Error **err
|
|||
} else {
|
||||
maxcpus = maxcpus > 0 ? maxcpus : cpus;
|
||||
|
||||
if (sockets == 0) {
|
||||
cores = cores > 0 ? cores : 1;
|
||||
threads = threads > 0 ? threads : 1;
|
||||
sockets = maxcpus / (dies * cores * threads);
|
||||
} else if (cores == 0) {
|
||||
threads = threads > 0 ? threads : 1;
|
||||
cores = maxcpus / (sockets * dies * threads);
|
||||
} else if (threads == 0) {
|
||||
if (mc->smp_prefer_sockets) {
|
||||
/* prefer sockets over cores before 6.2 */
|
||||
if (sockets == 0) {
|
||||
cores = cores > 0 ? cores : 1;
|
||||
threads = threads > 0 ? threads : 1;
|
||||
sockets = maxcpus / (dies * cores * threads);
|
||||
} else if (cores == 0) {
|
||||
threads = threads > 0 ? threads : 1;
|
||||
cores = maxcpus / (sockets * dies * threads);
|
||||
}
|
||||
} else {
|
||||
/* prefer cores over sockets since 6.2 */
|
||||
if (cores == 0) {
|
||||
sockets = sockets > 0 ? sockets : 1;
|
||||
threads = threads > 0 ? threads : 1;
|
||||
cores = maxcpus / (sockets * dies * threads);
|
||||
} else if (sockets == 0) {
|
||||
threads = threads > 0 ? threads : 1;
|
||||
sockets = maxcpus / (dies * cores * threads);
|
||||
}
|
||||
}
|
||||
|
||||
/* try to calculate omitted threads at last */
|
||||
if (threads == 0) {
|
||||
threads = maxcpus / (sockets * dies * cores);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -432,6 +432,7 @@ static void pc_i440fx_6_1_machine_options(MachineClass *m)
|
|||
m->is_default = false;
|
||||
compat_props_add(m->compat_props, hw_compat_6_1, hw_compat_6_1_len);
|
||||
compat_props_add(m->compat_props, pc_compat_6_1, pc_compat_6_1_len);
|
||||
m->smp_prefer_sockets = true;
|
||||
}
|
||||
|
||||
DEFINE_I440FX_MACHINE(v6_1, "pc-i440fx-6.1", NULL,
|
||||
|
|
|
@ -372,6 +372,7 @@ static void pc_q35_6_1_machine_options(MachineClass *m)
|
|||
m->alias = NULL;
|
||||
compat_props_add(m->compat_props, hw_compat_6_1, hw_compat_6_1_len);
|
||||
compat_props_add(m->compat_props, pc_compat_6_1, pc_compat_6_1_len);
|
||||
m->smp_prefer_sockets = true;
|
||||
}
|
||||
|
||||
DEFINE_Q35_MACHINE(v6_1, "pc-q35-6.1", NULL,
|
||||
|
|
|
@ -4685,6 +4685,7 @@ static void spapr_machine_6_1_class_options(MachineClass *mc)
|
|||
spapr_machine_6_2_class_options(mc);
|
||||
compat_props_add(mc->compat_props, hw_compat_6_1, hw_compat_6_1_len);
|
||||
smc->pre_6_2_numa_affinity = true;
|
||||
mc->smp_prefer_sockets = true;
|
||||
}
|
||||
|
||||
DEFINE_SPAPR_MACHINE(6_1, "6.1", false);
|
||||
|
|
|
@ -814,6 +814,7 @@ static void ccw_machine_6_1_class_options(MachineClass *mc)
|
|||
{
|
||||
ccw_machine_6_2_class_options(mc);
|
||||
compat_props_add(mc->compat_props, hw_compat_6_1, hw_compat_6_1_len);
|
||||
mc->smp_prefer_sockets = true;
|
||||
}
|
||||
DEFINE_CCW_MACHINE(6_1, "6.1", false);
|
||||
|
||||
|
|
|
@ -247,6 +247,7 @@ struct MachineClass {
|
|||
bool nvdimm_supported;
|
||||
bool numa_mem_supported;
|
||||
bool auto_enable_numa;
|
||||
bool smp_prefer_sockets;
|
||||
const char *default_ram_id;
|
||||
|
||||
HotplugHandler *(*get_hotplug_handler)(MachineState *machine,
|
||||
|
|
|
@ -244,7 +244,8 @@ SRST
|
|||
Historically preference was given to the coarsest topology parameters
|
||||
when computing missing values (ie sockets preferred over cores, which
|
||||
were preferred over threads), however, this behaviour is considered
|
||||
liable to change.
|
||||
liable to change. Prior to 6.2 the preference was sockets over cores
|
||||
over threads. Since 6.2 the preference is cores over sockets over threads.
|
||||
ERST
|
||||
|
||||
DEF("numa", HAS_ARG, QEMU_OPTION_numa,
|
||||
|
|
Loading…
Reference in a new issue