[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH v3 12/13] KVM: selftests: Add utilities to create eventfds and do KVM_IRQFD



Add helpers to create eventfds and to (de)assign eventfds via KVM_IRQFD.

Signed-off-by: Sean Christopherson <seanjc@xxxxxxxxxx>
---
 tools/testing/selftests/kvm/arm64/vgic_irq.c  | 12 ++----
 .../testing/selftests/kvm/include/kvm_util.h  | 40 +++++++++++++++++++
 .../selftests/kvm/x86/xen_shinfo_test.c       | 18 ++-------
 3 files changed, 47 insertions(+), 23 deletions(-)

diff --git a/tools/testing/selftests/kvm/arm64/vgic_irq.c 
b/tools/testing/selftests/kvm/arm64/vgic_irq.c
index f4ac28d53747..a09dd423c2d7 100644
--- a/tools/testing/selftests/kvm/arm64/vgic_irq.c
+++ b/tools/testing/selftests/kvm/arm64/vgic_irq.c
@@ -620,18 +620,12 @@ static void kvm_routing_and_irqfd_check(struct kvm_vm *vm,
         * that no actual interrupt was injected for those cases.
         */
 
-       for (f = 0, i = intid; i < (uint64_t)intid + num; i++, f++) {
-               fd[f] = eventfd(0, 0);
-               TEST_ASSERT(fd[f] != -1, __KVM_SYSCALL_ERROR("eventfd()", 
fd[f]));
-       }
+       for (f = 0, i = intid; i < (uint64_t)intid + num; i++, f++)
+               fd[f] = kvm_new_eventfd();
 
        for (f = 0, i = intid; i < (uint64_t)intid + num; i++, f++) {
-               struct kvm_irqfd irqfd = {
-                       .fd  = fd[f],
-                       .gsi = i - MIN_SPI,
-               };
                assert(i <= (uint64_t)UINT_MAX);
-               vm_ioctl(vm, KVM_IRQFD, &irqfd);
+               kvm_assign_irqfd(vm, i - MIN_SPI, fd[f]);
        }
 
        for (f = 0, i = intid; i < (uint64_t)intid + num; i++, f++) {
diff --git a/tools/testing/selftests/kvm/include/kvm_util.h 
b/tools/testing/selftests/kvm/include/kvm_util.h
index 373912464fb4..4f7bf8f000bb 100644
--- a/tools/testing/selftests/kvm/include/kvm_util.h
+++ b/tools/testing/selftests/kvm/include/kvm_util.h
@@ -18,6 +18,7 @@
 #include <asm/atomic.h>
 #include <asm/kvm.h>
 
+#include <sys/eventfd.h>
 #include <sys/ioctl.h>
 
 #include "kvm_util_arch.h"
@@ -496,6 +497,45 @@ static inline int vm_get_stats_fd(struct kvm_vm *vm)
        return fd;
 }
 
+static inline int __kvm_irqfd(struct kvm_vm *vm, uint32_t gsi, int eventfd,
+                             uint32_t flags)
+{
+       struct kvm_irqfd irqfd = {
+               .fd = eventfd,
+               .gsi = gsi,
+               .flags = flags,
+               .resamplefd = -1,
+       };
+
+       return __vm_ioctl(vm, KVM_IRQFD, &irqfd);
+}
+
+static inline void kvm_irqfd(struct kvm_vm *vm, uint32_t gsi, int eventfd,
+                             uint32_t flags)
+{
+       int ret = __kvm_irqfd(vm, gsi, eventfd, flags);
+
+       TEST_ASSERT_VM_VCPU_IOCTL(!ret, KVM_IRQFD, ret, vm);
+}
+
+static inline void kvm_assign_irqfd(struct kvm_vm *vm, uint32_t gsi, int 
eventfd)
+{
+       kvm_irqfd(vm, gsi, eventfd, 0);
+}
+
+static inline void kvm_deassign_irqfd(struct kvm_vm *vm, uint32_t gsi, int 
eventfd)
+{
+       kvm_irqfd(vm, gsi, eventfd, KVM_IRQFD_FLAG_DEASSIGN);
+}
+
+static inline int kvm_new_eventfd(void)
+{
+       int fd = eventfd(0, 0);
+
+       TEST_ASSERT(fd >= 0, __KVM_SYSCALL_ERROR("eventfd()", fd));
+       return fd;
+}
+
 static inline void read_stats_header(int stats_fd, struct kvm_stats_header 
*header)
 {
        ssize_t ret;
diff --git a/tools/testing/selftests/kvm/x86/xen_shinfo_test.c 
b/tools/testing/selftests/kvm/x86/xen_shinfo_test.c
index 34d180cf4eed..23909b501ac2 100644
--- a/tools/testing/selftests/kvm/x86/xen_shinfo_test.c
+++ b/tools/testing/selftests/kvm/x86/xen_shinfo_test.c
@@ -547,11 +547,8 @@ int main(int argc, char *argv[])
        int irq_fd[2] = { -1, -1 };
 
        if (do_eventfd_tests) {
-               irq_fd[0] = eventfd(0, 0);
-               TEST_ASSERT(irq_fd[0] >= 0, __KVM_SYSCALL_ERROR("eventfd()", 
irq_fd[0]));
-
-               irq_fd[1] = eventfd(0, 0);
-               TEST_ASSERT(irq_fd[1] >= 0, __KVM_SYSCALL_ERROR("eventfd()", 
irq_fd[1]));
+               irq_fd[0] = kvm_new_eventfd();
+               irq_fd[1] = kvm_new_eventfd();
 
                irq_routes.info.nr = 2;
 
@@ -569,15 +566,8 @@ int main(int argc, char *argv[])
 
                vm_ioctl(vm, KVM_SET_GSI_ROUTING, &irq_routes.info);
 
-               struct kvm_irqfd ifd = { };
-
-               ifd.fd = irq_fd[0];
-               ifd.gsi = 32;
-               vm_ioctl(vm, KVM_IRQFD, &ifd);
-
-               ifd.fd = irq_fd[1];
-               ifd.gsi = 33;
-               vm_ioctl(vm, KVM_IRQFD, &ifd);
+               kvm_assign_irqfd(vm, 32, irq_fd[0]);
+               kvm_assign_irqfd(vm, 33, irq_fd[1]);
 
                struct sigaction sa = { };
                sa.sa_handler = handle_alrm;
-- 
2.49.0.1151.ga128411c76-goog




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.