Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 721eecbf authored by Gregory Haskins's avatar Gregory Haskins Committed by Avi Kivity
Browse files

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: default avatarGregory Haskins <ghaskins@novell.com>
Signed-off-by: default avatarAvi Kivity <avi@redhat.com>
parent 0ba12d10
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ config KVM
	select MMU_NOTIFIER
	select ANON_INODES
	select HAVE_KVM_IRQCHIP
	select HAVE_KVM_EVENTFD
	---help---
	  Support hosting fully virtualized guest machines using hardware
	  virtualization extensions.  You will need a fairly recent
+1 −1
Original line number Diff line number Diff line
@@ -2,7 +2,7 @@
EXTRA_CFLAGS += -Ivirt/kvm -Iarch/x86/kvm

kvm-y			+= $(addprefix ../../../virt/kvm/, kvm_main.o ioapic.o \
				coalesced_mmio.o irq_comm.o)
				coalesced_mmio.o irq_comm.o eventfd.o)
kvm-$(CONFIG_KVM_TRACE)	+= $(addprefix ../../../virt/kvm/, kvm_trace.o)
kvm-$(CONFIG_IOMMU_API)	+= $(addprefix ../../../virt/kvm/, iommu.o)

+1 −0
Original line number Diff line number Diff line
@@ -1126,6 +1126,7 @@ int kvm_dev_ioctl_check_extension(long ext)
	case KVM_CAP_REINJECT_CONTROL:
	case KVM_CAP_IRQ_INJECT_STATUS:
	case KVM_CAP_ASSIGN_DEV_IRQ:
	case KVM_CAP_IRQFD:
		r = 1;
		break;
	case KVM_CAP_COALESCED_MMIO:
+11 −0
Original line number Diff line number Diff line
@@ -418,6 +418,7 @@ struct kvm_trace_rec {
#ifdef __KVM_HAVE_MCE
#define KVM_CAP_MCE 31
#endif
#define KVM_CAP_IRQFD 32

#ifdef KVM_CAP_IRQ_ROUTING

@@ -470,6 +471,15 @@ struct kvm_x86_mce {
};
#endif

#define KVM_IRQFD_FLAG_DEASSIGN (1 << 0)

struct kvm_irqfd {
	__u32 fd;
	__u32 gsi;
	__u32 flags;
	__u8  pad[20];
};

/*
 * ioctls for VM fds
 */
@@ -514,6 +524,7 @@ struct kvm_x86_mce {
#define KVM_ASSIGN_SET_MSIX_ENTRY \
			_IOW(KVMIO, 0x74, struct kvm_assigned_msix_entry)
#define KVM_DEASSIGN_DEV_IRQ       _IOW(KVMIO, 0x75, struct kvm_assigned_irq)
#define KVM_IRQFD                  _IOW(KVMIO, 0x76, struct kvm_irqfd)

/*
 * ioctls for vcpu fds
+24 −0
Original line number Diff line number Diff line
@@ -136,6 +136,12 @@ struct kvm {
	struct list_head vm_list;
	struct kvm_io_bus mmio_bus;
	struct kvm_io_bus pio_bus;
#ifdef CONFIG_HAVE_KVM_EVENTFD
	struct {
		spinlock_t        lock;
		struct list_head  items;
	} irqfds;
#endif
	struct kvm_vm_stat stat;
	struct kvm_arch arch;
	atomic_t users_count;
@@ -525,4 +531,22 @@ static inline void kvm_free_irq_routing(struct kvm *kvm) {}

#endif

#ifdef CONFIG_HAVE_KVM_EVENTFD

void kvm_irqfd_init(struct kvm *kvm);
int kvm_irqfd(struct kvm *kvm, int fd, int gsi, int flags);
void kvm_irqfd_release(struct kvm *kvm);

#else

static inline void kvm_irqfd_init(struct kvm *kvm) {}
static inline int kvm_irqfd(struct kvm *kvm, int fd, int gsi, int flags)
{
	return -EINVAL;
}

static inline void kvm_irqfd_release(struct kvm *kvm) {}

#endif /* CONFIG_HAVE_KVM_EVENTFD */

#endif
Loading