Message ID | 1436497207-4786-5-git-send-email-feng.wu@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Fri, 2015-07-10 at 11:00 +0800, Feng Wu wrote: > Add the following x86 specific routines for irqbypass manger: > > - kvm_arch_irq_bypass_add_producer > - kvm_arch_irq_bypass_del_producer > - kvm_arch_irq_bypass_stop > - kvm_arch_irq_bypass_resume > - kvm_arch_irq_bypass_update > > Signed-off-by: Feng Wu <feng.wu@intel.com> > --- > arch/x86/kvm/Kconfig | 1 + > arch/x86/kvm/x86.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 56 insertions(+) > > diff --git a/arch/x86/kvm/Kconfig b/arch/x86/kvm/Kconfig > index 22f6fcb..ae68f2a 100644 > --- a/arch/x86/kvm/Kconfig > +++ b/arch/x86/kvm/Kconfig > @@ -62,6 +62,7 @@ config KVM_INTEL > # for perf_guest_get_msrs(): > depends on CPU_SUP_INTEL > select IRQ_BYPASS_MANAGER > + select HAVE_KVM_IRQ_BYPASS > ---help--- > Provides support for KVM on Intel processors equipped with the VT > extensions. > diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c > index d81ac02..a59f7e3 100644 > --- a/arch/x86/kvm/x86.c > +++ b/arch/x86/kvm/x86.c > @@ -49,6 +49,8 @@ > #include <linux/pci.h> > #include <linux/timekeeper_internal.h> > #include <linux/pvclock_gtod.h> > +#include <linux/kvm_irqfd.h> > +#include <linux/irqbypass.h> > #include <trace/events/kvm.h> > > #define CREATE_TRACE_POINTS > @@ -8023,6 +8025,59 @@ out: > return ret; > } > > +void kvm_arch_irq_bypass_add_producer(struct irq_bypass_consumer *cons, > + struct irq_bypass_producer *prod) > +{ > + int ret; > + struct kvm_kernel_irqfd *irqfd = > + container_of(cons, struct kvm_kernel_irqfd, consumer); > + > + irqfd->producer = prod; > + > + ret = kvm_arch_update_pi_irte(irqfd->kvm, prod->irq, irqfd->gsi, 1); > + WARN_ON(ret); > +} > + > +void kvm_arch_irq_bypass_del_producer(struct irq_bypass_consumer *cons, > + struct irq_bypass_producer *prod) > +{ > + int ret; > + struct kvm_kernel_irqfd *irqfd = > + container_of(cons, struct kvm_kernel_irqfd, consumer); > + > + irqfd->producer = NULL; > + > + /* > + * When producer of consumer is unregistered, we change back to > + * remapped mode, so we can re-use the current implementation > + * when the irq is masked/disabed or the consumer side (KVM > + * int this case doesn't want to receive the interrupts. > + */ > + ret = kvm_arch_update_pi_irte(irqfd->kvm, prod->irq, irqfd->gsi, 0); > + WARN_ON(ret); > +} > + > +void kvm_arch_irq_bypass_stop(struct irq_bypass_consumer *cons) > +{ > +} > + > +void kvm_arch_irq_bypass_resume(struct irq_bypass_consumer *cons) > +{ > +} No need for dummy functions, these callbacks will be optional. Thanks, Alex > + > +void kvm_arch_irq_bypass_update(struct irq_bypass_consumer *cons) > +{ > + int ret; > + struct kvm_kernel_irqfd *irqfd = > + container_of(cons, struct kvm_kernel_irqfd, consumer); > + > + BUG_ON(!irqfd->producer); > + > + ret = kvm_arch_update_pi_irte(irqfd->kvm, irqfd->producer->irq, > + irqfd->gsi, 1); > + WARN_ON(ret); > +} > + > EXPORT_TRACEPOINT_SYMBOL_GPL(kvm_exit); > EXPORT_TRACEPOINT_SYMBOL_GPL(kvm_inj_virq); > EXPORT_TRACEPOINT_SYMBOL_GPL(kvm_page_fault); -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/arch/x86/kvm/Kconfig b/arch/x86/kvm/Kconfig index 22f6fcb..ae68f2a 100644 --- a/arch/x86/kvm/Kconfig +++ b/arch/x86/kvm/Kconfig @@ -62,6 +62,7 @@ config KVM_INTEL # for perf_guest_get_msrs(): depends on CPU_SUP_INTEL select IRQ_BYPASS_MANAGER + select HAVE_KVM_IRQ_BYPASS ---help--- Provides support for KVM on Intel processors equipped with the VT extensions. diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index d81ac02..a59f7e3 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -49,6 +49,8 @@ #include <linux/pci.h> #include <linux/timekeeper_internal.h> #include <linux/pvclock_gtod.h> +#include <linux/kvm_irqfd.h> +#include <linux/irqbypass.h> #include <trace/events/kvm.h> #define CREATE_TRACE_POINTS @@ -8023,6 +8025,59 @@ out: return ret; } +void kvm_arch_irq_bypass_add_producer(struct irq_bypass_consumer *cons, + struct irq_bypass_producer *prod) +{ + int ret; + struct kvm_kernel_irqfd *irqfd = + container_of(cons, struct kvm_kernel_irqfd, consumer); + + irqfd->producer = prod; + + ret = kvm_arch_update_pi_irte(irqfd->kvm, prod->irq, irqfd->gsi, 1); + WARN_ON(ret); +} + +void kvm_arch_irq_bypass_del_producer(struct irq_bypass_consumer *cons, + struct irq_bypass_producer *prod) +{ + int ret; + struct kvm_kernel_irqfd *irqfd = + container_of(cons, struct kvm_kernel_irqfd, consumer); + + irqfd->producer = NULL; + + /* + * When producer of consumer is unregistered, we change back to + * remapped mode, so we can re-use the current implementation + * when the irq is masked/disabed or the consumer side (KVM + * int this case doesn't want to receive the interrupts. + */ + ret = kvm_arch_update_pi_irte(irqfd->kvm, prod->irq, irqfd->gsi, 0); + WARN_ON(ret); +} + +void kvm_arch_irq_bypass_stop(struct irq_bypass_consumer *cons) +{ +} + +void kvm_arch_irq_bypass_resume(struct irq_bypass_consumer *cons) +{ +} + +void kvm_arch_irq_bypass_update(struct irq_bypass_consumer *cons) +{ + int ret; + struct kvm_kernel_irqfd *irqfd = + container_of(cons, struct kvm_kernel_irqfd, consumer); + + BUG_ON(!irqfd->producer); + + ret = kvm_arch_update_pi_irte(irqfd->kvm, irqfd->producer->irq, + irqfd->gsi, 1); + WARN_ON(ret); +} + EXPORT_TRACEPOINT_SYMBOL_GPL(kvm_exit); EXPORT_TRACEPOINT_SYMBOL_GPL(kvm_inj_virq); EXPORT_TRACEPOINT_SYMBOL_GPL(kvm_page_fault);
Add the following x86 specific routines for irqbypass manger: - kvm_arch_irq_bypass_add_producer - kvm_arch_irq_bypass_del_producer - kvm_arch_irq_bypass_stop - kvm_arch_irq_bypass_resume - kvm_arch_irq_bypass_update Signed-off-by: Feng Wu <feng.wu@intel.com> --- arch/x86/kvm/Kconfig | 1 + arch/x86/kvm/x86.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+)