vfio/iommufd: Don't initialize nor set a HOST_IOMMU_DEVICE with mdev
mdevs aren't "physical" devices and when asking for backing IOMMU info, it fails the entire provisioning of the guest. Fix that by skipping HostIOMMUDevice initialization in the presence of mdevs, and skip setting an iommu device when it is known to be an mdev. Cc: Zhenzhong Duan <zhenzhong.duan@intel.com> Fixes: 930589520128 ("vfio/iommufd: Implement HostIOMMUDeviceClass::realize() handler") Signed-off-by: Joao Martins <joao.m.martins@oracle.com> Reviewed-by: Eric Auger <eric.auger@redhat.com> Reviewed-by: Zhenzhong Duan <zhenzhong.duan@intel.com>
This commit is contained in:
parent
13e522f644
commit
9f17604195
@ -1548,6 +1548,10 @@ bool vfio_attach_device(char *name, VFIODevice *vbasedev,
|
||||
return false;
|
||||
}
|
||||
|
||||
if (vbasedev->mdev) {
|
||||
return true;
|
||||
}
|
||||
|
||||
hiod = HOST_IOMMU_DEVICE(object_new(ops->hiod_typename));
|
||||
if (!HOST_IOMMU_DEVICE_GET_CLASS(hiod)->realize(hiod, vbasedev, errp)) {
|
||||
object_unref(hiod);
|
||||
|
@ -3115,7 +3115,8 @@ static void vfio_realize(PCIDevice *pdev, Error **errp)
|
||||
|
||||
vfio_bars_register(vdev);
|
||||
|
||||
if (!pci_device_set_iommu_device(pdev, vbasedev->hiod, errp)) {
|
||||
if (!vbasedev->mdev &&
|
||||
!pci_device_set_iommu_device(pdev, vbasedev->hiod, errp)) {
|
||||
error_prepend(errp, "Failed to set iommu_device: ");
|
||||
goto out_teardown;
|
||||
}
|
||||
@ -3238,7 +3239,9 @@ out_deregister:
|
||||
timer_free(vdev->intx.mmap_timer);
|
||||
}
|
||||
out_unset_idev:
|
||||
pci_device_unset_iommu_device(pdev);
|
||||
if (!vbasedev->mdev) {
|
||||
pci_device_unset_iommu_device(pdev);
|
||||
}
|
||||
out_teardown:
|
||||
vfio_teardown_msi(vdev);
|
||||
vfio_bars_exit(vdev);
|
||||
@ -3283,7 +3286,9 @@ static void vfio_exitfn(PCIDevice *pdev)
|
||||
vfio_pci_disable_rp_atomics(vdev);
|
||||
vfio_bars_exit(vdev);
|
||||
vfio_migration_exit(vbasedev);
|
||||
pci_device_unset_iommu_device(pdev);
|
||||
if (!vbasedev->mdev) {
|
||||
pci_device_unset_iommu_device(pdev);
|
||||
}
|
||||
}
|
||||
|
||||
static void vfio_pci_reset(DeviceState *dev)
|
||||
|
Loading…
x
Reference in New Issue
Block a user