On Mon, Jul 19, 2021 at 11:20:33AM +0800, Yanan Wang wrote: > In the SMP configuration, we should either specify a topology > parameter with a reasonable value (equal to or greater than 1) > or just leave it omitted and QEMU will calculate its value. > > Configurations which explicitly specify the topology parameters > as zero like "sockets=0" are meaningless, so disallow them. > > Suggested-by: Andrew Jones <drjo...@redhat.com> > Signed-off-by: Yanan Wang <wangyana...@huawei.com> > --- > hw/core/machine.c | 31 +++++++++++++++++++++++-------- > hw/i386/pc.c | 29 +++++++++++++++++++++-------- > qapi/machine.json | 4 ++-- > 3 files changed, 46 insertions(+), 18 deletions(-) > > diff --git a/hw/core/machine.c b/hw/core/machine.c > index 775add0795..d73daa10f4 100644 > --- a/hw/core/machine.c > +++ b/hw/core/machine.c > @@ -745,11 +745,25 @@ static void smp_parse(MachineState *ms, > SMPConfiguration *config, Error **errp) > { > unsigned cpus = config->has_cpus ? config->cpus : 0; > unsigned sockets = config->has_sockets ? config->sockets : 0; > + unsigned dies = config->has_dies ? config->dies : 1;
It looks odd to set dies=1 by default at initially, when everything else is set to 0. I realize you're just copying existing pc_smp_parse code in this respect, but I feel like could benefit from a separate initialization with a comment to explain why we're hardcoding it to 1.... > unsigned cores = config->has_cores ? config->cores : 0; > unsigned threads = config->has_threads ? config->threads : 0; > + unsigned maxcpus = config->has_maxcpus ? config->maxcpus : 0; > + > + if ((config->has_cpus && config->cpus == 0) || > + (config->has_sockets && config->sockets == 0) || > + (config->has_dies && config->dies == 0) || > + (config->has_cores && config->cores == 0) || > + (config->has_threads && config->threads == 0) || > + (config->has_maxcpus && config->maxcpus == 0)) { > + error_setg(errp, "parameters must be equal to or greater than one" > + "if provided"); > + return; > + } > > - if (config->has_dies && config->dies != 0 && config->dies != 1) { > + if (dies > 1) { > error_setg(errp, "dies not supported by this machine's CPU > topology"); > + return; > } .... eg how about here adding /* Never try to assign multiple dies when defaulting omitted topology */ if (dies == 0) { dies = 1; } > diff --git a/qapi/machine.json b/qapi/machine.json > index c3210ee1fb..c11b2e6f73 100644 > --- a/qapi/machine.json > +++ b/qapi/machine.json > @@ -1288,8 +1288,8 @@ > ## > # @SMPConfiguration: > # > -# Schema for CPU topology configuration. "0" or a missing value lets > -# QEMU figure out a suitable value based on the ones that are provided. > +# Schema for CPU topology configuration. A missing value lets QEMU > +# figure out a suitable value based on the ones that are provided. Hmm, so we had actually documented that '0' had the same semantics as omitting a parameter. This was done in: commit 1e63fe685804dfadddd643bf3860b1a59702d4bf Author: Paolo Bonzini <pbonz...@redhat.com> Date: Thu Jun 17 17:53:06 2021 +0200 machine: pass QAPI struct to mc->smp_parse which hasn't been released yet. This was possible, but never documented, with the traditiaonl -smp impl before it was qapi-ified. I think that historical behaviour was simply a side effect of the QemuOpts impl rather than an intentional design, hence not documented. At the very least I think need to get rid of this bit of docs about "0" before this release, otherwise we'll have stronger need to consider a real deprecation process. Regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|