]> www.infradead.org Git - users/hch/misc.git/commitdiff
vfio: selftests: Enable asserting MSI eventfds not firing
authorDavid Matlack <dmatlack@google.com>
Fri, 22 Aug 2025 21:24:57 +0000 (21:24 +0000)
committerAlex Williamson <alex.williamson@redhat.com>
Wed, 27 Aug 2025 18:14:04 +0000 (12:14 -0600)
Make it possible to assert that a given MSI eventfd did _not_ fire by
adding a helper to mark an eventfd non-blocking. Demonstrate this in
vfio_pci_device_test by asserting the MSI eventfd did not fire before
vfio_pci_irq_trigger().

Acked-by: Shuah Khan <skhan@linuxfoundation.org>
Signed-off-by: David Matlack <dmatlack@google.com>
Link: https://lore.kernel.org/r/20250822212518.4156428-11-dmatlack@google.com
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
tools/testing/selftests/vfio/lib/include/vfio_util.h
tools/testing/selftests/vfio/vfio_pci_device_test.c

index db08646c2819c60d3f66fcb43ff3755a5ca93d5c..9c928fcc00e2f53b3cd876859da00ceba2e290b2 100644 (file)
@@ -2,6 +2,7 @@
 #ifndef SELFTESTS_VFIO_LIB_INCLUDE_VFIO_UTIL_H
 #define SELFTESTS_VFIO_LIB_INCLUDE_VFIO_UTIL_H
 
+#include <fcntl.h>
 #include <string.h>
 #include <linux/vfio.h>
 #include <linux/list.h>
@@ -130,6 +131,17 @@ void vfio_pci_irq_enable(struct vfio_pci_device *device, u32 index,
 void vfio_pci_irq_disable(struct vfio_pci_device *device, u32 index);
 void vfio_pci_irq_trigger(struct vfio_pci_device *device, u32 index, u32 vector);
 
+static inline void fcntl_set_nonblock(int fd)
+{
+       int r;
+
+       r = fcntl(fd, F_GETFL, 0);
+       VFIO_ASSERT_NE(r, -1, "F_GETFL failed for fd %d\n", fd);
+
+       r = fcntl(fd, F_SETFL, r | O_NONBLOCK);
+       VFIO_ASSERT_NE(r, -1, "F_SETFL O_NONBLOCK failed for fd %d\n", fd);
+}
+
 static inline void vfio_pci_msi_enable(struct vfio_pci_device *device,
                                       u32 vector, int count)
 {
index 82e3c947f45d35f32141c3b3c7ed85b5d9fec5eb..1b5c2ff77e3f339b3bbcfe96bb35b118d5068c31 100644 (file)
@@ -129,6 +129,7 @@ FIXTURE_TEARDOWN(vfio_pci_irq_test)
 TEST_F(vfio_pci_irq_test, enable_trigger_disable)
 {
        bool msix = variant->irq_index == VFIO_PCI_MSIX_IRQ_INDEX;
+       int msi_eventfd;
        u32 count;
        u64 value;
        int i;
@@ -147,8 +148,15 @@ TEST_F(vfio_pci_irq_test, enable_trigger_disable)
        printf("MSI%s: enabled %d interrupts\n", msix ? "-x" : "", count);
 
        for (i = 0; i < count; i++) {
+               msi_eventfd = self->device->msi_eventfds[i];
+
+               fcntl_set_nonblock(msi_eventfd);
+               ASSERT_EQ(-1, read(msi_eventfd, &value, 8));
+               ASSERT_EQ(EAGAIN, errno);
+
                vfio_pci_irq_trigger(self->device, variant->irq_index, i);
-               ASSERT_EQ(8, read(self->device->msi_eventfds[i], &value, 8));
+
+               ASSERT_EQ(8, read(msi_eventfd, &value, 8));
                ASSERT_EQ(1, value);
        }