qemu-kvm: add irqfd support
PATCH v8 1/1 qemu-kvm: add irqfd support
irqfd lets you create an eventfd based file-desriptor to inject interrupts to a kvm guest. We associate one gsi per fd for fine-grained routing.
[note: this is meant to work in conjunction with the POLLHUP version of
irqfd, which has not yet been accepted into kvm.git]
[ Changelog:
v8:
*) removed deassign() verb in favor of POLLHUP support on close() *) only include sys/eventfd.h if CAP_IRQFD is defined to properly
support older kernels
*) s/ENOENT/ENOSYS
]
---
kvm/libkvm/libkvm.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ kvm/libkvm/libkvm.h | 14 ++++++++++++++ 2 files changed, 63 insertions(+), 0 deletions(-)
kvm/libkvm/libkvm.c +49 -0
@@ -1444,3 +1444,52 @@ int kvm_assign_set_msix_entry(kvm_context_t kvm,return ret; }#endif + +#ifdef KVM_CAP_IRQFD + +#include <sys/eventfd.h> + +static int _kvm_irqfd (kvm_context_t kvm,int fd,int gsi,int flags) +{ +int r; +struct kvm_irqfd data = { + .fd = fd, + .gsi = gsi, + .flags = flags, + }; + + r =ioctl (kvm->vm_fd,KVM_IRQFD , &data); +if (r ==-1 ) + r = -errno; +return r; +} + +int kvm_irqfd (kvm_context_t kvm,int gsi,int flags) +{ +int r; +int fd; + +if (!kvm_check_extension (kvm,KVM_CAP_IRQFD )) +return -ENOENT ; + + fd =eventfd (0 ,0 ); +if (fd <0 ) +return -errno; + + r =_kvm_irqfd (kvm, fd, gsi,0 ); +if (r <0 ) { +close (fd); +return -errno; + } + +return fd; +} + +#else /* KVM_CAP_IRQFD */ + +int kvm_irqfd (kvm_context_t kvm,int gsi,int flags) +{ +return -ENOSYS ; +} + +#endif /* KVM_CAP_IRQFD */
kvm/libkvm/libkvm.h +14 -0
@@ -856,6 +856,20 @@ int kvm_commit_irq_routes(kvm_context_t kvm);*/ int kvm_get_irq_route_gsi (kvm_context_t kvm); +/*! +* \brief Create a file descriptor for injecting interrupts +* +* Creates an eventfd based file-descriptor that maps to a specific GSI +* in the guest. eventfd compliant signaling (write() from userspace, or +* eventfd_signal() from kernelspace) will cause the GSI to inject +* itself into the guest at the next available window. +* +* \param kvm Pointer to the current kvm_context +* \param gsi GSI to assign to this fd +* \param flags reserved, must be zero +*/ +int kvm_irqfd (kvm_context_t kvm,int gsi,int flags); +#ifdef KVM_CAP_DEVICE_MSIX int kvm_assign_set_msix_nr (kvm_context_t kvm,struct kvm_assigned_msix_nr *msix_nr);
Quoted 6 lines · Gregory Haskins
irqfd lets you create an eventfd based file-desriptor to inject interrupts to a kvm guest. We associate one gsi per fd for fine-grained routing.
[note: this is meant to work in conjunction with the POLLHUP version of
irqfd, which has not yet been accepted into kvm.git]
Quoted 9 lines
[ Changelog:
v8:
*) removeddeassign()verb in favor of POLLHUP support onclose()*) only includesys/eventfd.hifCAP_IRQFDis defined to properly
support older kernels
*) s/ENOENT/ENOSYS
]
Hmm..it would appear I already released a 'v8' in the past. :(
In any case, this is the latest version to consider
-Greg
Quoted 95 lines
Signed-off-by Gregory Haskins <[email protected]>---
kvm/libkvm/libkvm.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ kvm/libkvm/libkvm.h | 14 ++++++++++++++ 2 files changed, 63 insertions(+), 0 deletions(-)kvm/libkvm/libkvm.c +49
-0@@ -1444,3 +1444,52 @@ int kvm_assign_set_msix_entry(kvm_context_t kvm,return ret; }#endif + +#ifdef KVM_CAP_IRQFD + +#include <sys/eventfd.h> + +static int _kvm_irqfd (kvm_context_t kvm,int fd,int gsi,int flags) +{ +int r; +struct kvm_irqfd data = { + .fd = fd, + .gsi = gsi, + .flags = flags, + }; + + r =ioctl (kvm->vm_fd,KVM_IRQFD , &data); +if (r ==-1 ) + r = -errno; +return r; +} + +int kvm_irqfd (kvm_context_t kvm,int gsi,int flags) +{ +int r; +int fd; + +if (!kvm_check_extension (kvm,KVM_CAP_IRQFD )) +return -ENOENT ; + + fd =eventfd (0 ,0 ); +if (fd <0 ) +return -errno; + + r =_kvm_irqfd (kvm, fd, gsi,0 ); +if (r <0 ) { +close (fd); +return -errno; + } + +return fd; +} + +#else /* KVM_CAP_IRQFD */ + +int kvm_irqfd (kvm_context_t kvm,int gsi,int flags) +{ +return -ENOSYS ; +} + +#endif /* KVM_CAP_IRQFD */ kvm/libkvm/libkvm.h +14
-1@@ -856,6 +856,20 @@ int kvm_commit_irq_routes(kvm_context_t kvm);*/ int kvm_get_irq_route_gsi (kvm_context_t kvm); +/*! +* \brief Create a file descriptor for injecting interrupts +* +* Creates an eventfd based file-descriptor that maps to a specific GSI +* in the guest. eventfd compliant signaling (write() from userspace, or +* eventfd_signal() from kernelspace) will cause the GSI to inject +* itself into the guest at the next available window. +* +* \param kvm Pointer to the current kvm_context +* \param gsi GSI to assign to this fd +* \param flags reserved, must be zero +*/ +int kvm_irqfd (kvm_context_t kvm,int gsi,int flags); +#ifdef KVM_CAP_DEVICE_MSIX int kvm_assign_set_msix_nr (kvm_context_t kvm,struct kvm_assigned_msix_nr *msix_nr); --To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Quoted 6 lines · Gregory Haskins
irqfd lets you create an eventfd based file-desriptor to inject interrupts to a kvm guest. We associate one gsi per fd for fine-grained routing.
[note: this is meant to work in conjunction with the POLLHUP version of
irqfd, which has not yet been accepted into kvm.git]
Applied with two changes: added a dependency on CONFIG_eventfd (with the kvm external module, you can have irqfd support without eventfd support), and adjusted for the new libkvm location (libkvm-all.[ch]).
Signature · 1 line
error compiling committee.c: too many arguments to function