On 9/8/26 18:07, Tushar Dave wrote:
A VF fails to bind through the iommufd/cdev backend when its PF is
bound to vfio-pci and requires a matching VF token.
QEMU currently initializes struct vfio_device_bind_iommufd without
the token flag or token UUID.
Pass the existing vf-token device property to the IOMMUFD bind ioctl
for PCI devices.
Signed-off-by: Tushar Dave <[email protected]>
---
hw/vfio/iommufd.c | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/hw/vfio/iommufd.c b/hw/vfio/iommufd.c
index 242644aa00..de482128bf 100644
--- a/hw/vfio/iommufd.c
+++ b/hw/vfio/iommufd.c
@@ -155,6 +155,7 @@ static void iommufd_cdev_kvm_device_del(VFIODevice
*vbasedev)
static bool iommufd_cdev_connect_and_bind(VFIODevice *vbasedev, Error **errp)
{
+ VFIOPCIDevice *vdev = vfio_pci_from_vfio_device(vbasedev);
IOMMUFDBackend *iommufd = vbasedev->iommufd;
struct vfio_device_bind_iommufd bind = {
.argsz = sizeof(bind),
@@ -180,6 +181,15 @@ static bool iommufd_cdev_connect_and_bind(VFIODevice
*vbasedev, Error **errp)
/* Bind device to iommufd */
bind.iommufd = iommufd->fd;
+
+ /*
+ * Pass the VF token when binding a PCI device.
+ */
+ if (vdev && !qemu_uuid_is_null(&vdev->vf_token)) {
+ bind.flags |= VFIO_DEVICE_BIND_FLAG_TOKEN;
+ bind.token_uuid_ptr = (uintptr_t)&vdev->vf_token;
+ }
+
if (ioctl(vbasedev->fd, VFIO_DEVICE_BIND_IOMMUFD, &bind)) {
error_setg_errno(errp, errno, "error bind device fd=%d to iommufd=%d",
vbasedev->fd, bind.iommufd);
Reviewed-by: Cédric Le Goater <[email protected]>
Thanks,
C.