Commit 74e5e3fb authored by Sean Christopherson's avatar Sean Christopherson
Browse files

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: default avatarK Prateek Nayak <kprateek.nayak@amd.com>
Acked-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lore.kernel.org/r/20250522235223.3178519-13-seanjc@google.com


Signed-off-by: default avatarSean Christopherson <seanjc@google.com>
parent 033b76bc
Loading
Loading
Loading
Loading
+3 −9
Original line number Diff line number Diff line
@@ -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++) {
+40 −0
Original line number Diff line number Diff line
@@ -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"
@@ -502,6 +503,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;
+4 −14
Original line number Diff line number Diff line
@@ -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;