diff options
author | Suresh Warrier <warrier@linux.vnet.ibm.com> | 2016-08-19 01:35:54 -0400 |
---|---|---|
committer | Paul Mackerras <paulus@ozlabs.org> | 2016-09-11 20:12:18 -0400 |
commit | 644abbb254b1ab171f777431b23e6fb5879599d0 (patch) | |
tree | a0a086f8d767d6ada28b095612e3a50a3eed6555 | |
parent | af893c7dc941f2510d4f23e76e312c77c434b2f0 (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.h | 1 | ||||
-rw-r--r-- | arch/powerpc/include/asm/kvm_ppc.h | 2 | ||||
-rw-r--r-- | arch/powerpc/kvm/book3s_hv.c | 10 | ||||
-rw-r--r-- | arch/powerpc/kvm/book3s_hv_rm_xics.c | 2 |
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); |
228 | extern void kvmppc_copy_from_svcpu(struct kvm_vcpu *vcpu, | 228 | extern void kvmppc_copy_from_svcpu(struct kvm_vcpu *vcpu, |
229 | struct kvmppc_book3s_shadow_vcpu *svcpu); | 229 | struct kvmppc_book3s_shadow_vcpu *svcpu); |
230 | extern int kvm_irq_bypass; | ||
230 | 231 | ||
231 | static inline struct kvmppc_vcpu_book3s *to_book3s(struct kvm_vcpu *vcpu) | 232 | static 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) | |||
461 | static inline struct kvmppc_passthru_irqmap *kvmppc_get_passthru_irqmap( | 461 | static 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 | ||
98 | module_param_cb(kvm_irq_bypass, &module_param_ops, &kvm_irq_bypass, | ||
99 | S_IRUGO | S_IWUSR); | ||
100 | MODULE_PARM_DESC(kvm_irq_bypass, "Bypass passthrough interrupt optimization"); | ||
101 | |||
98 | module_param_cb(h_ipi_redirect, &module_param_ops, &h_ipi_redirect, | 102 | module_param_cb(h_ipi_redirect, &module_param_ops, &h_ipi_redirect, |
99 | S_IRUGO | S_IWUSR); | 103 | S_IRUGO | S_IWUSR); |
100 | MODULE_PARM_DESC(h_ipi_redirect, "Redirect H_IPI wakeup to a free host core"); | 104 | 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) | |||
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 | ||
28 | int h_ipi_redirect = 1; | 28 | int h_ipi_redirect = 1; |
29 | EXPORT_SYMBOL(h_ipi_redirect); | 29 | EXPORT_SYMBOL(h_ipi_redirect); |
30 | int kvm_irq_bypass = 1; | ||
31 | EXPORT_SYMBOL(kvm_irq_bypass); | ||
30 | 32 | ||
31 | static void icp_rm_deliver_irq(struct kvmppc_xics *xics, struct kvmppc_icp *icp, | 33 | static void icp_rm_deliver_irq(struct kvmppc_xics *xics, struct kvmppc_icp *icp, |
32 | u32 new_irq); | 34 | u32 new_irq); |