diff mbox

[v2,1/2] KVM_CAP_IRQFD and KVM_CAP_IRQFD_RESAMPLE checks

Message ID 1409738050-3810-2-git-send-email-eric.auger@linaro.org
State New
Headers show

Commit Message

Eric Auger Sept. 3, 2014, 9:54 a.m. UTC
Compute kvm_irqfds_allowed by checking the KVM_CAP_IRQFD extension.
Remove direct settings in architecture specific files.

Add a new kvm_resamplefds_allowed variable, initialized by
checking the KVM_CAP_IRQFD_RESAMPLE extension. Add a corresponding
kvm_resamplefds_enabled() function.

Signed-off-by: Eric Auger <eric.auger@linaro.org>

---

in practice KVM_CAP_IRQFD_RESAMPLE seems to be always enabled
as soon as kernel has HAVE_KVM_IRQFD so the resamplefd check
may be unnecessary.
---
 hw/intc/openpic_kvm.c |  1 -
 hw/intc/xics_kvm.c    |  1 -
 include/sysemu/kvm.h  | 10 ++++++++++
 kvm-all.c             |  7 +++++++
 target-i386/kvm.c     |  1 -
 target-s390x/kvm.c    |  1 -
 6 files changed, 17 insertions(+), 4 deletions(-)

Comments

Christian Borntraeger Sept. 3, 2014, 12:50 p.m. UTC | #1
On 03/09/14 11:54, Eric Auger wrote:
[...]
> --- a/kvm-all.c
> +++ b/kvm-all.c
[...]
> @@ -1548,6 +1549,12 @@ int kvm_init(MachineClass *mc)
>      kvm_eventfds_allowed =
>          (kvm_check_extension(s, KVM_CAP_IOEVENTFD) > 0);
> 
> +    kvm_irqfds_allowed =
> +        (kvm_check_extension(s, KVM_CAP_IRQFD) > 0);
                                   ^^^^^^^^^^^^^
> +
> +    kvm_resamplefds_allowed =
> +        (kvm_check_extension(s, KVM_CAP_IRQFD_RESAMPLE) > 0);
> +
[...]

> diff --git a/target-s390x/kvm.c b/target-s390x/kvm.c
> index a85a480..f937568 100644
> --- a/target-s390x/kvm.c
> +++ b/target-s390x/kvm.c
> @@ -1290,7 +1290,6 @@ void kvm_arch_init_irq_routing(KVMState *s)
>       * have to override the common code kvm_halt_in_kernel_allowed setting.
>       */
>      if (kvm_check_extension(s, KVM_CAP_IRQ_ROUTING)) {
                                  ^^^^^^^^^^^^^^^^^^^
> -        kvm_irqfds_allowed = true;
>          kvm_gsi_routing_allowed = true;
>          kvm_halt_in_kernel_allowed = false;
>      }



I first thought that this is wrong, because on s390 we forgot to announce IRQFD when we introduced
it. As you can see in both hunks, we check for KVM_CAP_IRQ_ROUTING and not for CAP_IRQFD

Luckily, the kernel got fixed with commit ebc3226202d5956a5963185222982d435378b899
("KVM: s390: announce irqfd capability") and the capability was introduced with 
commit 84223598778ba08041f4297fda485df83414d57e ("KVM: s390: irq routing for adapter interrupts").
Looks that both patches first appear with 3.15, so there should be no kernel version that
is affected by this change. You might want to add that to your changelog to help distros that
84223598778ba08041f4297fda485df83414d57e also needs ebc3226202d5956a5963185222982d435378b899.



Christian
Eric Auger Sept. 3, 2014, 1:19 p.m. UTC | #2
On 09/03/2014 02:50 PM, Christian Borntraeger wrote:
> On 03/09/14 11:54, Eric Auger wrote:
> [...]
>> --- a/kvm-all.c
>> +++ b/kvm-all.c
> [...]
>> @@ -1548,6 +1549,12 @@ int kvm_init(MachineClass *mc)
>>      kvm_eventfds_allowed =
>>          (kvm_check_extension(s, KVM_CAP_IOEVENTFD) > 0);
>>
>> +    kvm_irqfds_allowed =
>> +        (kvm_check_extension(s, KVM_CAP_IRQFD) > 0);
>                                    ^^^^^^^^^^^^^
>> +
>> +    kvm_resamplefds_allowed =
>> +        (kvm_check_extension(s, KVM_CAP_IRQFD_RESAMPLE) > 0);
>> +
> [...]
> 
>> diff --git a/target-s390x/kvm.c b/target-s390x/kvm.c
>> index a85a480..f937568 100644
>> --- a/target-s390x/kvm.c
>> +++ b/target-s390x/kvm.c
>> @@ -1290,7 +1290,6 @@ void kvm_arch_init_irq_routing(KVMState *s)
>>       * have to override the common code kvm_halt_in_kernel_allowed setting.
>>       */
>>      if (kvm_check_extension(s, KVM_CAP_IRQ_ROUTING)) {
>                                   ^^^^^^^^^^^^^^^^^^^
>> -        kvm_irqfds_allowed = true;
>>          kvm_gsi_routing_allowed = true;
>>          kvm_halt_in_kernel_allowed = false;
>>      }
> 
> 
> 
> I first thought that this is wrong, because on s390 we forgot to announce IRQFD when we introduced
> it. As you can see in both hunks, we check for KVM_CAP_IRQ_ROUTING and not for CAP_IRQFD
> 
> Luckily, the kernel got fixed with commit ebc3226202d5956a5963185222982d435378b899
> ("KVM: s390: announce irqfd capability") and the capability was introduced with 
> commit 84223598778ba08041f4297fda485df83414d57e ("KVM: s390: irq routing for adapter interrupts").
> Looks that both patches first appear with 3.15, so there should be no kernel version that
> is affected by this change. You might want to add that to your changelog to help distros that
> 84223598778ba08041f4297fda485df83414d57e also needs ebc3226202d5956a5963185222982d435378b899.
Hi Christian,

I will add this information to the changelog. I effectively checked the
cap was advertised in s390 arch but I was not aware of the history.

Thanks

Best Regards

Eric
> 
> 
> 
> Christian
>
diff mbox

Patch

diff --git a/hw/intc/openpic_kvm.c b/hw/intc/openpic_kvm.c
index e3bce04..6cef3b1 100644
--- a/hw/intc/openpic_kvm.c
+++ b/hw/intc/openpic_kvm.c
@@ -229,7 +229,6 @@  static void kvm_openpic_realize(DeviceState *dev, Error **errp)
         kvm_irqchip_add_irq_route(kvm_state, i, 0, i);
     }
 
-    kvm_irqfds_allowed = true;
     kvm_msi_via_irqfd_allowed = true;
     kvm_gsi_routing_allowed = true;
 
diff --git a/hw/intc/xics_kvm.c b/hw/intc/xics_kvm.c
index 20b19e9..c15453f 100644
--- a/hw/intc/xics_kvm.c
+++ b/hw/intc/xics_kvm.c
@@ -448,7 +448,6 @@  static void xics_kvm_realize(DeviceState *dev, Error **errp)
     }
 
     kvm_kernel_irqchip = true;
-    kvm_irqfds_allowed = true;
     kvm_msi_via_irqfd_allowed = true;
     kvm_gsi_direct_mapping = true;
 
diff --git a/include/sysemu/kvm.h b/include/sysemu/kvm.h
index 174ea36..69c4d0f 100644
--- a/include/sysemu/kvm.h
+++ b/include/sysemu/kvm.h
@@ -45,6 +45,7 @@  extern bool kvm_async_interrupts_allowed;
 extern bool kvm_halt_in_kernel_allowed;
 extern bool kvm_eventfds_allowed;
 extern bool kvm_irqfds_allowed;
+extern bool kvm_resamplefds_allowed;
 extern bool kvm_msi_via_irqfd_allowed;
 extern bool kvm_gsi_routing_allowed;
 extern bool kvm_gsi_direct_mapping;
@@ -102,6 +103,15 @@  extern bool kvm_readonly_mem_allowed;
 #define kvm_irqfds_enabled() (kvm_irqfds_allowed)
 
 /**
+ * kvm_resamplefds_enabled:
+ *
+ * Returns: true if we can use resamplefds to inject interrupts into
+ * a KVM CPU (ie the kernel supports resamplefds and we are running
+ * with a configuration where it is meaningful to use them).
+ */
+#define kvm_resamplefds_enabled() (kvm_resamplefds_allowed)
+
+/**
  * kvm_msi_via_irqfd_enabled:
  *
  * Returns: true if we can route a PCI MSI (Message Signaled Interrupt)
diff --git a/kvm-all.c b/kvm-all.c
index b240bf8..d635942 100644
--- a/kvm-all.c
+++ b/kvm-all.c
@@ -116,6 +116,7 @@  bool kvm_async_interrupts_allowed;
 bool kvm_halt_in_kernel_allowed;
 bool kvm_eventfds_allowed;
 bool kvm_irqfds_allowed;
+bool kvm_resamplefds_allowed;
 bool kvm_msi_via_irqfd_allowed;
 bool kvm_gsi_routing_allowed;
 bool kvm_gsi_direct_mapping;
@@ -1548,6 +1549,12 @@  int kvm_init(MachineClass *mc)
     kvm_eventfds_allowed =
         (kvm_check_extension(s, KVM_CAP_IOEVENTFD) > 0);
 
+    kvm_irqfds_allowed =
+        (kvm_check_extension(s, KVM_CAP_IRQFD) > 0);
+
+    kvm_resamplefds_allowed =
+        (kvm_check_extension(s, KVM_CAP_IRQFD_RESAMPLE) > 0);
+
     ret = kvm_arch_init(s);
     if (ret < 0) {
         goto err;
diff --git a/target-i386/kvm.c b/target-i386/kvm.c
index ddedc73..2320920 100644
--- a/target-i386/kvm.c
+++ b/target-i386/kvm.c
@@ -2544,7 +2544,6 @@  void kvm_arch_init_irq_routing(KVMState *s)
      * irqchip, so we can use irqfds, and on x86 we know
      * we can use msi via irqfd and GSI routing.
      */
-    kvm_irqfds_allowed = true;
     kvm_msi_via_irqfd_allowed = true;
     kvm_gsi_routing_allowed = true;
 }
diff --git a/target-s390x/kvm.c b/target-s390x/kvm.c
index a85a480..f937568 100644
--- a/target-s390x/kvm.c
+++ b/target-s390x/kvm.c
@@ -1290,7 +1290,6 @@  void kvm_arch_init_irq_routing(KVMState *s)
      * have to override the common code kvm_halt_in_kernel_allowed setting.
      */
     if (kvm_check_extension(s, KVM_CAP_IRQ_ROUTING)) {
-        kvm_irqfds_allowed = true;
         kvm_gsi_routing_allowed = true;
         kvm_halt_in_kernel_allowed = false;
     }