Verify that opening a VFIO device through its cdev file and via
VFIO_GROUP_GET_DEVICE_FD both fail with -EBUSY if the device was
preserved across a Live Update. When a device file is preserve across a
Live Update, the file must be retrieved from /dev/liveupdate, not from
VFIO directly.

Signed-off-by: David Matlack <[email protected]>
---
 .../vfio/vfio_pci_liveupdate_kexec_test.c     | 38 +++++++++++++++++++
 1 file changed, 38 insertions(+)

diff --git a/tools/testing/selftests/vfio/vfio_pci_liveupdate_kexec_test.c 
b/tools/testing/selftests/vfio/vfio_pci_liveupdate_kexec_test.c
index 95644c3bd2d3..925c5fc30d56 100644
--- a/tools/testing/selftests/vfio/vfio_pci_liveupdate_kexec_test.c
+++ b/tools/testing/selftests/vfio/vfio_pci_liveupdate_kexec_test.c
@@ -36,6 +36,42 @@ static void before_kexec(int luo_fd)
        daemonize_and_wait();
 }
 
+static void check_open_vfio_device_fails(void)
+{
+       const char *cdev_path = vfio_pci_get_cdev_path(device_bdf);
+       struct vfio_pci_device *device;
+       struct iommu *iommu;
+       int ret, i;
+
+       printf("Checking open(%s) fails\n", cdev_path);
+       ret = open(cdev_path, O_RDWR);
+       VFIO_ASSERT_EQ(ret, -1);
+       VFIO_ASSERT_EQ(errno, EBUSY);
+       free((void *)cdev_path);
+
+       for (i = 0; i < nr_iommu_modes; i++) {
+               if (!iommu_modes[i].container_path)
+                       continue;
+
+               iommu = iommu_init(iommu_modes[i].name);
+
+               device = vfio_pci_device_alloc(device_bdf, iommu);
+               vfio_pci_group_setup(device);
+               vfio_pci_iommu_setup(device);
+
+               printf("Checking ioctl(group_fd, VFIO_GROUP_GET_DEVICE_FD, 
\"%s\") fails (%s)\n",
+                      device_bdf, iommu_modes[i].name);
+
+               ret = ioctl(device->group_fd, VFIO_GROUP_GET_DEVICE_FD, 
device->bdf);
+               VFIO_ASSERT_EQ(ret, -1);
+               VFIO_ASSERT_EQ(errno, EBUSY);
+
+               close(device->group_fd);
+               free(device);
+               iommu_cleanup(iommu);
+       }
+}
+
 static void after_kexec(int luo_fd, int state_session_fd)
 {
        struct vfio_pci_device *device;
@@ -44,6 +80,8 @@ static void after_kexec(int luo_fd, int state_session_fd)
        int device_fd;
        int stage;
 
+       check_open_vfio_device_fails();
+
        restore_and_read_stage(state_session_fd, STATE_TOKEN, &stage);
        VFIO_ASSERT_EQ(stage, 2);
 
-- 
2.52.0.487.g5c8c507ade-goog


Reply via email to