diff options
author | Zhenzhong Duan <zhenzhong.duan@intel.com> | 2025-04-23 15:28:21 +0800 |
---|---|---|
committer | Cédric Le Goater <clg@redhat.com> | 2025-04-25 09:01:38 +0200 |
commit | c45d88b8a2f25600c69748bfcf37911412c396ab (patch) | |
tree | 54b6028f0e8777bef22e55e4f8cb18333f56aca0 | |
parent | 436114cc4390ff46535229e67e43056196a971c1 (diff) | |
download | qemu-c45d88b8a2f25600c69748bfcf37911412c396ab.zip qemu-c45d88b8a2f25600c69748bfcf37911412c396ab.tar.gz qemu-c45d88b8a2f25600c69748bfcf37911412c396ab.tar.bz2 |
vfio/iommufd: Move realize() after attachment
Previously device attaching depends on realize() getting host IOMMU
capabilities to check dirty tracking support.
Now we have a separate call to ioctl(IOMMU_GET_HW_INFO) to get host
IOMMU capabilities and check that for dirty tracking support, there
is no dependency any more, move realize() call after attachment
succeed.
Suggested-by: Cédric Le Goater <clg@redhat.com>
Suggested-by: Donald Dutile <ddutile@redhat.com>
Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com>
Reviewed-by: Joao Martins <joao.m.martins@oracle.com>
Reviewed-by: Cédric Le Goater <clg@redhat.com>
Link: https://lore.kernel.org/qemu-devel/20250423072824.3647952-3-zhenzhong.duan@intel.com
Signed-off-by: Cédric Le Goater <clg@redhat.com>
-rw-r--r-- | hw/vfio/iommufd.c | 17 |
1 files changed, 6 insertions, 11 deletions
diff --git a/hw/vfio/iommufd.c b/hw/vfio/iommufd.c index 2253778..f273dc8 100644 --- a/hw/vfio/iommufd.c +++ b/hw/vfio/iommufd.c @@ -500,17 +500,6 @@ static bool iommufd_cdev_attach(const char *name, VFIODevice *vbasedev, space = vfio_address_space_get(as); - /* - * The HostIOMMUDevice data from legacy backend is static and doesn't need - * any information from the (type1-iommu) backend to be initialized. In - * contrast however, the IOMMUFD HostIOMMUDevice data requires the iommufd - * FD to be connected and having a devid to be able to successfully call - * iommufd_backend_get_device_info(). - */ - if (!vfio_device_hiod_realize(vbasedev, errp)) { - goto err_alloc_ioas; - } - /* try to attach to an existing container in this space */ QLIST_FOREACH(bcontainer, &space->containers, next) { container = container_of(bcontainer, VFIOIOMMUFDContainer, bcontainer); @@ -585,6 +574,10 @@ found_container: goto err_listener_register; } + if (!vfio_device_hiod_realize(vbasedev, errp)) { + goto err_hiod_realize; + } + /* * TODO: examine RAM_BLOCK_DISCARD stuff, should we do group level * for discarding incompatibility check as well? @@ -606,6 +599,8 @@ found_container: vbasedev->num_regions, vbasedev->flags); return true; +err_hiod_realize: + vfio_cpr_unregister_container(bcontainer); err_listener_register: iommufd_cdev_ram_block_discard_disable(false); err_discard_disable: |