On Fri, Jul 16, 2021 at 10:54:08AM +0200, Cornelia Huck wrote: > On Wed, Jul 14 2021, Pierre Morel <pmo...@linux.ibm.com> wrote: > > > We need a s390x dedicated SMP parsing to handle s390x specificities. > > > > In this patch we only handle threads, cores and sockets for > > s390x: > > - do not support threads, we always have 1 single thread per core > > - the sockets are filled one after the other with the cores > > > > Both these handlings are different from the standard smp_parse > > functionement and reflect the CPU topology in the simple case > > where all CPU belong to the same book. > > > > Topology levels above sockets, i.e. books, drawers, are not > > considered at this stage and will be introduced in a later patch. > > > > Signed-off-by: Pierre Morel <pmo...@linux.ibm.com> > > --- > > hw/s390x/s390-virtio-ccw.c | 42 ++++++++++++++++++++++++++++++++++++++ > > 1 file changed, 42 insertions(+) > > > > diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c > > index e4b18aef49..899d3a4137 100644 > > --- a/hw/s390x/s390-virtio-ccw.c > > +++ b/hw/s390x/s390-virtio-ccw.c > > @@ -582,6 +582,47 @@ static ram_addr_t s390_fixup_ram_size(ram_addr_t sz) > > return newsz; > > } > > > > +/* > > + * In S390CCW machine we do not support threads for now, > > + * only sockets and cores. > > + */ > > +static void s390_smp_parse(MachineState *ms, QemuOpts *opts) > > It seems you based this on an older version of the code? The current > signature of this function since 1e63fe685804 ("machine: pass QAPI > struct to mc->smp_parse") is > > void (*smp_parse)(MachineState *ms, SMPConfiguration *config, Error **errp); > > That affects your parsing, and also lets you get rid of the ugly exit(1) > statements. > > > +{ > > + unsigned cpus = qemu_opt_get_number(opts, "cpus", 1); > > + unsigned sockets = qemu_opt_get_number(opts, "sockets", 1); > > + unsigned cores = qemu_opt_get_number(opts, "cores", 1); > > + > > + if (opts) { > > + if (cpus == 0 || sockets == 0 || cores == 0) { > > This behaviour looks different from what we do for other targets: if you > specify the value as 0, a value is calculated from the other values; > here, you error out. It's probably not a good idea to differ.
I increasingly worry that we're making a mistake by going down the route of having custom smp_parse implementations per target, as this is showing signs of inconsistent behaviour and error reportings. I think the differences / restrictions have granularity at a different level that is being tested in many cases too. Whether threads != 1 is valid will likely vary depending on what CPU model is chosen, rather than what architecture is chosen. The same is true for dies != 1. We're not really checking this closely even in x86 - for example I can request nonsense such as a 25 year old i486 CPU model with hyperthreading and multiple dies qemu-system-x86_64 -cpu 486 -smp 16,cores=4,dies=2,threads=2 In this patch, there is no error reporting if the user specifies dies != 1 or threads != 1 - it just silently ignores the request which is not good. Some machine types may have constraints on CPU sockets. This can of course all be handled by custom smp_parse impls, but this is ultimately going to lead to alot of duplicated and inconsistent logic I fear. I wonder if we would be better off having machine class callback that can report topology constraints for the current configuration, along lines of smp_constraints(MachineState *ms, int *max_sockets, int *max_dies, int *max_cores, int *max_threads) And then have only a single smp_parse impl that takes into account these constraints, to report errors / fill in missing fields / etc ? 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 :|