summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSuresh Warrier <warrier@linux.vnet.ibm.com>2016-08-19 01:35:54 -0400
committerPaul Mackerras <paulus@ozlabs.org>2016-09-11 20:12:18 -0400
commit644abbb254b1ab171f777431b23e6fb5879599d0 (patch)
treea0a086f8d767d6ada28b095612e3a50a3eed6555
parentaf893c7dc941f2510d4f23e76e312c77c434b2f0 (diff)
KVM: PPC: Book3S HV: Tunable to disable KVM IRQ bypass
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>
-rw-r--r--arch/powerpc/include/asm/kvm_book3s.h1
-rw-r--r--arch/powerpc/include/asm/kvm_ppc.h2
-rw-r--r--arch/powerpc/kvm/book3s_hv.c10
-rw-r--r--arch/powerpc/kvm/book3s_hv_rm_xics.c2
4 files changed, 14 insertions, 1 deletions
diff --git a/arch/powerpc/include/asm/kvm_book3s.h b/arch/powerpc/include/asm/kvm_book3s.h
index c261f52f6a55..cef2b892245c 100644
--- a/arch/powerpc/include/asm/kvm_book3s.h
+++ b/arch/powerpc/include/asm/kvm_book3s.h
@@ -227,6 +227,7 @@ extern void kvmppc_copy_to_svcpu(struct kvmppc_book3s_shadow_vcpu *svcpu,
227 struct kvm_vcpu *vcpu); 227 struct kvm_vcpu *vcpu);
228extern void kvmppc_copy_from_svcpu(struct kvm_vcpu *vcpu, 228extern void kvmppc_copy_from_svcpu(struct kvm_vcpu *vcpu,
229 struct kvmppc_book3s_shadow_vcpu *svcpu); 229 struct kvmppc_book3s_shadow_vcpu *svcpu);
230extern int kvm_irq_bypass;
230 231
231static inline struct kvmppc_vcpu_book3s *to_book3s(struct kvm_vcpu *vcpu) 232static inline struct kvmppc_vcpu_book3s *to_book3s(struct kvm_vcpu *vcpu)
232{ 233{
diff --git a/arch/powerpc/include/asm/kvm_ppc.h b/arch/powerpc/include/asm/kvm_ppc.h
index e0ada3138649..97b9bad9ec49 100644
--- a/arch/powerpc/include/asm/kvm_ppc.h
+++ b/arch/powerpc/include/asm/kvm_ppc.h
@@ -461,7 +461,7 @@ static inline int kvmppc_xics_enabled(struct kvm_vcpu *vcpu)
461static inline struct kvmppc_passthru_irqmap *kvmppc_get_passthru_irqmap( 461static inline struct kvmppc_passthru_irqmap *kvmppc_get_passthru_irqmap(
462 struct kvm *kvm) 462 struct kvm *kvm)
463{ 463{
464 if (kvm) 464 if (kvm && kvm_irq_bypass)
465 return kvm->arch.pimap; 465 return kvm->arch.pimap;
466 return NULL; 466 return NULL;
467} 467}
diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c
index 90beb96a0df6..03721ed63131 100644
--- a/arch/powerpc/kvm/book3s_hv.c
+++ b/arch/powerpc/kvm/book3s_hv.c
@@ -95,6 +95,10 @@ static struct kernel_param_ops module_param_ops = {
95 .get = param_get_int, 95 .get = param_get_int,
96}; 96};
97 97
98module_param_cb(kvm_irq_bypass, &module_param_ops, &kvm_irq_bypass,
99 S_IRUGO | S_IWUSR);
100MODULE_PARM_DESC(kvm_irq_bypass, "Bypass passthrough interrupt optimization");
101
98module_param_cb(h_ipi_redirect, &module_param_ops, &h_ipi_redirect, 102module_param_cb(h_ipi_redirect, &module_param_ops, &h_ipi_redirect,
99 S_IRUGO | S_IWUSR); 103 S_IRUGO | S_IWUSR);
100MODULE_PARM_DESC(h_ipi_redirect, "Redirect H_IPI wakeup to a free host core"); 104MODULE_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)
3443 struct irq_chip *chip; 3447 struct irq_chip *chip;
3444 int i; 3448 int i;
3445 3449
3450 if (!kvm_irq_bypass)
3451 return 1;
3452
3446 desc = irq_to_desc(host_irq); 3453 desc = irq_to_desc(host_irq);
3447 if (!desc) 3454 if (!desc)
3448 return -EIO; 3455 return -EIO;
@@ -3519,6 +3526,9 @@ static int kvmppc_clr_passthru_irq(struct kvm *kvm, int host_irq, int guest_gsi)
3519 struct kvmppc_passthru_irqmap *pimap; 3526 struct kvmppc_passthru_irqmap *pimap;
3520 int i; 3527 int i;
3521 3528
3529 if (!kvm_irq_bypass)
3530 return 0;
3531
3522 desc = irq_to_desc(host_irq); 3532 desc = irq_to_desc(host_irq);
3523 if (!desc) 3533 if (!desc)
3524 return -EIO; 3534 return -EIO;
diff --git a/arch/powerpc/kvm/book3s_hv_rm_xics.c b/arch/powerpc/kvm/book3s_hv_rm_xics.c
index 3b8d7ac0be7c..00b9dfde9ac4 100644
--- a/arch/powerpc/kvm/book3s_hv_rm_xics.c
+++ b/arch/powerpc/kvm/book3s_hv_rm_xics.c
@@ -27,6 +27,8 @@
27 27
28int h_ipi_redirect = 1; 28int h_ipi_redirect = 1;
29EXPORT_SYMBOL(h_ipi_redirect); 29EXPORT_SYMBOL(h_ipi_redirect);
30int kvm_irq_bypass = 1;
31EXPORT_SYMBOL(kvm_irq_bypass);
30 32
31static void icp_rm_deliver_irq(struct kvmppc_xics *xics, struct kvmppc_icp *icp, 33static void icp_rm_deliver_irq(struct kvmppc_xics *xics, struct kvmppc_icp *icp,
32 u32 new_irq); 34 u32 new_irq);