From f3028b7d2d9895799159433ccb18180c2d4d1516 Mon Sep 17 00:00:00 2001 From: Zhenzhong Duan Date: Thu, 24 Apr 2025 14:33:55 +0800 Subject: [PATCH] vfio: Register/unregister container for CPR only once for each container MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit vfio_cpr_register_container and vfio_cpr_unregister_container are container scoped function. Calling them for each device attaching/detaching would corrupt CPR reboot notifier list, i.e., when two VFIO devices are attached to same container and have same notifier registered twice. Fixes: d9fa4223b30a ("vfio: register container for cpr") Signed-off-by: Zhenzhong Duan Reviewed-by: Cédric Le Goater Link: https://lore.kernel.org/qemu-devel/20250424063355.3855174-1-zhenzhong.duan@intel.com Signed-off-by: Cédric Le Goater --- hw/vfio/iommufd.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/hw/vfio/iommufd.c b/hw/vfio/iommufd.c index f24054a6a5..b2f72dc8c3 100644 --- a/hw/vfio/iommufd.c +++ b/hw/vfio/iommufd.c @@ -416,6 +416,7 @@ static void iommufd_cdev_container_destroy(VFIOIOMMUFDContainer *container) if (!QLIST_EMPTY(&bcontainer->device_list)) { return; } + vfio_cpr_unregister_container(bcontainer); vfio_listener_unregister(bcontainer); iommufd_backend_free_id(container->be, container->ioas_id); object_unref(container); @@ -561,6 +562,10 @@ static bool iommufd_cdev_attach(const char *name, VFIODevice *vbasedev, goto err_listener_register; } + if (!vfio_cpr_register_container(bcontainer, errp)) { + goto err_listener_register; + } + bcontainer->initialized = true; found_container: @@ -570,13 +575,9 @@ found_container: goto err_listener_register; } - if (!vfio_cpr_register_container(bcontainer, errp)) { - goto err_listener_register; - } - if (!vfio_device_hiod_create_and_realize(vbasedev, TYPE_HOST_IOMMU_DEVICE_IOMMUFD_VFIO, errp)) { - goto err_hiod_realize; + goto err_listener_register; } /* @@ -600,8 +601,6 @@ 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: @@ -632,7 +631,6 @@ static void iommufd_cdev_detach(VFIODevice *vbasedev) } object_unref(vbasedev->hiod); - vfio_cpr_unregister_container(bcontainer); iommufd_cdev_detach_container(vbasedev, container); iommufd_cdev_container_destroy(container); vfio_address_space_put(space); -- 2.39.5