* 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++) {
 
 #include <asm/atomic.h>
 #include <asm/kvm.h>
 
+#include <sys/eventfd.h>
 #include <sys/ioctl.h>
 
 #include "kvm_util_arch.h"
        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;
 
        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;
 
 
                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;