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) +{ + 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) { + error_report("cpu topology: " + "sockets (%u), cores (%u) or number of CPU(%u) " + "can not be zero", sockets, cores, cpus); + exit(1); + } + } + + ms->smp.max_cpus = qemu_opt_get_number(opts, "maxcpus", cpus); + if (ms->smp.max_cpus < cpus) { + error_report("maxcpus must be equal to or greater than smp"); + exit(1); + } + + if (!qemu_opt_find(opts, "cores")) { + cores = ms->smp.max_cpus / sockets; + } + + if (sockets * cores != ms->smp.max_cpus) { + error_report("Invalid CPU topology: sockets (%u) * cores (%u) " + "!= maxcpus (%u)", sockets, cores, ms->smp.max_cpus); + exit(1); + } + + ms->smp.threads = 1; + ms->smp.cpus = cpus; + ms->smp.cores = cores; + ms->smp.sockets = sockets; +} + static void ccw_machine_class_init(ObjectClass *oc, void *data) { MachineClass *mc = MACHINE_CLASS(oc); @@ -612,6 +653,7 @@ static void ccw_machine_class_init(ObjectClass *oc, void *data) hc->unplug_request = s390_machine_device_unplug_request; nc->nmi_monitor_handler = s390_nmi; mc->default_ram_id = "s390.ram"; + mc->smp_parse = s390_smp_parse; } static inline bool machine_get_aes_key_wrap(Object *obj, Error **errp) -- 2.25.1