From: Paolo Bonzini <pbonzini@redhat.com>
To: qemu-devel@nongnu.org
Cc: Andrew Jones <drjones@redhat.com>,
"Daniel P . Berrange" <berrange@redhat.com>,
Cornelia Huck <cohuck@redhat.com>,
Pankaj Gupta <pankaj.gupta@ionos.com>,
Yanan Wang <wangyanan55@huawei.com>,
David Gibson <david@gibson.dropbear.id.au>
Subject: [PULL 09/30] machine: Prefer cores over sockets in smp parsing since 6.2
Date: Sun, 3 Oct 2021 09:42:29 +0200 [thread overview]
Message-ID: <20211003074250.60869-10-pbonzini@redhat.com> (raw)
In-Reply-To: <20211003074250.60869-1-pbonzini@redhat.com>
From: Yanan Wang <wangyanan55@huawei.com>
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>
---
hw/arm/virt.c | 1 +
hw/core/machine.c | 35 ++++++++++++++++++++++++++---------
hw/i386/pc.c | 35 ++++++++++++++++++++++++++---------
hw/i386/pc_piix.c | 1 +
hw/i386/pc_q35.c | 1 +
hw/ppc/spapr.c | 1 +
hw/s390x/s390-virtio-ccw.c | 1 +
include/hw/boards.h | 1 +
qemu-options.hx | 3 ++-
9 files changed, 60 insertions(+), 19 deletions(-)
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
index 1d59f0e59f..8c13deb5db 100644
--- a/hw/arm/virt.c
+++ b/hw/arm/virt.c
@@ -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;
diff --git a/hw/core/machine.c b/hw/core/machine.c
index e38ab760e6..f2a34d98c0 100644
--- a/hw/core/machine.c
+++ b/hw/core/machine.c
@@ -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);
}
}
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index 9216ad163d..6cc32f4048 100644
--- a/hw/i386/pc.c
+++ b/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);
}
}
diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
index 6cc834aff6..932e6e2cfe 100644
--- a/hw/i386/pc_piix.c
+++ b/hw/i386/pc_piix.c
@@ -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,
diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
index 5481d5c965..57ab07e5b7 100644
--- a/hw/i386/pc_q35.c
+++ b/hw/i386/pc_q35.c
@@ -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,
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index b7bee5f4ff..2986108b5a 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -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);
diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
index 61aeccb163..5401c985cf 100644
--- a/hw/s390x/s390-virtio-ccw.c
+++ b/hw/s390x/s390-virtio-ccw.c
@@ -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);
diff --git a/include/hw/boards.h b/include/hw/boards.h
index 463a5514f9..2ae039b74f 100644
--- a/include/hw/boards.h
+++ b/include/hw/boards.h
@@ -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,
diff --git a/qemu-options.hx b/qemu-options.hx
index 2eac830fdb..8ef178180d 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -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,
--
2.31.1
next prev parent reply other threads:[~2021-10-03 7:53 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-10-03 7:42 [PULL 00/30] Misc changes for 2021-10-03 Paolo Bonzini
2021-10-03 7:42 ` [PULL 01/30] qapi/machine: Fix an incorrect comment of SMPConfiguration Paolo Bonzini
2021-10-03 7:42 ` [PULL 02/30] machine: Deprecate "parameter=0" SMP configurations Paolo Bonzini
2021-10-03 7:42 ` [PULL 03/30] machine: Minor refactor/fix for the smp parsers Paolo Bonzini
2021-10-03 7:42 ` [PULL 04/30] machine: Uniformly use maxcpus to calculate the omitted parameters Paolo Bonzini
2021-10-03 7:42 ` [PULL 05/30] machine: Set the value of cpus to match maxcpus if it's omitted Paolo Bonzini
2021-10-03 7:42 ` [PULL 06/30] machine: Improve the error reporting of smp parsing Paolo Bonzini
2021-10-03 7:42 ` [PULL 07/30] qtest/numa-test: Use detailed -smp CLIs in pc_dynamic_cpu_cfg Paolo Bonzini
2021-10-03 7:42 ` [PULL 08/30] qtest/numa-test: Use detailed -smp CLIs in test_def_cpu_split Paolo Bonzini
2021-10-03 7:42 ` Paolo Bonzini [this message]
2021-10-03 7:42 ` [PULL 10/30] machine: Use ms instead of global current_machine in sanity-check Paolo Bonzini
2021-10-03 7:42 ` [PULL 11/30] machine: Tweak the order of topology members in struct CpuTopology Paolo Bonzini
2021-10-03 7:42 ` [PULL 12/30] machine: Make smp_parse generic enough for all arches Paolo Bonzini
2021-10-03 7:42 ` [PULL 13/30] machine: Remove smp_parse callback from MachineClass Paolo Bonzini
2021-10-03 7:42 ` [PULL 14/30] machine: Move smp_prefer_sockets to struct SMPCompatProps Paolo Bonzini
2021-10-03 7:42 ` [PULL 15/30] machine: Use g_autoptr in machine_set_smp Paolo Bonzini
2021-10-03 7:42 ` [PULL 16/30] machine: Put all sanity-check in the generic SMP parser Paolo Bonzini
2021-10-03 7:42 ` [PULL 17/30] i386: Support KVM_CAP_ENFORCE_PV_FEATURE_CPUID Paolo Bonzini
2021-10-03 7:42 ` [PULL 18/30] i386: Support KVM_CAP_HYPERV_ENFORCE_CPUID Paolo Bonzini
2021-10-03 7:42 ` [PULL 19/30] i386: Move HV_APIC_ACCESS_RECOMMENDED bit setting to hyperv_fill_cpuids() Paolo Bonzini
2021-10-03 7:42 ` [PULL 20/30] i386: Implement pseudo 'hv-avic' ('hv-apicv') enlightenment Paolo Bonzini
2021-10-03 7:42 ` [PULL 21/30] i386: Make Hyper-V version id configurable Paolo Bonzini
2021-10-03 7:42 ` [PULL 22/30] i386: Change the default Hyper-V version to match WS2016 Paolo Bonzini
2021-10-03 7:42 ` [PULL 23/30] configure: Loosen GCC requirement from 7.5.0 to 7.4.0 Paolo Bonzini
2021-10-03 7:42 ` [PULL 24/30] virtio-mem-pci: Fix memory leak when creating MEMORY_DEVICE_SIZE_CHANGE event Paolo Bonzini
2021-10-03 7:42 ` [PULL 25/30] qapi: Include qom-path in MEMORY_DEVICE_SIZE_CHANGE qapi events Paolo Bonzini
2021-10-03 7:42 ` [PULL 26/30] monitor: Rate-limit MEMORY_DEVICE_SIZE_CHANGE qapi events per device Paolo Bonzini
2021-10-03 7:42 ` [PULL 27/30] tpm: mark correct memory region range dirty when clearing RAM Paolo Bonzini
2021-10-03 7:42 ` [PULL 28/30] softmmu/memory_mapping: never merge ranges accross memory regions Paolo Bonzini
2021-10-03 7:42 ` [PULL 29/30] softmmu/memory_mapping: factor out adding physical memory ranges Paolo Bonzini
2021-10-03 7:42 ` [PULL 30/30] softmmu/memory_mapping: optimize for RamDiscardManager sections Paolo Bonzini
2021-10-03 14:44 ` [PULL 00/30] Misc changes for 2021-10-03 Philippe Mathieu-Daudé
2021-10-03 15:12 ` Richard Henderson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20211003074250.60869-10-pbonzini@redhat.com \
--to=pbonzini@redhat.com \
--cc=berrange@redhat.com \
--cc=cohuck@redhat.com \
--cc=david@gibson.dropbear.id.au \
--cc=drjones@redhat.com \
--cc=pankaj.gupta@ionos.com \
--cc=qemu-devel@nongnu.org \
--cc=wangyanan55@huawei.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).