aboutsummaryrefslogtreecommitdiff
path: root/hw/core
diff options
context:
space:
mode:
authorYanan Wang <wangyanan55@huawei.com>2021-09-29 10:58:05 +0800
committerPaolo Bonzini <pbonzini@redhat.com>2021-10-01 15:27:56 +0200
commit7d8c5a39628820f6927b8b70c8f54872f5d1a196 (patch)
tree0e2713d9bb3fc3c2e49f852c52c039aed0b7819c /hw/core
parent9a52b508061163df4dae05e708cd2a9cd790ad04 (diff)
downloadqemu-7d8c5a39628820f6927b8b70c8f54872f5d1a196.zip
qemu-7d8c5a39628820f6927b8b70c8f54872f5d1a196.tar.gz
qemu-7d8c5a39628820f6927b8b70c8f54872f5d1a196.tar.bz2
machine: Set the value of cpus to match maxcpus if it's omitted
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>
Diffstat (limited to 'hw/core')
-rw-r--r--hw/core/machine.c29
1 files changed, 16 insertions, 13 deletions
diff --git a/hw/core/machine.c b/hw/core/machine.c
index 596e758..d8f458db 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) < "