On 8/23/21 2:27 PM, Yanan Wang wrote: > We have two requirements for a valid SMP configuration: > the product of "sockets * cores * threads" must represent all the > possible cpus, i.e., max_cpus, and then must include the initially > present cpus, i.e., smp_cpus. > > So we only need to ensure 1) "sockets * cores * threads == maxcpus" > at first and then ensure 2) "maxcpus >= cpus". With a reasonable > order of the sanity check, we can simplify the error reporting code. > When reporting an error message we also report the exact value of > each topology member to make users easily see what's going on. > > Signed-off-by: Yanan Wang <wangyana...@huawei.com> > Reviewed-by: Andrew Jones <drjo...@redhat.com> > Reviewed-by: Pankaj Gupta <pankaj.gu...@ionos.com> > --- > hw/core/machine.c | 22 +++++++++------------- > hw/i386/pc.c | 24 ++++++++++-------------- > 2 files changed, 19 insertions(+), 27 deletions(-) > > diff --git a/hw/core/machine.c b/hw/core/machine.c > index 85908abc77..093c0d382d 100644 > --- a/hw/core/machine.c > +++ b/hw/core/machine.c > @@ -779,25 +779,21 @@ static void smp_parse(MachineState *ms, > SMPConfiguration *config, Error **errp) > 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) < " > - "smp_cpus (%u)", > - sockets, cores, threads, cpus); > + if (sockets * cores * threads != maxcpus) { > + error_setg(errp, "Invalid CPU topology: " > + "product of the hierarchy must match maxcpus: " > + "sockets (%u) * cores (%u) * threads (%u) " > + "!= maxcpus (%u)", > + sockets, cores, threads, maxcpus); > return; > }
Thinking about scalability, MachineClass could have a parse_cpu_topology() handler, and this would be the generic one. Principally because architectures don't use the same terms, and die/socket/core/thread arrangement is machine specific (besides being arch-spec). Not a problem as of today, but the way we try to handle this generically seems over-engineered to me. [unrelated to this particular patch]