瀏覽代碼

KVM: introduce kvm_arch functions for IRQ bypass

This patch introduces
- kvm_arch_irq_bypass_add_producer
- kvm_arch_irq_bypass_del_producer
- kvm_arch_irq_bypass_stop
- kvm_arch_irq_bypass_start

They make possible to specialize the KVM IRQ bypass consumer in
case CONFIG_KVM_HAVE_IRQ_BYPASS is set.

Signed-off-by: Eric Auger <eric.auger@linaro.org>
[Add weak implementations of the callbacks. - Feng]
Signed-off-by: Feng Wu <feng.wu@intel.com>
Reviewed-by: Alex Williamson <alex.williamson@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Eric Auger 10 年之前
父節點
當前提交
1a02b27035
共有 3 個文件被更改,包括 25 次插入0 次删除
  1. 10 0
      include/linux/kvm_host.h
  2. 3 0
      virt/kvm/Kconfig
  3. 12 0
      virt/kvm/eventfd.c

+ 10 - 0
include/linux/kvm_host.h

@@ -24,6 +24,7 @@
 #include <linux/err.h>
 #include <linux/err.h>
 #include <linux/irqflags.h>
 #include <linux/irqflags.h>
 #include <linux/context_tracking.h>
 #include <linux/context_tracking.h>
+#include <linux/irqbypass.h>
 #include <asm/signal.h>
 #include <asm/signal.h>
 
 
 #include <linux/kvm.h>
 #include <linux/kvm.h>
@@ -1163,4 +1164,13 @@ static inline void kvm_vcpu_set_dy_eligible(struct kvm_vcpu *vcpu, bool val)
 {
 {
 }
 }
 #endif /* CONFIG_HAVE_KVM_CPU_RELAX_INTERCEPT */
 #endif /* CONFIG_HAVE_KVM_CPU_RELAX_INTERCEPT */
+
+#ifdef CONFIG_HAVE_KVM_IRQ_BYPASS
+int kvm_arch_irq_bypass_add_producer(struct irq_bypass_consumer *,
+			   struct irq_bypass_producer *);
+void kvm_arch_irq_bypass_del_producer(struct irq_bypass_consumer *,
+			   struct irq_bypass_producer *);
+void kvm_arch_irq_bypass_stop(struct irq_bypass_consumer *);
+void kvm_arch_irq_bypass_start(struct irq_bypass_consumer *);
+#endif /* CONFIG_HAVE_KVM_IRQ_BYPASS */
 #endif
 #endif

+ 3 - 0
virt/kvm/Kconfig

@@ -47,3 +47,6 @@ config KVM_GENERIC_DIRTYLOG_READ_PROTECT
 config KVM_COMPAT
 config KVM_COMPAT
        def_bool y
        def_bool y
        depends on COMPAT && !S390
        depends on COMPAT && !S390
+
+config HAVE_KVM_IRQ_BYPASS
+       bool

+ 12 - 0
virt/kvm/eventfd.c

@@ -252,6 +252,18 @@ static void irqfd_update(struct kvm *kvm, struct kvm_kernel_irqfd *irqfd)
 	write_seqcount_end(&irqfd->irq_entry_sc);
 	write_seqcount_end(&irqfd->irq_entry_sc);
 }
 }
 
 
+#ifdef CONFIG_HAVE_KVM_IRQ_BYPASS
+void __attribute__((weak)) kvm_arch_irq_bypass_stop(
+				struct irq_bypass_consumer *cons)
+{
+}
+
+void __attribute__((weak)) kvm_arch_irq_bypass_start(
+				struct irq_bypass_consumer *cons)
+{
+}
+#endif
+
 static int
 static int
 kvm_irqfd_assign(struct kvm *kvm, struct kvm_irqfd *args)
 kvm_irqfd_assign(struct kvm *kvm, struct kvm_irqfd *args)
 {
 {