aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorGregory Haskins <ghaskins@novell.com>2009-05-20 10:30:49 -0400
committerAvi Kivity <avi@redhat.com>2009-09-10 01:32:41 -0400
commit721eecbf4fe995ca94a9edec0c9843b1cc0eaaf3 (patch)
treec759fe98a4ea5e2e2a7694e4b44a558407077290 /include
parent0ba12d10817a8db1fd7d96d3283ec6c0b294aeab (diff)
KVM: irqfd
KVM provides a complete virtual system environment for guests, including support for injecting interrupts modeled after the real exception/interrupt facilities present on the native platform (such as the IDT on x86). Virtual interrupts can come from a variety of sources (emulated devices, pass-through devices, etc) but all must be injected to the guest via the KVM infrastructure. This patch adds a new mechanism to inject a specific interrupt to a guest using a decoupled eventfd mechnanism: Any legal signal on the irqfd (using eventfd semantics from either userspace or kernel) will translate into an injected interrupt in the guest at the next available interrupt window. Signed-off-by: Gregory Haskins <ghaskins@novell.com> Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'include')
-rw-r--r--include/linux/kvm.h11
-rw-r--r--include/linux/kvm_host.h24
2 files changed, 35 insertions, 0 deletions
diff --git a/include/linux/kvm.h b/include/linux/kvm.h
index 7b17141c47c9..8f53f24e5274 100644
--- a/include/linux/kvm.h
+++ b/include/linux/kvm.h
@@ -418,6 +418,7 @@ struct kvm_trace_rec {
418#ifdef __KVM_HAVE_MCE 418#ifdef __KVM_HAVE_MCE
419#define KVM_CAP_MCE 31 419#define KVM_CAP_MCE 31
420#endif 420#endif
421#define KVM_CAP_IRQFD 32
421 422
422#ifdef KVM_CAP_IRQ_ROUTING 423#ifdef KVM_CAP_IRQ_ROUTING
423 424
@@ -470,6 +471,15 @@ struct kvm_x86_mce {
470}; 471};
471#endif 472#endif
472 473
474#define KVM_IRQFD_FLAG_DEASSIGN (1 << 0)
475
476struct kvm_irqfd {
477 __u32 fd;
478 __u32 gsi;
479 __u32 flags;
480 __u8 pad[20];
481};
482
473/* 483/*
474 * ioctls for VM fds 484 * ioctls for VM fds
475 */ 485 */
@@ -514,6 +524,7 @@ struct kvm_x86_mce {
514#define KVM_ASSIGN_SET_MSIX_ENTRY \ 524#define KVM_ASSIGN_SET_MSIX_ENTRY \
515 _IOW(KVMIO, 0x74, struct kvm_assigned_msix_entry) 525 _IOW(KVMIO, 0x74, struct kvm_assigned_msix_entry)
516#define KVM_DEASSIGN_DEV_IRQ _IOW(KVMIO, 0x75, struct kvm_assigned_irq) 526#define KVM_DEASSIGN_DEV_IRQ _IOW(KVMIO, 0x75, struct kvm_assigned_irq)
527#define KVM_IRQFD _IOW(KVMIO, 0x76, struct kvm_irqfd)
517 528
518/* 529/*
519 * ioctls for vcpu fds 530 * ioctls for vcpu fds
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h
index 3060bdc35ffe..7724dcb6ff76 100644
--- a/include/linux/kvm_host.h
+++ b/include/linux/kvm_host.h
@@ -136,6 +136,12 @@ struct kvm {
136 struct list_head vm_list; 136 struct list_head vm_list;
137 struct kvm_io_bus mmio_bus; 137 struct kvm_io_bus mmio_bus;
138 struct kvm_io_bus pio_bus; 138 struct kvm_io_bus pio_bus;
139#ifdef CONFIG_HAVE_KVM_EVENTFD
140 struct {
141 spinlock_t lock;
142 struct list_head items;
143 } irqfds;
144#endif
139 struct kvm_vm_stat stat; 145 struct kvm_vm_stat stat;
140 struct kvm_arch arch; 146 struct kvm_arch arch;
141 atomic_t users_count; 147 atomic_t users_count;
@@ -525,4 +531,22 @@ static inline void kvm_free_irq_routing(struct kvm *kvm) {}
525 531
526#endif 532#endif
527 533
534#ifdef CONFIG_HAVE_KVM_EVENTFD
535
536void kvm_irqfd_init(struct kvm *kvm);
537int kvm_irqfd(struct kvm *kvm, int fd, int gsi, int flags);
538void kvm_irqfd_release(struct kvm *kvm);
539
540#else
541
542static inline void kvm_irqfd_init(struct kvm *kvm) {}
543static inline int kvm_irqfd(struct kvm *kvm, int fd, int gsi, int flags)
544{
545 return -EINVAL;
546}
547
548static inline void kvm_irqfd_release(struct kvm *kvm) {}
549
550#endif /* CONFIG_HAVE_KVM_EVENTFD */
551
528#endif 552#endif