From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33226) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1axqm6-0000Y1-1H for qemu-devel@nongnu.org; Wed, 04 May 2016 02:59:16 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1axqlu-00076E-9c for qemu-devel@nongnu.org; Wed, 04 May 2016 02:59:04 -0400 Received: from e23smtp07.au.ibm.com ([202.81.31.140]:60406) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1axqlt-00071r-MX for qemu-devel@nongnu.org; Wed, 04 May 2016 02:58:58 -0400 Received: from localhost by e23smtp07.au.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Wed, 4 May 2016 16:58:38 +1000 From: Alexey Kardashevskiy Date: Wed, 4 May 2016 16:52:13 +1000 Message-Id: <1462344751-28281-2-git-send-email-aik@ozlabs.ru> In-Reply-To: <1462344751-28281-1-git-send-email-aik@ozlabs.ru> References: <1462344751-28281-1-git-send-email-aik@ozlabs.ru> Subject: [Qemu-devel] [PATCH qemu v16 01/19] vfio: Delay DMA address space listener release List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Alexey Kardashevskiy , qemu-ppc@nongnu.org, Alexander Graf , David Gibson , Alex Williamson , Paolo Bonzini This postpones VFIO container deinitialization to let region_del() callbacks (called via vfio_listener_release) do proper clean up while the group is still attached to the container. Signed-off-by: Alexey Kardashevskiy --- hw/vfio/common.c | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/hw/vfio/common.c b/hw/vfio/common.c index fe5ec6a..0b40262 100644 --- a/hw/vfio/common.c +++ b/hw/vfio/common.c @@ -921,23 +921,31 @@ static void vfio_disconnect_container(VFIOGroup *group) { VFIOContainer *container = group->container; - if (ioctl(group->fd, VFIO_GROUP_UNSET_CONTAINER, &container->fd)) { - error_report("vfio: error disconnecting group %d from container", - group->groupid); - } - QLIST_REMOVE(group, container_next); + + if (QLIST_EMPTY(&container->group_list)) { + VFIOGuestIOMMU *giommu; + + vfio_listener_release(container); + + QLIST_FOREACH(giommu, &container->giommu_list, giommu_next) { + memory_region_unregister_iommu_notifier(&giommu->n); + } + } + group->container = NULL; + if (ioctl(group->fd, VFIO_GROUP_UNSET_CONTAINER, &container->fd)) { + error_report("vfio: error disconnecting group %d from container", + group->groupid); + } if (QLIST_EMPTY(&container->group_list)) { VFIOAddressSpace *space = container->space; VFIOGuestIOMMU *giommu, *tmp; - vfio_listener_release(container); QLIST_REMOVE(container, next); QLIST_FOREACH_SAFE(giommu, &container->giommu_list, giommu_next, tmp) { - memory_region_unregister_iommu_notifier(&giommu->n); QLIST_REMOVE(giommu, giommu_next); g_free(giommu); } -- 2.5.0.rc3