machine: Uniformly use maxcpus to calculate the omitted parameters
We are currently using maxcpus to calculate the omitted sockets but using cpus to calculate the omitted cores/threads. This makes cmdlines like: -smp cpus=8,maxcpus=16 -smp cpus=8,cores=4,maxcpus=16 -smp cpus=8,threads=2,maxcpus=16 work fine but the ones like: -smp cpus=8,sockets=2,maxcpus=16 -smp cpus=8,sockets=2,cores=4,maxcpus=16 -smp cpus=8,sockets=2,threads=2,maxcpus=16 break the sanity check. Since we require for a valid config that the product of "sockets * cores * threads" should equal to the maxcpus, we should uniformly use maxcpus to calculate their omitted values. Also the if-branch of "cpus == 0 || sockets == 0" was split into two branches of "cpus == 0" and "sockets == 0" so that we can clearly read that we are parsing the configuration with a preference on cpus over sockets over cores over threads. Note: change in this patch won't affect any existing working cmdlines but improves consistency and allows more incomplete configs to be valid. Signed-off-by: Yanan Wang <wangyanan55@huawei.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-5-wangyanan55@huawei.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
5d8b5a5055
commit
9a52b50806
@ -760,24 +760,26 @@ static void smp_parse(MachineState *ms, SMPConfiguration *config, Error **errp)
|
||||
}
|
||||
|
||||
/* compute missing values, prefer sockets over cores over threads */
|
||||
if (cpus == 0 || sockets == 0) {
|
||||
cores = cores > 0 ? cores : 1;
|
||||
threads = threads > 0 ? threads : 1;
|
||||
maxcpus = maxcpus > 0 ? maxcpus : cpus;
|
||||
|
||||
if (cpus == 0) {
|
||||
sockets = sockets > 0 ? sockets : 1;
|
||||
cpus = cores * threads * sockets;
|
||||
} else {
|
||||
cores = cores > 0 ? cores : 1;
|
||||
threads = threads > 0 ? threads : 1;
|
||||
cpus = sockets * cores * threads;
|
||||
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 = cpus / (sockets * threads);
|
||||
cores = cores > 0 ? cores : 1;
|
||||
cores = maxcpus / (sockets * threads);
|
||||
} else if (threads == 0) {
|
||||
threads = cpus / (cores * sockets);
|
||||
threads = threads > 0 ? threads : 1;
|
||||
} else if (sockets * cores * threads < cpus) {
|
||||
threads = maxcpus / (sockets * cores);
|
||||
}
|
||||
|
||||
if (sockets * cores * threads < cpus) {
|
||||
error_setg(errp, "cpu topology: "
|
||||
"sockets (%u) * cores (%u) * threads (%u) < "
|
||||
"smp_cpus (%u)",
|
||||
@ -785,8 +787,6 @@ static void smp_parse(MachineState *ms, SMPConfiguration *config, Error **errp)
|
||||
return;
|
||||
}
|
||||
|
||||
maxcpus = maxcpus > 0 ? maxcpus : cpus;
|
||||
|
||||
if (maxcpus < cpus) {
|
||||
error_setg(errp, "maxcpus must be equal to or greater than smp");
|
||||
return;
|
||||
|
26
hw/i386/pc.c
26
hw/i386/pc.c
@ -727,24 +727,26 @@ 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 */
|
||||
if (cpus == 0 || sockets == 0) {
|
||||
cores = cores > 0 ? cores : 1;
|
||||
threads = threads > 0 ? threads : 1;
|
||||
maxcpus = maxcpus > 0 ? maxcpus : cpus;
|
||||
|
||||
if (cpus == 0) {
|
||||
sockets = sockets > 0 ? sockets : 1;
|
||||
cpus = cores * threads * dies * sockets;
|
||||
} else {
|
||||
cores = cores > 0 ? cores : 1;
|
||||
threads = threads > 0 ? threads : 1;
|
||||
cpus = sockets * dies * cores * threads;
|
||||
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 = cpus / (sockets * dies * threads);
|
||||
cores = cores > 0 ? cores : 1;
|
||||
cores = maxcpus / (sockets * dies * threads);
|
||||
} else if (threads == 0) {
|
||||
threads = cpus / (cores * dies * sockets);
|
||||
threads = threads > 0 ? threads : 1;
|
||||
} else if (sockets * dies * cores * threads < cpus) {
|
||||
threads = maxcpus / (sockets * dies * cores);
|
||||
}
|
||||
|
||||
if (sockets * dies * cores * threads < cpus) {
|
||||
error_setg(errp, "cpu topology: "
|
||||
"sockets (%u) * dies (%u) * cores (%u) * threads (%u) < "
|
||||
"smp_cpus (%u)",
|
||||
@ -752,8 +754,6 @@ static void pc_smp_parse(MachineState *ms, SMPConfiguration *config, Error **err
|
||||
return;
|
||||
}
|
||||
|
||||
maxcpus = maxcpus > 0 ? maxcpus : cpus;
|
||||
|
||||
if (maxcpus < cpus) {
|
||||
error_setg(errp, "maxcpus must be equal to or greater than smp");
|
||||
return;
|
||||
|
Loading…
Reference in New Issue
Block a user