diff mbox series

[v3] target/s390x/kvm: Enable adapter interruption suppression again

Message ID 20200120132441.11884-1-thuth@redhat.com (mailing list archive)
State New, archived
Headers show
Series [v3] target/s390x/kvm: Enable adapter interruption suppression again | expand

Commit Message

Thomas Huth Jan. 20, 2020, 1:24 p.m. UTC
The AIS feature has been disabled late in the v2.10 development cycle since
there were some issues with migration (see commit 3f2d07b3b01ea61126b -
"s390x/ais: for 2.10 stable: disable ais facility"). We originally wanted
to enable it again for newer machine types, but apparently we forgot to do
this so far. Let's do it for the new s390-ccw-virtio-5.0 machine now.

While at it, also add a more verbose comment why we need the *_allowed()
wrappers in s390-virtio-ccw.c.

Buglink: https://bugzilla.redhat.com/show_bug.cgi?id=1756946
Reviewed-by: David Hildenbrand <david@redhat.com>
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
 v3: Moved "s390mc->kvm_ais_allowed = false" to the end of the function

 hw/s390x/s390-virtio-ccw.c         | 20 +++++++++++++++++---
 include/hw/s390x/s390-virtio-ccw.h |  3 +++
 target/s390x/kvm.c                 |  9 ++++++---
 3 files changed, 26 insertions(+), 6 deletions(-)

Comments

Matthew Rosato Jan. 20, 2020, 4:23 p.m. UTC | #1
On 1/20/20 8:24 AM, Thomas Huth wrote:
> The AIS feature has been disabled late in the v2.10 development cycle since
> there were some issues with migration (see commit 3f2d07b3b01ea61126b -
> "s390x/ais: for 2.10 stable: disable ais facility"). We originally wanted
> to enable it again for newer machine types, but apparently we forgot to do
> this so far. Let's do it for the new s390-ccw-virtio-5.0 machine now.
> 
> While at it, also add a more verbose comment why we need the *_allowed()
> wrappers in s390-virtio-ccw.c.
> 
> Buglink: https://bugzilla.redhat.com/show_bug.cgi?id=1756946
> Reviewed-by: David Hildenbrand <david@redhat.com>
> Signed-off-by: Thomas Huth <thuth@redhat.com>
> ---

Took it for a spin with vfio-pci.  With this patch applied, I see the 
appropriate change reflected in guest /proc/cpuinfo.  I did some tracing 
and see the expected behavior changes (ex: hits in host 
kvm_s390_injrect_airq that show suppression occurring).  Data transfer 
tests worked fine.  Also sanity-tested that ais=off behaves as expected.

Looks good to me.
Cornelia Huck Jan. 20, 2020, 4:24 p.m. UTC | #2
On Mon, 20 Jan 2020 14:24:41 +0100
Thomas Huth <thuth@redhat.com> wrote:

> The AIS feature has been disabled late in the v2.10 development cycle since
> there were some issues with migration (see commit 3f2d07b3b01ea61126b -
> "s390x/ais: for 2.10 stable: disable ais facility"). We originally wanted
> to enable it again for newer machine types, but apparently we forgot to do
> this so far. Let's do it for the new s390-ccw-virtio-5.0 machine now.
> 
> While at it, also add a more verbose comment why we need the *_allowed()
> wrappers in s390-virtio-ccw.c.
> 
> Buglink: https://bugzilla.redhat.com/show_bug.cgi?id=1756946
> Reviewed-by: David Hildenbrand <david@redhat.com>
> Signed-off-by: Thomas Huth <thuth@redhat.com>
> ---
>  v3: Moved "s390mc->kvm_ais_allowed = false" to the end of the function

We also might want to move the others in a followup patch, just to
avoid bad examples to copy/paste.

> 
>  hw/s390x/s390-virtio-ccw.c         | 20 +++++++++++++++++---
>  include/hw/s390x/s390-virtio-ccw.h |  3 +++
>  target/s390x/kvm.c                 |  9 ++++++---
>  3 files changed, 26 insertions(+), 6 deletions(-)

Looks good to me, will queue when I get a positive test result.
Cornelia Huck Jan. 20, 2020, 4:29 p.m. UTC | #3
On Mon, 20 Jan 2020 11:23:37 -0500
Matthew Rosato <mjrosato@linux.ibm.com> wrote:

> On 1/20/20 8:24 AM, Thomas Huth wrote:
> > The AIS feature has been disabled late in the v2.10 development cycle since
> > there were some issues with migration (see commit 3f2d07b3b01ea61126b -
> > "s390x/ais: for 2.10 stable: disable ais facility"). We originally wanted
> > to enable it again for newer machine types, but apparently we forgot to do
> > this so far. Let's do it for the new s390-ccw-virtio-5.0 machine now.
> > 
> > While at it, also add a more verbose comment why we need the *_allowed()
> > wrappers in s390-virtio-ccw.c.
> > 
> > Buglink: https://bugzilla.redhat.com/show_bug.cgi?id=1756946
> > Reviewed-by: David Hildenbrand <david@redhat.com>
> > Signed-off-by: Thomas Huth <thuth@redhat.com>
> > ---  
> 
> Took it for a spin with vfio-pci.  With this patch applied, I see the 
> appropriate change reflected in guest /proc/cpuinfo.  I did some tracing 
> and see the expected behavior changes (ex: hits in host 
> kvm_s390_injrect_airq that show suppression occurring).  Data transfer 
> tests worked fine.  Also sanity-tested that ais=off behaves as expected.
> 
> Looks good to me.
> 

Excellent, thanks for testing!

Should I add a Tested-by: ?
Matthew Rosato Jan. 20, 2020, 4:32 p.m. UTC | #4
On 1/20/20 11:29 AM, Cornelia Huck wrote:
> On Mon, 20 Jan 2020 11:23:37 -0500
> Matthew Rosato <mjrosato@linux.ibm.com> wrote:
> 
>> On 1/20/20 8:24 AM, Thomas Huth wrote:
>>> The AIS feature has been disabled late in the v2.10 development cycle since
>>> there were some issues with migration (see commit 3f2d07b3b01ea61126b -
>>> "s390x/ais: for 2.10 stable: disable ais facility"). We originally wanted
>>> to enable it again for newer machine types, but apparently we forgot to do
>>> this so far. Let's do it for the new s390-ccw-virtio-5.0 machine now.
>>>
>>> While at it, also add a more verbose comment why we need the *_allowed()
>>> wrappers in s390-virtio-ccw.c.
>>>
>>> Buglink: https://bugzilla.redhat.com/show_bug.cgi?id=1756946
>>> Reviewed-by: David Hildenbrand <david@redhat.com>
>>> Signed-off-by: Thomas Huth <thuth@redhat.com>
>>> ---
>>
>> Took it for a spin with vfio-pci.  With this patch applied, I see the
>> appropriate change reflected in guest /proc/cpuinfo.  I did some tracing
>> and see the expected behavior changes (ex: hits in host
>> kvm_s390_injrect_airq that show suppression occurring).  Data transfer
>> tests worked fine.  Also sanity-tested that ais=off behaves as expected.
>>
>> Looks good to me.
>>
> 
> Excellent, thanks for testing!
> 
> Should I add a Tested-by: ?
> 

Sure, go ahead.

Tested-by: Matthew Rosato <mjrosato@linux.ibm.com>
Cornelia Huck Jan. 20, 2020, 5:27 p.m. UTC | #5
On Mon, 20 Jan 2020 14:24:41 +0100
Thomas Huth <thuth@redhat.com> wrote:

> The AIS feature has been disabled late in the v2.10 development cycle since
> there were some issues with migration (see commit 3f2d07b3b01ea61126b -
> "s390x/ais: for 2.10 stable: disable ais facility"). We originally wanted
> to enable it again for newer machine types, but apparently we forgot to do
> this so far. Let's do it for the new s390-ccw-virtio-5.0 machine now.
> 
> While at it, also add a more verbose comment why we need the *_allowed()
> wrappers in s390-virtio-ccw.c.
> 
> Buglink: https://bugzilla.redhat.com/show_bug.cgi?id=1756946
> Reviewed-by: David Hildenbrand <david@redhat.com>
> Signed-off-by: Thomas Huth <thuth@redhat.com>
> ---
>  v3: Moved "s390mc->kvm_ais_allowed = false" to the end of the function
> 
>  hw/s390x/s390-virtio-ccw.c         | 20 +++++++++++++++++---
>  include/hw/s390x/s390-virtio-ccw.h |  3 +++
>  target/s390x/kvm.c                 |  9 ++++++---
>  3 files changed, 26 insertions(+), 6 deletions(-)

> diff --git a/target/s390x/kvm.c b/target/s390x/kvm.c
> index 15260aeb9a..cf4fb4f2d9 100644
> --- a/target/s390x/kvm.c
> +++ b/target/s390x/kvm.c
> @@ -365,10 +365,13 @@ int kvm_arch_init(MachineState *ms, KVMState *s)
>      /*
>       * The migration interface for ais was introduced with kernel 4.13
>       * but the capability itself had been active since 4.12. As migration
> -     * support is considered necessary let's disable ais in the 2.10
> -     * machine.
> +     * support is considered necessary, we only try to enable this for
> +     * newer machine types if KVM_CAP_S390_AIS_MIGRATION is available.
>       */
> -    /* kvm_vm_enable_cap(s, KVM_CAP_S390_AIS, 0); */
> +    if (kvm_ais_allowed() &&
> +        kvm_check_extension(s, KVM_CAP_S390_AIS_MIGRATION)) {

Hnm, we actually need a kernel irqchip with the kvm flic to get ais to
work; else we'll fail with

qemu-system-s390x: Failed to inject airq with AIS supported

in the kernel_irqchip=off case, as we won't have an I/O adapter
registered.

Adding 'kvm_kernel_irqchip_required() &&' seems to do the trick;
comments?

> +        kvm_vm_enable_cap(s, KVM_CAP_S390_AIS, 0);
> +    }
>  
>      kvm_set_max_memslot_size(KVM_SLOT_MAX_BYTES);
>      return 0;
Matthew Rosato Jan. 21, 2020, 2:33 p.m. UTC | #6
On 1/20/20 12:27 PM, Cornelia Huck wrote:
> On Mon, 20 Jan 2020 14:24:41 +0100
> Thomas Huth <thuth@redhat.com> wrote:
> 
>> The AIS feature has been disabled late in the v2.10 development cycle since
>> there were some issues with migration (see commit 3f2d07b3b01ea61126b -
>> "s390x/ais: for 2.10 stable: disable ais facility"). We originally wanted
>> to enable it again for newer machine types, but apparently we forgot to do
>> this so far. Let's do it for the new s390-ccw-virtio-5.0 machine now.
>>
>> While at it, also add a more verbose comment why we need the *_allowed()
>> wrappers in s390-virtio-ccw.c.
>>
>> Buglink: https://bugzilla.redhat.com/show_bug.cgi?id=1756946
>> Reviewed-by: David Hildenbrand <david@redhat.com>
>> Signed-off-by: Thomas Huth <thuth@redhat.com>
>> ---
>>   v3: Moved "s390mc->kvm_ais_allowed = false" to the end of the function
>>
>>   hw/s390x/s390-virtio-ccw.c         | 20 +++++++++++++++++---
>>   include/hw/s390x/s390-virtio-ccw.h |  3 +++
>>   target/s390x/kvm.c                 |  9 ++++++---
>>   3 files changed, 26 insertions(+), 6 deletions(-)
> 
>> diff --git a/target/s390x/kvm.c b/target/s390x/kvm.c
>> index 15260aeb9a..cf4fb4f2d9 100644
>> --- a/target/s390x/kvm.c
>> +++ b/target/s390x/kvm.c
>> @@ -365,10 +365,13 @@ int kvm_arch_init(MachineState *ms, KVMState *s)
>>       /*
>>        * The migration interface for ais was introduced with kernel 4.13
>>        * but the capability itself had been active since 4.12. As migration
>> -     * support is considered necessary let's disable ais in the 2.10
>> -     * machine.
>> +     * support is considered necessary, we only try to enable this for
>> +     * newer machine types if KVM_CAP_S390_AIS_MIGRATION is available.
>>        */
>> -    /* kvm_vm_enable_cap(s, KVM_CAP_S390_AIS, 0); */
>> +    if (kvm_ais_allowed() &&
>> +        kvm_check_extension(s, KVM_CAP_S390_AIS_MIGRATION)) {
> 
> Hnm, we actually need a kernel irqchip with the kvm flic to get ais to
> work; else we'll fail with
> 
> qemu-system-s390x: Failed to inject airq with AIS supported
> 
> in the kernel_irqchip=off case, as we won't have an I/O adapter
> registered.
> 
> Adding 'kvm_kernel_irqchip_required() &&' seems to do the trick;
> comments?
> 

In spirit, I agree with this idea.  But, a quick test shows that putting 
this check here results in ais=off for the 'none' machine case (libvirt 
capabilities detection).  I think we have to only look at 
kvm_kernel_irqchip_required() when working with a real machine.

>> +        kvm_vm_enable_cap(s, KVM_CAP_S390_AIS, 0);
>> +    }
>>   
>>       kvm_set_max_memslot_size(KVM_SLOT_MAX_BYTES);
>>       return 0;
> 
>
Cornelia Huck Jan. 21, 2020, 2:46 p.m. UTC | #7
On Tue, 21 Jan 2020 09:33:02 -0500
Matthew Rosato <mjrosato@linux.ibm.com> wrote:

> On 1/20/20 12:27 PM, Cornelia Huck wrote:
> > On Mon, 20 Jan 2020 14:24:41 +0100
> > Thomas Huth <thuth@redhat.com> wrote:
> >   
> >> The AIS feature has been disabled late in the v2.10 development cycle since
> >> there were some issues with migration (see commit 3f2d07b3b01ea61126b -
> >> "s390x/ais: for 2.10 stable: disable ais facility"). We originally wanted
> >> to enable it again for newer machine types, but apparently we forgot to do
> >> this so far. Let's do it for the new s390-ccw-virtio-5.0 machine now.
> >>
> >> While at it, also add a more verbose comment why we need the *_allowed()
> >> wrappers in s390-virtio-ccw.c.
> >>
> >> Buglink: https://bugzilla.redhat.com/show_bug.cgi?id=1756946
> >> Reviewed-by: David Hildenbrand <david@redhat.com>
> >> Signed-off-by: Thomas Huth <thuth@redhat.com>
> >> ---
> >>   v3: Moved "s390mc->kvm_ais_allowed = false" to the end of the function
> >>
> >>   hw/s390x/s390-virtio-ccw.c         | 20 +++++++++++++++++---
> >>   include/hw/s390x/s390-virtio-ccw.h |  3 +++
> >>   target/s390x/kvm.c                 |  9 ++++++---
> >>   3 files changed, 26 insertions(+), 6 deletions(-)  
> >   
> >> diff --git a/target/s390x/kvm.c b/target/s390x/kvm.c
> >> index 15260aeb9a..cf4fb4f2d9 100644
> >> --- a/target/s390x/kvm.c
> >> +++ b/target/s390x/kvm.c
> >> @@ -365,10 +365,13 @@ int kvm_arch_init(MachineState *ms, KVMState *s)
> >>       /*
> >>        * The migration interface for ais was introduced with kernel 4.13
> >>        * but the capability itself had been active since 4.12. As migration
> >> -     * support is considered necessary let's disable ais in the 2.10
> >> -     * machine.
> >> +     * support is considered necessary, we only try to enable this for
> >> +     * newer machine types if KVM_CAP_S390_AIS_MIGRATION is available.
> >>        */
> >> -    /* kvm_vm_enable_cap(s, KVM_CAP_S390_AIS, 0); */
> >> +    if (kvm_ais_allowed() &&
> >> +        kvm_check_extension(s, KVM_CAP_S390_AIS_MIGRATION)) {  
> > 
> > Hnm, we actually need a kernel irqchip with the kvm flic to get ais to
> > work; else we'll fail with
> > 
> > qemu-system-s390x: Failed to inject airq with AIS supported
> > 
> > in the kernel_irqchip=off case, as we won't have an I/O adapter
> > registered.
> > 
> > Adding 'kvm_kernel_irqchip_required() &&' seems to do the trick;
> > comments?
> >   
> 
> In spirit, I agree with this idea.  But, a quick test shows that putting 
> this check here results in ais=off for the 'none' machine case (libvirt 
> capabilities detection).  I think we have to only look at 
> kvm_kernel_irqchip_required() when working with a real machine.

Sigh, I think you're right again. We need to check for the 'none'
machine here; but I can't think of a non-ugly way to do so...

> 
> >> +        kvm_vm_enable_cap(s, KVM_CAP_S390_AIS, 0);
> >> +    }
> >>   
> >>       kvm_set_max_memslot_size(KVM_SLOT_MAX_BYTES);
> >>       return 0;  
> > 
> >   
>
Thomas Huth Jan. 21, 2020, 3:22 p.m. UTC | #8
On 21/01/2020 15.46, Cornelia Huck wrote:
> On Tue, 21 Jan 2020 09:33:02 -0500
> Matthew Rosato <mjrosato@linux.ibm.com> wrote:
> 
>> On 1/20/20 12:27 PM, Cornelia Huck wrote:
>>> On Mon, 20 Jan 2020 14:24:41 +0100
>>> Thomas Huth <thuth@redhat.com> wrote:
>>>   
>>>> The AIS feature has been disabled late in the v2.10 development cycle since
>>>> there were some issues with migration (see commit 3f2d07b3b01ea61126b -
>>>> "s390x/ais: for 2.10 stable: disable ais facility"). We originally wanted
>>>> to enable it again for newer machine types, but apparently we forgot to do
>>>> this so far. Let's do it for the new s390-ccw-virtio-5.0 machine now.
>>>>
>>>> While at it, also add a more verbose comment why we need the *_allowed()
>>>> wrappers in s390-virtio-ccw.c.
>>>>
>>>> Buglink: https://bugzilla.redhat.com/show_bug.cgi?id=1756946
>>>> Reviewed-by: David Hildenbrand <david@redhat.com>
>>>> Signed-off-by: Thomas Huth <thuth@redhat.com>
>>>> ---
>>>>   v3: Moved "s390mc->kvm_ais_allowed = false" to the end of the function
>>>>
>>>>   hw/s390x/s390-virtio-ccw.c         | 20 +++++++++++++++++---
>>>>   include/hw/s390x/s390-virtio-ccw.h |  3 +++
>>>>   target/s390x/kvm.c                 |  9 ++++++---
>>>>   3 files changed, 26 insertions(+), 6 deletions(-)  
>>>   
>>>> diff --git a/target/s390x/kvm.c b/target/s390x/kvm.c
>>>> index 15260aeb9a..cf4fb4f2d9 100644
>>>> --- a/target/s390x/kvm.c
>>>> +++ b/target/s390x/kvm.c
>>>> @@ -365,10 +365,13 @@ int kvm_arch_init(MachineState *ms, KVMState *s)
>>>>       /*
>>>>        * The migration interface for ais was introduced with kernel 4.13
>>>>        * but the capability itself had been active since 4.12. As migration
>>>> -     * support is considered necessary let's disable ais in the 2.10
>>>> -     * machine.
>>>> +     * support is considered necessary, we only try to enable this for
>>>> +     * newer machine types if KVM_CAP_S390_AIS_MIGRATION is available.
>>>>        */
>>>> -    /* kvm_vm_enable_cap(s, KVM_CAP_S390_AIS, 0); */
>>>> +    if (kvm_ais_allowed() &&
>>>> +        kvm_check_extension(s, KVM_CAP_S390_AIS_MIGRATION)) {  
>>>
>>> Hnm, we actually need a kernel irqchip with the kvm flic to get ais to
>>> work; else we'll fail with
>>>
>>> qemu-system-s390x: Failed to inject airq with AIS supported
>>>
>>> in the kernel_irqchip=off case, as we won't have an I/O adapter
>>> registered.
>>>
>>> Adding 'kvm_kernel_irqchip_required() &&' seems to do the trick;
>>> comments?
>>>   
>>
>> In spirit, I agree with this idea.  But, a quick test shows that putting 
>> this check here results in ais=off for the 'none' machine case (libvirt 
>> capabilities detection).  I think we have to only look at 
>> kvm_kernel_irqchip_required() when working with a real machine.
> 
> Sigh, I think you're right again. We need to check for the 'none'
> machine here; but I can't think of a non-ugly way to do so...

I think it might work when using kvm_kernel_irqchip_allowed() instead of
kvm_kernel_irqchip_required() ... Matthew, could you please give it a
try with this patch on top of mine:

diff --git a/target/s390x/kvm.c b/target/s390x/kvm.c
--- a/target/s390x/kvm.c
+++ b/target/s390x/kvm.c
@@ -368,7 +368,7 @@ int kvm_arch_init(MachineState *ms, KVMState *s)
      * support is considered necessary, we only try to enable this for
      * newer machine types if KVM_CAP_S390_AIS_MIGRATION is available.
      */
-    if (kvm_ais_allowed() &&
+    if (kvm_ais_allowed() && kvm_kernel_irqchip_allowed() &&
         kvm_check_extension(s, KVM_CAP_S390_AIS_MIGRATION)) {
         kvm_vm_enable_cap(s, KVM_CAP_S390_AIS, 0);
     }

 Thomas
Matthew Rosato Jan. 21, 2020, 4:05 p.m. UTC | #9
On 1/21/20 10:22 AM, Thomas Huth wrote:
> On 21/01/2020 15.46, Cornelia Huck wrote:
>> On Tue, 21 Jan 2020 09:33:02 -0500
>> Matthew Rosato <mjrosato@linux.ibm.com> wrote:
>>
>>> On 1/20/20 12:27 PM, Cornelia Huck wrote:
>>>> On Mon, 20 Jan 2020 14:24:41 +0100
>>>> Thomas Huth <thuth@redhat.com> wrote:
>>>>    
>>>>> The AIS feature has been disabled late in the v2.10 development cycle since
>>>>> there were some issues with migration (see commit 3f2d07b3b01ea61126b -
>>>>> "s390x/ais: for 2.10 stable: disable ais facility"). We originally wanted
>>>>> to enable it again for newer machine types, but apparently we forgot to do
>>>>> this so far. Let's do it for the new s390-ccw-virtio-5.0 machine now.
>>>>>
>>>>> While at it, also add a more verbose comment why we need the *_allowed()
>>>>> wrappers in s390-virtio-ccw.c.
>>>>>
>>>>> Buglink: https://bugzilla.redhat.com/show_bug.cgi?id=1756946
>>>>> Reviewed-by: David Hildenbrand <david@redhat.com>
>>>>> Signed-off-by: Thomas Huth <thuth@redhat.com>
>>>>> ---
>>>>>    v3: Moved "s390mc->kvm_ais_allowed = false" to the end of the function
>>>>>
>>>>>    hw/s390x/s390-virtio-ccw.c         | 20 +++++++++++++++++---
>>>>>    include/hw/s390x/s390-virtio-ccw.h |  3 +++
>>>>>    target/s390x/kvm.c                 |  9 ++++++---
>>>>>    3 files changed, 26 insertions(+), 6 deletions(-)
>>>>    
>>>>> diff --git a/target/s390x/kvm.c b/target/s390x/kvm.c
>>>>> index 15260aeb9a..cf4fb4f2d9 100644
>>>>> --- a/target/s390x/kvm.c
>>>>> +++ b/target/s390x/kvm.c
>>>>> @@ -365,10 +365,13 @@ int kvm_arch_init(MachineState *ms, KVMState *s)
>>>>>        /*
>>>>>         * The migration interface for ais was introduced with kernel 4.13
>>>>>         * but the capability itself had been active since 4.12. As migration
>>>>> -     * support is considered necessary let's disable ais in the 2.10
>>>>> -     * machine.
>>>>> +     * support is considered necessary, we only try to enable this for
>>>>> +     * newer machine types if KVM_CAP_S390_AIS_MIGRATION is available.
>>>>>         */
>>>>> -    /* kvm_vm_enable_cap(s, KVM_CAP_S390_AIS, 0); */
>>>>> +    if (kvm_ais_allowed() &&
>>>>> +        kvm_check_extension(s, KVM_CAP_S390_AIS_MIGRATION)) {
>>>>
>>>> Hnm, we actually need a kernel irqchip with the kvm flic to get ais to
>>>> work; else we'll fail with
>>>>
>>>> qemu-system-s390x: Failed to inject airq with AIS supported
>>>>
>>>> in the kernel_irqchip=off case, as we won't have an I/O adapter
>>>> registered.
>>>>
>>>> Adding 'kvm_kernel_irqchip_required() &&' seems to do the trick;
>>>> comments?
>>>>    
>>>
>>> In spirit, I agree with this idea.  But, a quick test shows that putting
>>> this check here results in ais=off for the 'none' machine case (libvirt
>>> capabilities detection).  I think we have to only look at
>>> kvm_kernel_irqchip_required() when working with a real machine.
>>
>> Sigh, I think you're right again. We need to check for the 'none'
>> machine here; but I can't think of a non-ugly way to do so...
> 
> I think it might work when using kvm_kernel_irqchip_allowed() instead of
> kvm_kernel_irqchip_required() ... Matthew, could you please give it a
> try with this patch on top of mine:
> 

Sure.

Libvirt detection works with this patch.

Alternatively, if I run qemu with kernel_irqchip=off and ais=true, I get:
qemu-system-s390x: Some features requested in the CPU model are not 
available in the configuration: ais

Which was the same result as Connie's proposal.

It reads a bit odd to me at first, but looking at the code quick I think 
this is the right answer - kvm_kernel_irqchip_allowed() will only return 
false when kernel_irqchip has been forced off as above, whereas 
kernel_irqchip_required will also return false in the case where no 
setting was specified (this is what tripped libvirt up).

Looks good to me, thanks Thomas.
Thomas Huth Jan. 21, 2020, 4:11 p.m. UTC | #10
On 21/01/2020 17.05, Matthew Rosato wrote:
> On 1/21/20 10:22 AM, Thomas Huth wrote:
>> On 21/01/2020 15.46, Cornelia Huck wrote:
>>> On Tue, 21 Jan 2020 09:33:02 -0500
>>> Matthew Rosato <mjrosato@linux.ibm.com> wrote:
>>>
>>>> On 1/20/20 12:27 PM, Cornelia Huck wrote:
>>>>> On Mon, 20 Jan 2020 14:24:41 +0100
>>>>> Thomas Huth <thuth@redhat.com> wrote:
>>>>>   
>>>>>> The AIS feature has been disabled late in the v2.10 development
>>>>>> cycle since
>>>>>> there were some issues with migration (see commit
>>>>>> 3f2d07b3b01ea61126b -
>>>>>> "s390x/ais: for 2.10 stable: disable ais facility"). We originally
>>>>>> wanted
>>>>>> to enable it again for newer machine types, but apparently we
>>>>>> forgot to do
>>>>>> this so far. Let's do it for the new s390-ccw-virtio-5.0 machine now.
>>>>>>
>>>>>> While at it, also add a more verbose comment why we need the
>>>>>> *_allowed()
>>>>>> wrappers in s390-virtio-ccw.c.
>>>>>>
>>>>>> Buglink: https://bugzilla.redhat.com/show_bug.cgi?id=1756946
>>>>>> Reviewed-by: David Hildenbrand <david@redhat.com>
>>>>>> Signed-off-by: Thomas Huth <thuth@redhat.com>
>>>>>> ---
>>>>>>    v3: Moved "s390mc->kvm_ais_allowed = false" to the end of the
>>>>>> function
>>>>>>
>>>>>>    hw/s390x/s390-virtio-ccw.c         | 20 +++++++++++++++++---
>>>>>>    include/hw/s390x/s390-virtio-ccw.h |  3 +++
>>>>>>    target/s390x/kvm.c                 |  9 ++++++---
>>>>>>    3 files changed, 26 insertions(+), 6 deletions(-)
>>>>>   
>>>>>> diff --git a/target/s390x/kvm.c b/target/s390x/kvm.c
>>>>>> index 15260aeb9a..cf4fb4f2d9 100644
>>>>>> --- a/target/s390x/kvm.c
>>>>>> +++ b/target/s390x/kvm.c
>>>>>> @@ -365,10 +365,13 @@ int kvm_arch_init(MachineState *ms, KVMState
>>>>>> *s)
>>>>>>        /*
>>>>>>         * The migration interface for ais was introduced with
>>>>>> kernel 4.13
>>>>>>         * but the capability itself had been active since 4.12. As
>>>>>> migration
>>>>>> -     * support is considered necessary let's disable ais in the 2.10
>>>>>> -     * machine.
>>>>>> +     * support is considered necessary, we only try to enable
>>>>>> this for
>>>>>> +     * newer machine types if KVM_CAP_S390_AIS_MIGRATION is
>>>>>> available.
>>>>>>         */
>>>>>> -    /* kvm_vm_enable_cap(s, KVM_CAP_S390_AIS, 0); */
>>>>>> +    if (kvm_ais_allowed() &&
>>>>>> +        kvm_check_extension(s, KVM_CAP_S390_AIS_MIGRATION)) {
>>>>>
>>>>> Hnm, we actually need a kernel irqchip with the kvm flic to get ais to
>>>>> work; else we'll fail with
>>>>>
>>>>> qemu-system-s390x: Failed to inject airq with AIS supported
>>>>>
>>>>> in the kernel_irqchip=off case, as we won't have an I/O adapter
>>>>> registered.
>>>>>
>>>>> Adding 'kvm_kernel_irqchip_required() &&' seems to do the trick;
>>>>> comments?
>>>>>    
>>>>
>>>> In spirit, I agree with this idea.  But, a quick test shows that
>>>> putting
>>>> this check here results in ais=off for the 'none' machine case (libvirt
>>>> capabilities detection).  I think we have to only look at
>>>> kvm_kernel_irqchip_required() when working with a real machine.
>>>
>>> Sigh, I think you're right again. We need to check for the 'none'
>>> machine here; but I can't think of a non-ugly way to do so...
>>
>> I think it might work when using kvm_kernel_irqchip_allowed() instead of
>> kvm_kernel_irqchip_required() ... Matthew, could you please give it a
>> try with this patch on top of mine:
>>
> 
> Sure.
> 
> Libvirt detection works with this patch.
> 
> Alternatively, if I run qemu with kernel_irqchip=off and ais=true, I get:
> qemu-system-s390x: Some features requested in the CPU model are not
> available in the configuration: ais
> 
> Which was the same result as Connie's proposal.
> 
> It reads a bit odd to me at first, but looking at the code quick I think
> this is the right answer - kvm_kernel_irqchip_allowed() will only return
> false when kernel_irqchip has been forced off as above, whereas
> kernel_irqchip_required will also return false in the case where no
> setting was specified (this is what tripped libvirt up).
> 
> Looks good to me, thanks Thomas.

Great, thanks for testing!

Cornelia, could you squash that kvm_kernel_irqchip_allowed() into the
patch, or do you prefer if I send a v4 ?

 Thomas
Cornelia Huck Jan. 21, 2020, 4:12 p.m. UTC | #11
On Tue, 21 Jan 2020 11:05:18 -0500
Matthew Rosato <mjrosato@linux.ibm.com> wrote:

> On 1/21/20 10:22 AM, Thomas Huth wrote:
> > On 21/01/2020 15.46, Cornelia Huck wrote:  
> >> On Tue, 21 Jan 2020 09:33:02 -0500
> >> Matthew Rosato <mjrosato@linux.ibm.com> wrote:
> >>  
> >>> On 1/20/20 12:27 PM, Cornelia Huck wrote:  
> >>>> On Mon, 20 Jan 2020 14:24:41 +0100
> >>>> Thomas Huth <thuth@redhat.com> wrote:
> >>>>      
> >>>>> The AIS feature has been disabled late in the v2.10 development cycle since
> >>>>> there were some issues with migration (see commit 3f2d07b3b01ea61126b -
> >>>>> "s390x/ais: for 2.10 stable: disable ais facility"). We originally wanted
> >>>>> to enable it again for newer machine types, but apparently we forgot to do
> >>>>> this so far. Let's do it for the new s390-ccw-virtio-5.0 machine now.
> >>>>>
> >>>>> While at it, also add a more verbose comment why we need the *_allowed()
> >>>>> wrappers in s390-virtio-ccw.c.
> >>>>>
> >>>>> Buglink: https://bugzilla.redhat.com/show_bug.cgi?id=1756946
> >>>>> Reviewed-by: David Hildenbrand <david@redhat.com>
> >>>>> Signed-off-by: Thomas Huth <thuth@redhat.com>
> >>>>> ---
> >>>>>    v3: Moved "s390mc->kvm_ais_allowed = false" to the end of the function
> >>>>>
> >>>>>    hw/s390x/s390-virtio-ccw.c         | 20 +++++++++++++++++---
> >>>>>    include/hw/s390x/s390-virtio-ccw.h |  3 +++
> >>>>>    target/s390x/kvm.c                 |  9 ++++++---
> >>>>>    3 files changed, 26 insertions(+), 6 deletions(-)  
> >>>>      
> >>>>> diff --git a/target/s390x/kvm.c b/target/s390x/kvm.c
> >>>>> index 15260aeb9a..cf4fb4f2d9 100644
> >>>>> --- a/target/s390x/kvm.c
> >>>>> +++ b/target/s390x/kvm.c
> >>>>> @@ -365,10 +365,13 @@ int kvm_arch_init(MachineState *ms, KVMState *s)
> >>>>>        /*
> >>>>>         * The migration interface for ais was introduced with kernel 4.13
> >>>>>         * but the capability itself had been active since 4.12. As migration
> >>>>> -     * support is considered necessary let's disable ais in the 2.10
> >>>>> -     * machine.
> >>>>> +     * support is considered necessary, we only try to enable this for
> >>>>> +     * newer machine types if KVM_CAP_S390_AIS_MIGRATION is available.
> >>>>>         */
> >>>>> -    /* kvm_vm_enable_cap(s, KVM_CAP_S390_AIS, 0); */
> >>>>> +    if (kvm_ais_allowed() &&
> >>>>> +        kvm_check_extension(s, KVM_CAP_S390_AIS_MIGRATION)) {  
> >>>>
> >>>> Hnm, we actually need a kernel irqchip with the kvm flic to get ais to
> >>>> work; else we'll fail with
> >>>>
> >>>> qemu-system-s390x: Failed to inject airq with AIS supported
> >>>>
> >>>> in the kernel_irqchip=off case, as we won't have an I/O adapter
> >>>> registered.
> >>>>
> >>>> Adding 'kvm_kernel_irqchip_required() &&' seems to do the trick;
> >>>> comments?
> >>>>      
> >>>
> >>> In spirit, I agree with this idea.  But, a quick test shows that putting
> >>> this check here results in ais=off for the 'none' machine case (libvirt
> >>> capabilities detection).  I think we have to only look at
> >>> kvm_kernel_irqchip_required() when working with a real machine.  
> >>
> >> Sigh, I think you're right again. We need to check for the 'none'
> >> machine here; but I can't think of a non-ugly way to do so...  
> > 
> > I think it might work when using kvm_kernel_irqchip_allowed() instead of
> > kvm_kernel_irqchip_required() ... Matthew, could you please give it a
> > try with this patch on top of mine:
> >   
> 
> Sure.
> 
> Libvirt detection works with this patch.

Excellent.

> 
> Alternatively, if I run qemu with kernel_irqchip=off and ais=true, I get:
> qemu-system-s390x: Some features requested in the CPU model are not 
> available in the configuration: ais
> 
> Which was the same result as Connie's proposal.

Yep, that's the expected behaviour.

> 
> It reads a bit odd to me at first, but looking at the code quick I think 
> this is the right answer - kvm_kernel_irqchip_allowed() will only return 
> false when kernel_irqchip has been forced off as above, whereas 
> kernel_irqchip_required will also return false in the case where no 
> setting was specified (this is what tripped libvirt up).
> 
> Looks good to me, thanks Thomas.

Thanks for testing!

Thomas, I guess you'll send a v4?
diff mbox series

Patch

diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
index e0e28139a2..76254e8447 100644
--- a/hw/s390x/s390-virtio-ccw.c
+++ b/hw/s390x/s390-virtio-ccw.c
@@ -452,6 +452,7 @@  static void ccw_machine_class_init(ObjectClass *oc, void *data)
     s390mc->cpu_model_allowed = true;
     s390mc->css_migration_enabled = true;
     s390mc->hpage_1m_allowed = true;
+    s390mc->kvm_ais_allowed = true;
     mc->init = ccw_init;
     mc->reset = s390_machine_reset;
     mc->hot_add_cpu = s390_hot_add_cpu;
@@ -505,6 +506,14 @@  static inline void machine_set_dea_key_wrap(Object *obj, bool value,
 
 static S390CcwMachineClass *current_mc;
 
+/*
+ * Get the class of the s390-ccw-virtio machine that is currently in use.
+ * Note: libvirt is using the "none" machine to probe for the features of the
+ * host CPU, so in case this is called with the "none" machine, the function
+ * returns the TYPE_S390_CCW_MACHINE base class. In this base class, all the
+ * various "*_allowed" variables are enabled, so that the *_allowed() wrappers
+ * below return the correct default value for the "none" machine.
+ */
 static S390CcwMachineClass *get_machine_class(void)
 {
     if (unlikely(!current_mc)) {
@@ -521,22 +530,24 @@  static S390CcwMachineClass *get_machine_class(void)
 
 bool ri_allowed(void)
 {
-    /* for "none" machine this results in true */
     return get_machine_class()->ri_allowed;
 }
 
 bool cpu_model_allowed(void)
 {
-    /* for "none" machine this results in true */
     return get_machine_class()->cpu_model_allowed;
 }
 
 bool hpage_1m_allowed(void)
 {
-    /* for "none" machine this results in true */
     return get_machine_class()->hpage_1m_allowed;
 }
 
+bool kvm_ais_allowed(void)
+{
+    return get_machine_class()->kvm_ais_allowed;
+}
+
 static char *machine_get_loadparm(Object *obj, Error **errp)
 {
     S390CcwMachineState *ms = S390_CCW_MACHINE(obj);
@@ -658,8 +669,11 @@  static void ccw_machine_4_2_instance_options(MachineState *machine)
 
 static void ccw_machine_4_2_class_options(MachineClass *mc)
 {
+    S390CcwMachineClass *s390mc = S390_MACHINE_CLASS(mc);
+
     ccw_machine_5_0_class_options(mc);
     compat_props_add(mc->compat_props, hw_compat_4_2, hw_compat_4_2_len);
+    s390mc->kvm_ais_allowed = false;
 }
 DEFINE_CCW_MACHINE(4_2, "4.2", false);
 
diff --git a/include/hw/s390x/s390-virtio-ccw.h b/include/hw/s390x/s390-virtio-ccw.h
index 8aa27199c9..e3ba3b88b1 100644
--- a/include/hw/s390x/s390-virtio-ccw.h
+++ b/include/hw/s390x/s390-virtio-ccw.h
@@ -40,6 +40,7 @@  typedef struct S390CcwMachineClass {
     bool cpu_model_allowed;
     bool css_migration_enabled;
     bool hpage_1m_allowed;
+    bool kvm_ais_allowed;
 } S390CcwMachineClass;
 
 /* runtime-instrumentation allowed by the machine */
@@ -48,6 +49,8 @@  bool ri_allowed(void);
 bool cpu_model_allowed(void);
 /* 1M huge page mappings allowed by the machine */
 bool hpage_1m_allowed(void);
+/* adapter-interrupt suppression allowed by the machine? */
+bool kvm_ais_allowed(void);
 
 /**
  * Returns true if (vmstate based) migration of the channel subsystem
diff --git a/target/s390x/kvm.c b/target/s390x/kvm.c
index 15260aeb9a..cf4fb4f2d9 100644
--- a/target/s390x/kvm.c
+++ b/target/s390x/kvm.c
@@ -365,10 +365,13 @@  int kvm_arch_init(MachineState *ms, KVMState *s)
     /*
      * The migration interface for ais was introduced with kernel 4.13
      * but the capability itself had been active since 4.12. As migration
-     * support is considered necessary let's disable ais in the 2.10
-     * machine.
+     * support is considered necessary, we only try to enable this for
+     * newer machine types if KVM_CAP_S390_AIS_MIGRATION is available.
      */
-    /* kvm_vm_enable_cap(s, KVM_CAP_S390_AIS, 0); */
+    if (kvm_ais_allowed() &&
+        kvm_check_extension(s, KVM_CAP_S390_AIS_MIGRATION)) {
+        kvm_vm_enable_cap(s, KVM_CAP_S390_AIS, 0);
+    }
 
     kvm_set_max_memslot_size(KVM_SLOT_MAX_BYTES);
     return 0;