diff mbox

[v2,11/19] s390x: allow only 1 CPU with TCG

Message ID 20170904154316.4148-12-david@redhat.com (mailing list archive)
State New, archived
Headers show

Commit Message

David Hildenbrand Sept. 4, 2017, 3:43 p.m. UTC
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. Make it a define, so we can easily bump it up later.

Signed-off-by: David Hildenbrand <david@redhat.com>
---
 hw/s390x/s390-virtio-ccw.c | 7 +++++++
 target/s390x/cpu.h         | 2 ++
 2 files changed, 9 insertions(+)

Comments

Matthew Rosato Sept. 6, 2017, 6:16 p.m. UTC | #1
On 09/04/2017 11:43 AM, David Hildenbrand 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. Make it a define, so we can easily bump it up later.
> 
> Signed-off-by: David Hildenbrand <david@redhat.com>
> ---

Makes sense.  Ran the described environment without this patch (errors)
and again with this patch (graceful exit w/ message).

Tested-by: Matthew Rosato <mjrosato@linux.vnet.ibm.com>

>  hw/s390x/s390-virtio-ccw.c | 7 +++++++
>  target/s390x/cpu.h         | 2 ++
>  2 files changed, 9 insertions(+)
> 
> diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
> index f67b4b5d58..f7ca20d77a 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,12 @@ 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 > S390_TCG_MAX_CPUS) {
> +        error_report("Number of SMP CPUs requested (%d) exceeds max CPUs "
> +                     "supported by TCG (%d) on s390x", max_cpus,
> +                     S390_TCG_MAX_CPUS);
> +        exit(1);
> +    }
> 
>      cpu_states = g_new0(S390CPU *, max_cpus);
> 
> diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h
> index 147aceba28..dca6aa9aae 100644
> --- a/target/s390x/cpu.h
> +++ b/target/s390x/cpu.h
> @@ -209,6 +209,8 @@ static inline S390CPU *s390_env_get_cpu(CPUS390XState *env)
> 
>  #define ENV_OFFSET offsetof(S390CPU, env)
> 
> +#define S390_TCG_MAX_CPUS 1
> +
>  #ifndef CONFIG_USER_ONLY
>  extern const struct VMStateDescription vmstate_s390_cpu;
>  #endif
>
Richard Henderson Sept. 6, 2017, 9:20 p.m. UTC | #2
On 09/06/2017 11:16 AM, Matthew Rosato wrote:
> On 09/04/2017 11:43 AM, David Hildenbrand 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. Make it a define, so we can easily bump it up later.
>>
>> Signed-off-by: David Hildenbrand <david@redhat.com>
>> ---
> 
> Makes sense.  Ran the described environment without this patch (errors)
> and again with this patch (graceful exit w/ message).
> 
> Tested-by: Matthew Rosato <mjrosato@linux.vnet.ibm.com>

Can someone review

  http://patchwork.ozlabs.org/patch/760010/

which does at least start to add the SIGP support.

Once tcg can bring up 2 cpus, I see no reason it couldn't bring up N.  I don't
see the point of the define.


r~
David Hildenbrand Sept. 7, 2017, 12:49 p.m. UTC | #3
On 06.09.2017 23:20, Richard Henderson wrote:
> On 09/06/2017 11:16 AM, Matthew Rosato wrote:
>> On 09/04/2017 11:43 AM, David Hildenbrand 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. Make it a define, so we can easily bump it up later.
>>>
>>> Signed-off-by: David Hildenbrand <david@redhat.com>
>>> ---
>>
>> Makes sense.  Ran the described environment without this patch (errors)
>> and again with this patch (graceful exit w/ message).
>>
>> Tested-by: Matthew Rosato <mjrosato@linux.vnet.ibm.com>
> 
> Can someone review
> 
>   http://patchwork.ozlabs.org/patch/760010/
> 

Yes, we also discovered that patch during review of v1.

> which does at least start to add the SIGP support.
> 
> Once tcg can bring up 2 cpus, I see no reason it couldn't bring up N.  I don't
> see the point of the define.
> 

Conny requested a define. So it boils down to

a) no define just as in v1
b) a define like S390_TCG_SMP_SUPPORTED

What do you suggest?

> 
> r~
>
Cornelia Huck Sept. 7, 2017, 12:51 p.m. UTC | #4
On Thu, 7 Sep 2017 14:49:49 +0200
David Hildenbrand <david@redhat.com> wrote:

> On 06.09.2017 23:20, Richard Henderson wrote:
> > On 09/06/2017 11:16 AM, Matthew Rosato wrote:  
> >> On 09/04/2017 11:43 AM, David Hildenbrand 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. Make it a define, so we can easily bump it up later.
> >>>
> >>> Signed-off-by: David Hildenbrand <david@redhat.com>
> >>> ---  
> >>
> >> Makes sense.  Ran the described environment without this patch (errors)
> >> and again with this patch (graceful exit w/ message).
> >>
> >> Tested-by: Matthew Rosato <mjrosato@linux.vnet.ibm.com>  
> > 
> > Can someone review
> > 
> >   http://patchwork.ozlabs.org/patch/760010/
> >   
> 
> Yes, we also discovered that patch during review of v1.
> 
> > which does at least start to add the SIGP support.
> > 
> > Once tcg can bring up 2 cpus, I see no reason it couldn't bring up N.  I don't
> > see the point of the define.
> >   
> 
> Conny requested a define. So it boils down to
> 
> a) no define just as in v1
> b) a define like S390_TCG_SMP_SUPPORTED
> 
> What do you suggest?

FWIW, I'd prefer b).

> 
> > 
> > r~
> >   
> 
>
David Hildenbrand Sept. 14, 2017, 6:13 p.m. UTC | #5
On 06.09.2017 23:20, Richard Henderson wrote:
> On 09/06/2017 11:16 AM, Matthew Rosato wrote:
>> On 09/04/2017 11:43 AM, David Hildenbrand 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. Make it a define, so we can easily bump it up later.
>>>
>>> Signed-off-by: David Hildenbrand <david@redhat.com>
>>> ---
>>
>> Makes sense.  Ran the described environment without this patch (errors)
>> and again with this patch (graceful exit w/ message).
>>
>> Tested-by: Matthew Rosato <mjrosato@linux.vnet.ibm.com>
> 
> Can someone review
> 
>   http://patchwork.ozlabs.org/patch/760010/
> 
> which does at least start to add the SIGP support.

FWIW, I started factoring out today KVM SIGP code to make it usable by TCG.

I also started adding the missing SIGP instructions the kernel handles
for KVM. I dropped the old TCG SIGP handling code and completely reuse
the new SIGP code. I already got boot/reboot/shutdown  properly running
(implementing STOP and RESTART interrupts like KVM has).

But its still quite hacky and there are is a bunch of stuff to clean up,
especially:
- external interrupt handling (the queue approach we have right now is
  no good for external calls and emergency signals)
- floating interrupt support (io interrupts always going to CPU 0 is a
  hack)

I think I can at least implement SIGP properly and fix the external call
stuff. floating interrupts might require more thought.

Aurelien, please tell me if you are currently still working on this, so
we can coordinate.

Thanks!

> 
> Once tcg can bring up 2 cpus, I see no reason it couldn't bring up N.  I don't
> see the point of the define.
> 
> 
> r~
>
diff mbox

Patch

diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
index f67b4b5d58..f7ca20d77a 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,12 @@  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 > S390_TCG_MAX_CPUS) {
+        error_report("Number of SMP CPUs requested (%d) exceeds max CPUs "
+                     "supported by TCG (%d) on s390x", max_cpus,
+                     S390_TCG_MAX_CPUS);
+        exit(1);
+    }
 
     cpu_states = g_new0(S390CPU *, max_cpus);
 
diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h
index 147aceba28..dca6aa9aae 100644
--- a/target/s390x/cpu.h
+++ b/target/s390x/cpu.h
@@ -209,6 +209,8 @@  static inline S390CPU *s390_env_get_cpu(CPUS390XState *env)
 
 #define ENV_OFFSET offsetof(S390CPU, env)
 
+#define S390_TCG_MAX_CPUS 1
+
 #ifndef CONFIG_USER_ONLY
 extern const struct VMStateDescription vmstate_s390_cpu;
 #endif