From: Raghavendra Rao Ananta <rananta@google.com>
To: David Matlack <dmatlack@google.com>,
Alex Williamson <alex@shazbot.org>,
Alex Williamson <alex.williamson@redhat.com>
Cc: Josh Hilke <jrhilke@google.com>,
kvm@vger.kernel.org, linux-kernel@vger.kernel.org,
Raghavendra Rao Ananta <rananta@google.com>
Subject: [PATCH 2/4] vfio: selftests: Export vfio_pci_device functions
Date: Tue, 4 Nov 2025 00:35:34 +0000 [thread overview]
Message-ID: <20251104003536.3601931-3-rananta@google.com> (raw)
In-Reply-To: <20251104003536.3601931-1-rananta@google.com>
Refactor and make the functions called under device initialization
public. A later patch adds a test that calls these functions to validate
the UAPI of SR-IOV devices. Opportunistically, to test the success
and failure cases of the UAPI, split the functions dealing with
VFIO_GROUP_GET_DEVICE_FD and VFIO_DEVICE_BIND_IOMMUFD into a core
function and another one that asserts the ioctl. The former will be
used for testing the SR-IOV UAPI, hence only export these.
Signed-off-by: Raghavendra Rao Ananta <rananta@google.com>
---
.../selftests/vfio/lib/include/vfio_util.h | 13 ++++
.../selftests/vfio/lib/vfio_pci_device.c | 75 +++++++++++++------
2 files changed, 67 insertions(+), 21 deletions(-)
diff --git a/tools/testing/selftests/vfio/lib/include/vfio_util.h b/tools/testing/selftests/vfio/lib/include/vfio_util.h
index b01068d98fdab..2baf12a888e67 100644
--- a/tools/testing/selftests/vfio/lib/include/vfio_util.h
+++ b/tools/testing/selftests/vfio/lib/include/vfio_util.h
@@ -294,4 +294,17 @@ void vfio_pci_driver_memcpy_start(struct vfio_pci_device *device,
int vfio_pci_driver_memcpy_wait(struct vfio_pci_device *device);
void vfio_pci_driver_send_msi(struct vfio_pci_device *device);
+const char *iommu_mode_container_path(const char *iommu_mode);
+const struct vfio_iommu_mode *lookup_iommu_mode(const char *iommu_mode);
+
+void vfio_container_open(struct vfio_pci_device *device);
+void vfio_pci_group_setup(struct vfio_pci_device *device, const char *bdf);
+void vfio_container_set_iommu(struct vfio_pci_device *device);
+void __vfio_container_get_device_fd(struct vfio_pci_device *device,
+ const char *bdf, const char *vf_token);
+
+void vfio_pci_iommufd_cdev_open(struct vfio_pci_device *device, const char *bdf);
+void vfio_pci_iommufd_iommudev_open(struct vfio_pci_device *device);
+int __vfio_device_bind_iommufd(int device_fd, int iommufd, const char *vf_token);
+
#endif /* SELFTESTS_VFIO_LIB_INCLUDE_VFIO_UTIL_H */
diff --git a/tools/testing/selftests/vfio/lib/vfio_pci_device.c b/tools/testing/selftests/vfio/lib/vfio_pci_device.c
index 3f7be8d371d06..7a1547e365870 100644
--- a/tools/testing/selftests/vfio/lib/vfio_pci_device.c
+++ b/tools/testing/selftests/vfio/lib/vfio_pci_device.c
@@ -311,7 +311,7 @@ static unsigned int vfio_pci_get_group_from_dev(const char *bdf)
return group;
}
-static void vfio_pci_group_setup(struct vfio_pci_device *device, const char *bdf)
+void vfio_pci_group_setup(struct vfio_pci_device *device, const char *bdf)
{
struct vfio_group_status group_status = {
.argsz = sizeof(group_status),
@@ -331,9 +331,8 @@ static void vfio_pci_group_setup(struct vfio_pci_device *device, const char *bdf
ioctl_assert(device->group_fd, VFIO_GROUP_SET_CONTAINER, &device->container_fd);
}
-static void vfio_pci_container_get_device_fd(struct vfio_pci_device *device,
- const char *bdf,
- const char *vf_token)
+void __vfio_container_get_device_fd(struct vfio_pci_device *device,
+ const char *bdf, const char *vf_token)
{
char *arg = (char *) bdf;
@@ -356,32 +355,46 @@ static void vfio_pci_container_get_device_fd(struct vfio_pci_device *device,
if (vf_token)
free((void *) arg);
+}
+static void vfio_container_get_device_fd(struct vfio_pci_device *device,
+ const char *bdf,
+ const char *vf_token)
+{
+ __vfio_container_get_device_fd(device, bdf, vf_token);
VFIO_ASSERT_GE(device->fd, 0);
}
-static void vfio_pci_container_setup(struct vfio_pci_device *device,
- const char *bdf, const char *vf_token)
+void vfio_container_set_iommu(struct vfio_pci_device *device)
{
unsigned long iommu_type = device->iommu_mode->iommu_type;
+ int ret;
+
+ ret = ioctl(device->container_fd, VFIO_CHECK_EXTENSION, iommu_type);
+ VFIO_ASSERT_GT(ret, 0, "VFIO IOMMU type %lu not supported\n", iommu_type);
+
+ ioctl_assert(device->container_fd, VFIO_SET_IOMMU, (void *)iommu_type);
+}
+
+void vfio_container_open(struct vfio_pci_device *device)
+{
const char *path = device->iommu_mode->container_path;
int version;
- int ret;
device->container_fd = open(path, O_RDWR);
VFIO_ASSERT_GE(device->container_fd, 0, "open(%s) failed\n", path);
version = ioctl(device->container_fd, VFIO_GET_API_VERSION);
VFIO_ASSERT_EQ(version, VFIO_API_VERSION, "Unsupported version: %d\n", version);
+}
+static void vfio_pci_container_setup(struct vfio_pci_device *device,
+ const char *bdf, const char *vf_token)
+{
+ vfio_container_open(device);
vfio_pci_group_setup(device, bdf);
-
- ret = ioctl(device->container_fd, VFIO_CHECK_EXTENSION, iommu_type);
- VFIO_ASSERT_GT(ret, 0, "VFIO IOMMU type %lu not supported\n", iommu_type);
-
- ioctl_assert(device->container_fd, VFIO_SET_IOMMU, (void *)iommu_type);
-
- vfio_pci_container_get_device_fd(device, bdf, vf_token);
+ vfio_container_set_iommu(device);
+ vfio_container_get_device_fd(device, bdf, vf_token);
}
static void vfio_pci_device_setup(struct vfio_pci_device *device)
@@ -471,7 +484,7 @@ static const struct vfio_iommu_mode iommu_modes[] = {
const char *default_iommu_mode = "iommufd";
-static const struct vfio_iommu_mode *lookup_iommu_mode(const char *iommu_mode)
+const struct vfio_iommu_mode *lookup_iommu_mode(const char *iommu_mode)
{
int i;
@@ -488,7 +501,12 @@ static const struct vfio_iommu_mode *lookup_iommu_mode(const char *iommu_mode)
VFIO_FAIL("Unrecognized IOMMU mode: %s\n", iommu_mode);
}
-static void vfio_device_bind_iommufd(int device_fd, int iommufd, const char *vf_token)
+const char *iommu_mode_container_path(const char *iommu_mode)
+{
+ return lookup_iommu_mode(iommu_mode)->container_path;
+}
+
+int __vfio_device_bind_iommufd(int device_fd, int iommufd, const char *vf_token)
{
struct vfio_device_bind_iommufd args = {
.argsz = sizeof(args),
@@ -502,7 +520,14 @@ static void vfio_device_bind_iommufd(int device_fd, int iommufd, const char *vf_
args.token_uuid_ptr = (u64) token_uuid;
}
- ioctl_assert(device_fd, VFIO_DEVICE_BIND_IOMMUFD, &args);
+ return ioctl(device_fd, VFIO_DEVICE_BIND_IOMMUFD, &args);
+}
+
+static void vfio_device_bind_iommufd(int device_fd, int iommufd, const char *vf_token)
+{
+ int ret = __vfio_device_bind_iommufd(device_fd, iommufd, vf_token);
+
+ VFIO_ASSERT_EQ(ret, 0, "Failed VFIO_DEVICE_BIND_IOMMUFD ioctl\n");
}
static u32 iommufd_ioas_alloc(int iommufd)
@@ -525,23 +550,31 @@ static void vfio_device_attach_iommufd_pt(int device_fd, u32 pt_id)
ioctl_assert(device_fd, VFIO_DEVICE_ATTACH_IOMMUFD_PT, &args);
}
-static void vfio_pci_iommufd_setup(struct vfio_pci_device *device,
- const char *bdf, const char *vf_token)
+void vfio_pci_iommufd_cdev_open(struct vfio_pci_device *device, const char *bdf)
{
const char *cdev_path = vfio_pci_get_cdev_path(bdf);
device->fd = open(cdev_path, O_RDWR);
VFIO_ASSERT_GE(device->fd, 0);
free((void *)cdev_path);
+}
+void vfio_pci_iommufd_iommudev_open(struct vfio_pci_device *device)
+{
/*
* Require device->iommufd to be >0 so that a simple non-0 check can be
* used to check if iommufd is enabled. In practice open() will never
* return 0 unless stdin is closed.
*/
- device->iommufd = open("/dev/iommu", O_RDWR);
- VFIO_ASSERT_GT(device->iommufd, 0);
+ device->iommufd = open("/dev/iommu", O_RDWR);
+ VFIO_ASSERT_GT(device->iommufd, 0);
+}
+static void vfio_pci_iommufd_setup(struct vfio_pci_device *device,
+ const char *bdf, const char *vf_token)
+{
+ vfio_pci_iommufd_cdev_open(device, bdf);
+ vfio_pci_iommufd_iommudev_open(device);
vfio_device_bind_iommufd(device->fd, device->iommufd, vf_token);
device->ioas_id = iommufd_ioas_alloc(device->iommufd);
vfio_device_attach_iommufd_pt(device->fd, device->ioas_id);
--
2.51.2.997.g839fc31de9-goog
next prev parent reply other threads:[~2025-11-04 0:35 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-11-04 0:35 [PATCH 0/4] vfio: selftest: Add SR-IOV UAPI test Raghavendra Rao Ananta
2025-11-04 0:35 ` [PATCH 1/4] vfio: selftests: Add support for passing vf_token in device init Raghavendra Rao Ananta
2025-11-05 23:52 ` David Matlack
2025-11-06 0:12 ` David Matlack
2025-11-06 16:33 ` Raghavendra Rao Ananta
2025-11-06 16:26 ` Raghavendra Rao Ananta
2025-11-06 17:17 ` David Matlack
2025-11-07 2:46 ` Raghavendra Rao Ananta
2025-11-06 0:14 ` David Matlack
2025-11-06 16:36 ` Raghavendra Rao Ananta
2025-11-06 17:10 ` David Matlack
2025-11-04 0:35 ` Raghavendra Rao Ananta [this message]
2025-11-06 0:41 ` [PATCH 2/4] vfio: selftests: Export vfio_pci_device functions David Matlack
2025-11-06 16:43 ` Raghavendra Rao Ananta
2025-11-06 17:08 ` David Matlack
2025-11-04 0:35 ` [PATCH 3/4] vfio: selftests: Add helper to set/override a vf_token Raghavendra Rao Ananta
2025-11-06 0:01 ` David Matlack
2025-11-06 16:44 ` Raghavendra Rao Ananta
2025-11-04 0:35 ` [PATCH 4/4] vfio: selftests: Add tests to validate SR-IOV UAPI Raghavendra Rao Ananta
2025-11-06 1:00 ` David Matlack
2025-11-06 17:05 ` Raghavendra Rao Ananta
2025-11-06 17:34 ` David Matlack
2025-11-07 2:56 ` Raghavendra Rao Ananta
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20251104003536.3601931-3-rananta@google.com \
--to=rananta@google.com \
--cc=alex.williamson@redhat.com \
--cc=alex@shazbot.org \
--cc=dmatlack@google.com \
--cc=jrhilke@google.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.