Message ID | 20170913132417.24384-12-david@redhat.com |
---|---|
State | New |
Headers | show |
Series | s390x cleanups and CPU hotplug via device_add | expand |
On Wed, 13 Sep 2017 15:24:06 +0200 David Hildenbrand <david@redhat.com> wrote: > Specifying more than 1 CPU (e.g. -smp 5) leads to SIGP errors (the > guest tries to bring these CPUs up but fails), because we don't support > multiple CPUs on s390x under TCG. > > Let's bail out if more than 1 is specified, so we don't raise people's > hope. > > Tested-by: Matthew Rosato <mjrosato@linux.vnet.ibm.com> > Signed-off-by: David Hildenbrand <david@redhat.com> Reviewed-by: Igor Mammedov <imammedo@redhat.com> > --- > hw/s390x/s390-virtio-ccw.c | 6 ++++++ > 1 file changed, 6 insertions(+) > > diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c > index f67b4b5d58..417998ec28 100644 > --- a/hw/s390x/s390-virtio-ccw.c > +++ b/hw/s390x/s390-virtio-ccw.c > @@ -23,6 +23,7 @@ > #include "hw/s390x/css.h" > #include "virtio-ccw.h" > #include "qemu/config-file.h" > +#include "qemu/error-report.h" > #include "s390-pci-bus.h" > #include "hw/s390x/storage-keys.h" > #include "hw/s390x/storage-attributes.h" > @@ -55,6 +56,11 @@ static void s390_init_cpus(MachineState *machine) > if (machine->cpu_model == NULL) { > machine->cpu_model = s390_default_cpu_model_name(); > } > + if (tcg_enabled() && max_cpus > 1) { > + error_report("Number of SMP CPUs requested (%d) exceeds max CPUs " > + "supported by TCG (1) on s390x", max_cpus); > + exit(1); > + } > > cpu_states = g_new0(S390CPU *, max_cpus); >
David Hildenbrand <david@redhat.com> writes: > Specifying more than 1 CPU (e.g. -smp 5) leads to SIGP errors (the > guest tries to bring these CPUs up but fails), because we don't support > multiple CPUs on s390x under TCG. > > Let's bail out if more than 1 is specified, so we don't raise people's > hope. Why does this restriction exist? Without MTTCG enabled -smp > 1 should be safe from any races. > > Tested-by: Matthew Rosato <mjrosato@linux.vnet.ibm.com> > Signed-off-by: David Hildenbrand <david@redhat.com> > --- > hw/s390x/s390-virtio-ccw.c | 6 ++++++ > 1 file changed, 6 insertions(+) > > diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c > index f67b4b5d58..417998ec28 100644 > --- a/hw/s390x/s390-virtio-ccw.c > +++ b/hw/s390x/s390-virtio-ccw.c > @@ -23,6 +23,7 @@ > #include "hw/s390x/css.h" > #include "virtio-ccw.h" > #include "qemu/config-file.h" > +#include "qemu/error-report.h" > #include "s390-pci-bus.h" > #include "hw/s390x/storage-keys.h" > #include "hw/s390x/storage-attributes.h" > @@ -55,6 +56,11 @@ static void s390_init_cpus(MachineState *machine) > if (machine->cpu_model == NULL) { > machine->cpu_model = s390_default_cpu_model_name(); > } > + if (tcg_enabled() && max_cpus > 1) { > + error_report("Number of SMP CPUs requested (%d) exceeds max CPUs " > + "supported by TCG (1) on s390x", max_cpus); > + exit(1); > + } > > cpu_states = g_new0(S390CPU *, max_cpus); -- Alex Bennée
On 13.09.2017 18:13, Alex Bennée wrote: > > David Hildenbrand <david@redhat.com> writes: > >> Specifying more than 1 CPU (e.g. -smp 5) leads to SIGP errors (the >> guest tries to bring these CPUs up but fails), because we don't support >> multiple CPUs on s390x under TCG. >> >> Let's bail out if more than 1 is specified, so we don't raise people's >> hope. > > Why does this restriction exist? Without MTTCG enabled -smp > 1 should > be safe from any races. Because the actual SIGP code (instruction to start/stop ... CPUs) is not implemented yet.
David Hildenbrand <david@redhat.com> writes: > On 13.09.2017 18:13, Alex Bennée wrote: >> >> David Hildenbrand <david@redhat.com> writes: >> >>> Specifying more than 1 CPU (e.g. -smp 5) leads to SIGP errors (the >>> guest tries to bring these CPUs up but fails), because we don't support >>> multiple CPUs on s390x under TCG. >>> >>> Let's bail out if more than 1 is specified, so we don't raise people's >>> hope. >> >> Why does this restriction exist? Without MTTCG enabled -smp > 1 should >> be safe from any races. > > Because the actual SIGP code (instruction to start/stop ... CPUs) is not > implemented yet. Ahh OK, I assume something like ARM's PCSI interface then. When you do get around to implementing just ensure you use the async mechanism to initialise the target processor state to avoid races in MTTCG. Essentially you queue the work up on the target and then it is run before the powered up vCPU starts running code. -- Alex Bennée
On 15.09.2017 15:17, Alex Bennée wrote: > > David Hildenbrand <david@redhat.com> writes: > >> On 13.09.2017 18:13, Alex Bennée wrote: >>> >>> David Hildenbrand <david@redhat.com> writes: >>> >>>> Specifying more than 1 CPU (e.g. -smp 5) leads to SIGP errors (the >>>> guest tries to bring these CPUs up but fails), because we don't support >>>> multiple CPUs on s390x under TCG. >>>> >>>> Let's bail out if more than 1 is specified, so we don't raise people's >>>> hope. >>> >>> Why does this restriction exist? Without MTTCG enabled -smp > 1 should >>> be safe from any races. >> >> Because the actual SIGP code (instruction to start/stop ... CPUs) is not >> implemented yet. > > Ahh OK, I assume something like ARM's PCSI interface then. > > When you do get around to implementing just ensure you use the async > mechanism to initialise the target processor state to avoid races in > MTTCG. Essentially you queue the work up on the target and then it is > run before the powered up vCPU starts running code. One step at a time, right now I only test with single threaded. MTTCG is the next step. But I have a good feeling about mttcg, at least speaking about the SIGP implementation (for the "critical" stuff - start, stop, initialize - I reuse the KVM code which uses even sync work). > > -- > Alex Bennée >
diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c index f67b4b5d58..417998ec28 100644 --- a/hw/s390x/s390-virtio-ccw.c +++ b/hw/s390x/s390-virtio-ccw.c @@ -23,6 +23,7 @@ #include "hw/s390x/css.h" #include "virtio-ccw.h" #include "qemu/config-file.h" +#include "qemu/error-report.h" #include "s390-pci-bus.h" #include "hw/s390x/storage-keys.h" #include "hw/s390x/storage-attributes.h" @@ -55,6 +56,11 @@ static void s390_init_cpus(MachineState *machine) if (machine->cpu_model == NULL) { machine->cpu_model = s390_default_cpu_model_name(); } + if (tcg_enabled() && max_cpus > 1) { + error_report("Number of SMP CPUs requested (%d) exceeds max CPUs " + "supported by TCG (1) on s390x", max_cpus); + exit(1); + } cpu_states = g_new0(S390CPU *, max_cpus);