All of lore.kernel.org
 help / color / mirror / Atom feed
From: Paolo Bonzini <pbonzini@redhat.com>
To: qemu-devel@nongnu.org
Cc: "Yanan Wang" <wangyanan55@huawei.com>,
	"Andrew Jones" <drjones@redhat.com>,
	"Daniel P . Berrangé" <berrange@redhat.com>
Subject: [PULL 05/30] machine: Set the value of cpus to match maxcpus if it's omitted
Date: Sun,  3 Oct 2021 09:42:25 +0200	[thread overview]
Message-ID: <20211003074250.60869-6-pbonzini@redhat.com> (raw)
In-Reply-To: <20211003074250.60869-1-pbonzini@redhat.com>

From: Yanan Wang <wangyanan55@huawei.com>

Currently we directly calculate the omitted cpus based on the given
incomplete collection of parameters. This makes some cmdlines like:
  -smp maxcpus=16
  -smp sockets=2,maxcpus=16
  -smp sockets=2,dies=2,maxcpus=16
  -smp sockets=2,cores=4,maxcpus=16
not work. We should probably set the value of cpus to match maxcpus
if it's omitted, which will make above configs start to work.

So the calculation logic of cpus/maxcpus after this patch will be:
When both maxcpus and cpus are omitted, maxcpus will be calculated
from the given parameters and cpus will be set equal to maxcpus.
When only one of maxcpus and cpus is given then the omitted one
will be set to its counterpart's value. Both maxcpus and cpus may
be specified, but maxcpus must be equal to or greater than cpus.

Note: change in this patch won't affect any existing working cmdlines
but allows more incomplete configs to be valid.

Signed-off-by: Yanan Wang <wangyanan55@huawei.com>
Reviewed-by: Andrew Jones <drjones@redhat.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Message-Id: <20210929025816.21076-6-wangyanan55@huawei.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 hw/core/machine.c | 29 ++++++++++++++++-------------
 hw/i386/pc.c      | 29 ++++++++++++++++-------------
 qemu-options.hx   | 11 ++++++++---
 3 files changed, 40 insertions(+), 29 deletions(-)

diff --git a/hw/core/machine.c b/hw/core/machine.c
index 596e758133..d8f458db60 100644
--- a/hw/core/machine.c
+++ b/hw/core/machine.c
@@ -760,25 +760,28 @@ static void smp_parse(MachineState *ms, SMPConfiguration *config, Error **errp)
     }
 
     /* compute missing values, prefer sockets over cores over threads */
-    maxcpus = maxcpus > 0 ? maxcpus : cpus;
-
-    if (cpus == 0) {
+    if (cpus == 0 && maxcpus == 0) {
         sockets = sockets > 0 ? sockets : 1;
         cores = cores > 0 ? cores : 1;
         threads = threads > 0 ? threads : 1;
-        cpus = sockets * cores * threads;
+    } else {
         maxcpus = maxcpus > 0 ? maxcpus : cpus;
-    } else 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) {
-        threads = maxcpus / (sockets * cores);
+
+        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) {
+            threads = maxcpus / (sockets * cores);
+        }
     }
 
+    maxcpus = maxcpus > 0 ? maxcpus : sockets * cores * threads;
+    cpus = cpus > 0 ? cpus : maxcpus;
+
     if (sockets * cores * threads < cpus) {
         error_setg(errp, "cpu topology: "
                    "sockets (%u) * cores (%u) * threads (%u) < "
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index e37e84cc7b..f24a1d72ad 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -727,25 +727,28 @@ static void pc_smp_parse(MachineState *ms, SMPConfiguration *config, Error **err
     dies = dies > 0 ? dies : 1;
 
     /* compute missing values, prefer sockets over cores over threads */
-    maxcpus = maxcpus > 0 ? maxcpus : cpus;
-
-    if (cpus == 0) {
+    if (cpus == 0 && maxcpus == 0) {
         sockets = sockets > 0 ? sockets : 1;
         cores = cores > 0 ? cores : 1;
         threads = threads > 0 ? threads : 1;
-        cpus = sockets * dies * cores * threads;
+    } else {
         maxcpus = maxcpus > 0 ? maxcpus : cpus;
-    } else 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) {
-        threads = maxcpus / (sockets * dies * cores);
+
+        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) {
+            threads = maxcpus / (sockets * dies * cores);
+        }
     }
 
+    maxcpus = maxcpus > 0 ? maxcpus : sockets * dies * cores * threads;
+    cpus = cpus > 0 ? cpus : maxcpus;
+
     if (sockets * dies * cores * threads < cpus) {
         error_setg(errp, "cpu topology: "
                    "sockets (%u) * dies (%u) * cores (%u) * threads (%u) < "
diff --git a/qemu-options.hx b/qemu-options.hx
index 4a092a092a..2eac830fdb 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -220,9 +220,14 @@ SRST
     Simulate a SMP system with '\ ``n``\ ' CPUs initially present on
     the machine type board. On boards supporting CPU hotplug, the optional
     '\ ``maxcpus``\ ' parameter can be set to enable further CPUs to be
-    added at runtime. If omitted the maximum number of CPUs will be
-    set to match the initial CPU count. Both parameters are subject to
-    an upper limit that is determined by the specific machine type chosen.
+    added at runtime. When both parameters are omitted, the maximum number
+    of CPUs will be calculated from the provided topology members and the
+    initial CPU count will match the maximum number. When only one of them
+    is given then the omitted one will be set to its counterpart's value.
+    Both parameters may be specified, but the maximum number of CPUs must
+    be equal to or greater than the initial CPU count. Both parameters are
+    subject to an upper limit that is determined by the specific machine
+    type chosen.
 
     To control reporting of CPU topology information, the number of sockets,
     dies per socket, cores per die, and threads per core can be specified.
-- 
2.31.1




  parent reply	other threads:[~2021-10-03  7:49 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 ` Paolo Bonzini [this message]
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 ` [PULL 09/30] machine: Prefer cores over sockets in smp parsing since 6.2 Paolo Bonzini
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-6-pbonzini@redhat.com \
    --to=pbonzini@redhat.com \
    --cc=berrange@redhat.com \
    --cc=drjones@redhat.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.