Skip to content

Commit 74e5e3f

Browse files
committed
KVM: selftests: Add utilities to create eventfds and do KVM_IRQFD
Add helpers to create eventfds and to (de)assign eventfds via KVM_IRQFD. Tested-by: K Prateek Nayak <kprateek.nayak@amd.com> Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org> Link: https://lore.kernel.org/r/20250522235223.3178519-13-seanjc@google.com Signed-off-by: Sean Christopherson <seanjc@google.com>
1 parent 033b76b commit 74e5e3f

3 files changed

Lines changed: 47 additions & 23 deletions

File tree

tools/testing/selftests/kvm/arm64/vgic_irq.c

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -620,18 +620,12 @@ static void kvm_routing_and_irqfd_check(struct kvm_vm *vm,
620620
* that no actual interrupt was injected for those cases.
621621
*/
622622

623-
for (f = 0, i = intid; i < (uint64_t)intid + num; i++, f++) {
624-
fd[f] = eventfd(0, 0);
625-
TEST_ASSERT(fd[f] != -1, __KVM_SYSCALL_ERROR("eventfd()", fd[f]));
626-
}
623+
for (f = 0, i = intid; i < (uint64_t)intid + num; i++, f++)
624+
fd[f] = kvm_new_eventfd();
627625

628626
for (f = 0, i = intid; i < (uint64_t)intid + num; i++, f++) {
629-
struct kvm_irqfd irqfd = {
630-
.fd = fd[f],
631-
.gsi = i - MIN_SPI,
632-
};
633627
assert(i <= (uint64_t)UINT_MAX);
634-
vm_ioctl(vm, KVM_IRQFD, &irqfd);
628+
kvm_assign_irqfd(vm, i - MIN_SPI, fd[f]);
635629
}
636630

637631
for (f = 0, i = intid; i < (uint64_t)intid + num; i++, f++) {

tools/testing/selftests/kvm/include/kvm_util.h

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include <asm/atomic.h>
1919
#include <asm/kvm.h>
2020

21+
#include <sys/eventfd.h>
2122
#include <sys/ioctl.h>
2223

2324
#include "kvm_util_arch.h"
@@ -502,6 +503,45 @@ static inline int vm_get_stats_fd(struct kvm_vm *vm)
502503
return fd;
503504
}
504505

506+
static inline int __kvm_irqfd(struct kvm_vm *vm, uint32_t gsi, int eventfd,
507+
uint32_t flags)
508+
{
509+
struct kvm_irqfd irqfd = {
510+
.fd = eventfd,
511+
.gsi = gsi,
512+
.flags = flags,
513+
.resamplefd = -1,
514+
};
515+
516+
return __vm_ioctl(vm, KVM_IRQFD, &irqfd);
517+
}
518+
519+
static inline void kvm_irqfd(struct kvm_vm *vm, uint32_t gsi, int eventfd,
520+
uint32_t flags)
521+
{
522+
int ret = __kvm_irqfd(vm, gsi, eventfd, flags);
523+
524+
TEST_ASSERT_VM_VCPU_IOCTL(!ret, KVM_IRQFD, ret, vm);
525+
}
526+
527+
static inline void kvm_assign_irqfd(struct kvm_vm *vm, uint32_t gsi, int eventfd)
528+
{
529+
kvm_irqfd(vm, gsi, eventfd, 0);
530+
}
531+
532+
static inline void kvm_deassign_irqfd(struct kvm_vm *vm, uint32_t gsi, int eventfd)
533+
{
534+
kvm_irqfd(vm, gsi, eventfd, KVM_IRQFD_FLAG_DEASSIGN);
535+
}
536+
537+
static inline int kvm_new_eventfd(void)
538+
{
539+
int fd = eventfd(0, 0);
540+
541+
TEST_ASSERT(fd >= 0, __KVM_SYSCALL_ERROR("eventfd()", fd));
542+
return fd;
543+
}
544+
505545
static inline void read_stats_header(int stats_fd, struct kvm_stats_header *header)
506546
{
507547
ssize_t ret;

tools/testing/selftests/kvm/x86/xen_shinfo_test.c

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -547,11 +547,8 @@ int main(int argc, char *argv[])
547547
int irq_fd[2] = { -1, -1 };
548548

549549
if (do_eventfd_tests) {
550-
irq_fd[0] = eventfd(0, 0);
551-
TEST_ASSERT(irq_fd[0] >= 0, __KVM_SYSCALL_ERROR("eventfd()", irq_fd[0]));
552-
553-
irq_fd[1] = eventfd(0, 0);
554-
TEST_ASSERT(irq_fd[1] >= 0, __KVM_SYSCALL_ERROR("eventfd()", irq_fd[1]));
550+
irq_fd[0] = kvm_new_eventfd();
551+
irq_fd[1] = kvm_new_eventfd();
555552

556553
irq_routes.info.nr = 2;
557554

@@ -569,15 +566,8 @@ int main(int argc, char *argv[])
569566

570567
vm_ioctl(vm, KVM_SET_GSI_ROUTING, &irq_routes.info);
571568

572-
struct kvm_irqfd ifd = { };
573-
574-
ifd.fd = irq_fd[0];
575-
ifd.gsi = 32;
576-
vm_ioctl(vm, KVM_IRQFD, &ifd);
577-
578-
ifd.fd = irq_fd[1];
579-
ifd.gsi = 33;
580-
vm_ioctl(vm, KVM_IRQFD, &ifd);
569+
kvm_assign_irqfd(vm, 32, irq_fd[0]);
570+
kvm_assign_irqfd(vm, 33, irq_fd[1]);
581571

582572
struct sigaction sa = { };
583573
sa.sa_handler = handle_alrm;

0 commit comments

Comments
 (0)