]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
KVM: PPC: Book3S HV: Tunable to disable KVM IRQ bypass
authorSuresh Warrier <warrier@linux.vnet.ibm.com>
Fri, 19 Aug 2016 05:35:54 +0000 (15:35 +1000)
committerPaul Mackerras <paulus@ozlabs.org>
Mon, 12 Sep 2016 00:12:18 +0000 (10:12 +1000)
Add a  module parameter kvm_irq_bypass for kvm_hv.ko to
disable IRQ bypass for passthrough interrupts. The default
value of this tunable is 1 - that is enable the feature.

Since the tunable is used by built-in kernel code, we use
the module_param_cb macro to achieve this.

Signed-off-by: Suresh Warrier <warrier@linux.vnet.ibm.com>
Signed-off-by: Paul Mackerras <paulus@ozlabs.org>
arch/powerpc/include/asm/kvm_book3s.h
arch/powerpc/include/asm/kvm_ppc.h
arch/powerpc/kvm/book3s_hv.c
arch/powerpc/kvm/book3s_hv_rm_xics.c

index c261f52f6a550d6b1462ee7d160f635c51eed1a6..cef2b892245cc18ebeba0961b36f14353e3381c9 100644 (file)
@@ -227,6 +227,7 @@ extern void kvmppc_copy_to_svcpu(struct kvmppc_book3s_shadow_vcpu *svcpu,
                                 struct kvm_vcpu *vcpu);
 extern void kvmppc_copy_from_svcpu(struct kvm_vcpu *vcpu,
                                   struct kvmppc_book3s_shadow_vcpu *svcpu);
+extern int kvm_irq_bypass;
 
 static inline struct kvmppc_vcpu_book3s *to_book3s(struct kvm_vcpu *vcpu)
 {
index e0ada3138649ee346ce21b7d1ec1abefb7590b1a..97b9bad9ec49ee54a8befc19bf2bdedcdb1226a2 100644 (file)
@@ -461,7 +461,7 @@ static inline int kvmppc_xics_enabled(struct kvm_vcpu *vcpu)
 static inline struct kvmppc_passthru_irqmap *kvmppc_get_passthru_irqmap(
                                struct kvm *kvm)
 {
-       if (kvm)
+       if (kvm && kvm_irq_bypass)
                return kvm->arch.pimap;
        return NULL;
 }
index 90beb96a0df6a7e3a30f7db50cf1a6f9e985edcb..03721ed6313152d1b8b8cc65133445dbcee39b4f 100644 (file)
@@ -95,6 +95,10 @@ static struct kernel_param_ops module_param_ops = {
        .get = param_get_int,
 };
 
+module_param_cb(kvm_irq_bypass, &module_param_ops, &kvm_irq_bypass,
+                                                       S_IRUGO | S_IWUSR);
+MODULE_PARM_DESC(kvm_irq_bypass, "Bypass passthrough interrupt optimization");
+
 module_param_cb(h_ipi_redirect, &module_param_ops, &h_ipi_redirect,
                                                        S_IRUGO | S_IWUSR);
 MODULE_PARM_DESC(h_ipi_redirect, "Redirect H_IPI wakeup to a free host core");
@@ -3443,6 +3447,9 @@ static int kvmppc_set_passthru_irq(struct kvm *kvm, int host_irq, int guest_gsi)
        struct irq_chip *chip;
        int i;
 
+       if (!kvm_irq_bypass)
+               return 1;
+
        desc = irq_to_desc(host_irq);
        if (!desc)
                return -EIO;
@@ -3519,6 +3526,9 @@ static int kvmppc_clr_passthru_irq(struct kvm *kvm, int host_irq, int guest_gsi)
        struct kvmppc_passthru_irqmap *pimap;
        int i;
 
+       if (!kvm_irq_bypass)
+               return 0;
+
        desc = irq_to_desc(host_irq);
        if (!desc)
                return -EIO;
index 3b8d7ac0be7ccc381e77db9daadd994f57487f7c..00b9dfde9ac43d4ee86a99106a8456c9e1dff094 100644 (file)
@@ -27,6 +27,8 @@
 
 int h_ipi_redirect = 1;
 EXPORT_SYMBOL(h_ipi_redirect);
+int kvm_irq_bypass = 1;
+EXPORT_SYMBOL(kvm_irq_bypass);
 
 static void icp_rm_deliver_irq(struct kvmppc_xics *xics, struct kvmppc_icp *icp,
                            u32 new_irq);