Use the given VFIO cdev FD to initialize vfio_pci_device in VFIO
selftests. Add the assertion to make sure that passed cdev FD is not
used with legacy VFIO APIs. If VFIO cdev FD is provided then do not open
the device instead use the FD for any interaction with the device.

This API will allow writing selftests where VFIO device FD is preserved
using liveupdate and retrieved later using liveupdate ioctl after kexec.

Co-developed-by: David Matlack <[email protected]>
Signed-off-by: David Matlack <[email protected]>
Signed-off-by: Vipin Sharma <[email protected]>
---
 .../lib/include/libvfio/vfio_pci_device.h     |  3 +++
 .../selftests/vfio/lib/vfio_pci_device.c      | 25 ++++++++++++++-----
 2 files changed, 22 insertions(+), 6 deletions(-)

diff --git a/tools/testing/selftests/vfio/lib/include/libvfio/vfio_pci_device.h 
b/tools/testing/selftests/vfio/lib/include/libvfio/vfio_pci_device.h
index 3eabead717bb..66fc29662daa 100644
--- a/tools/testing/selftests/vfio/lib/include/libvfio/vfio_pci_device.h
+++ b/tools/testing/selftests/vfio/lib/include/libvfio/vfio_pci_device.h
@@ -40,6 +40,9 @@ struct vfio_pci_device {
 
 struct vfio_pci_device *vfio_pci_device_alloc(const char *bdf, struct iommu 
*iommu);
 void vfio_pci_device_free(struct vfio_pci_device *device);
+struct vfio_pci_device *__vfio_pci_device_init(const char *bdf,
+                                              struct iommu *iommu,
+                                              int device_fd);
 struct vfio_pci_device *vfio_pci_device_init(const char *bdf, struct iommu 
*iommu);
 void vfio_pci_device_cleanup(struct vfio_pci_device *device);
 
diff --git a/tools/testing/selftests/vfio/lib/vfio_pci_device.c 
b/tools/testing/selftests/vfio/lib/vfio_pci_device.c
index 94dc5fcecbeb..a6e0e7c6e18e 100644
--- a/tools/testing/selftests/vfio/lib/vfio_pci_device.c
+++ b/tools/testing/selftests/vfio/lib/vfio_pci_device.c
@@ -414,9 +414,13 @@ void vfio_pci_cdev_open(struct vfio_pci_device *device, 
const char *bdf)
 }
 
 static void vfio_pci_iommufd_setup(struct vfio_pci_device *device,
-                                  const char *bdf, const char *vf_token)
+                                  const char *bdf, int device_fd,
+                                  const char *vf_token)
 {
-       vfio_pci_cdev_open(device, bdf);
+       if (device_fd >= 0)
+               device->fd = device_fd;
+       else
+               vfio_pci_cdev_open(device, bdf);
        vfio_device_bind_iommufd(device->fd, device->iommu->iommufd, vf_token);
        vfio_device_attach_iommufd_pt(device->fd, device->iommu->ioas_id);
 }
@@ -440,16 +444,20 @@ void vfio_pci_device_free(struct vfio_pci_device *device)
        free(device);
 }
 
-struct vfio_pci_device *vfio_pci_device_init(const char *bdf, struct iommu 
*iommu)
+struct vfio_pci_device *__vfio_pci_device_init(const char *bdf,
+                                              struct iommu *iommu,
+                                              int device_fd)
 {
        struct vfio_pci_device *device;
 
        device = vfio_pci_device_alloc(bdf, iommu);
 
-       if (iommu->mode->container_path)
+       if (iommu->mode->container_path) {
+               VFIO_ASSERT_EQ(device_fd, -1);
                vfio_pci_container_setup(device, bdf, NULL);
-       else
-               vfio_pci_iommufd_setup(device, bdf, NULL);
+       } else {
+               vfio_pci_iommufd_setup(device, bdf, device_fd, NULL);
+       }
 
        vfio_pci_device_setup(device);
        vfio_pci_driver_probe(device);
@@ -457,6 +465,11 @@ struct vfio_pci_device *vfio_pci_device_init(const char 
*bdf, struct iommu *iomm
        return device;
 }
 
+struct vfio_pci_device *vfio_pci_device_init(const char *bdf, struct iommu 
*iommu)
+{
+       return __vfio_pci_device_init(bdf, iommu, /*device_fd=*/-1);
+}
+
 void vfio_pci_device_cleanup(struct vfio_pci_device *device)
 {
        int i;
-- 
2.55.0.795.g602f6c329a-goog


Reply via email to