On Mon, Jul 06, 2015 at 12:11:08PM +1000, Alexey Kardashevskiy wrote: > On systems with guest visible IOMMU, adding a new memory region onto > PCI bus calls vfio_listener_region_add() for every DMA window. This > installs a notifier for IOMMU memory regions. The notifier is supposed > to be removed by vfio_listener_region_del(), however in the case of mixed > PHB (emulated + VFIO devices) when last VFIO device is unplugged and > container gets destroyed, all existing DMA windows stay alive altogether > with the notifiers which are on the linked list which head was in > the destroyed container. > > This unregisters IOMMU memory region notifier when a container is > destroyed. > > Signed-off-by: Alexey Kardashevskiy <a...@ozlabs.ru>
Reviewed-by: David Gibson <da...@gibson.dropbear.id.au> Alex, I think this is correct, but you've probably got a better understanding of it. Will you take this through your tree? > --- > Changes: > v10: > * new to the patchset > --- > hw/vfio/common.c | 8 ++++++++ > 1 file changed, 8 insertions(+) > > diff --git a/hw/vfio/common.c b/hw/vfio/common.c > index 89ef37b..8eacfd7 100644 > --- a/hw/vfio/common.c > +++ b/hw/vfio/common.c > @@ -772,11 +772,19 @@ static void vfio_disconnect_container(VFIOGroup *group) > > if (QLIST_EMPTY(&container->group_list)) { > VFIOAddressSpace *space = container->space; > + VFIOGuestIOMMU *giommu, *tmp; > > if (container->iommu_data.release) { > container->iommu_data.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); > + } > + > trace_vfio_disconnect_container(container->fd); > close(container->fd); > g_free(container); -- David Gibson | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_ | _way_ _around_! http://www.ozlabs.org/~dgibson
pgpFMxaGOaPJ2.pgp
Description: PGP signature