On Mon, 22 Jan 2018 14:02:43 +0800 Peter Xu <pet...@redhat.com> wrote:
> After next patch, listener unregister will need the container to be > alive. Let's move this unregister phase to be before unset container, > since that operation will free the backend container in kernel, > otherwise we'll get these after next patch: > > qemu-system-x86_64: VFIO_UNMAP_DMA: -22 > qemu-system-x86_64: vfio_dma_unmap(0x559bf53a4590, 0x0, 0xa0000) = -22 > (Invalid argument) > > Signed-off-by: Peter Xu <pet...@redhat.com> > --- Acked-by: Alex Williamson <alex.william...@redhat.com> Not sure which branch this will go through, let me know if mine. Thanks, Alex > hw/vfio/common.c | 16 ++++++++++++---- > 1 file changed, 12 insertions(+), 4 deletions(-) > > diff --git a/hw/vfio/common.c b/hw/vfio/common.c > index b77be3a8b3..76cf28d462 100644 > --- a/hw/vfio/common.c > +++ b/hw/vfio/common.c > @@ -1161,19 +1161,27 @@ static void vfio_disconnect_container(VFIOGroup > *group) > { > VFIOContainer *container = group->container; > > + QLIST_REMOVE(group, container_next); > + group->container = NULL; > + > + /* > + * Explicitly release the listener first before unset container, > + * since unset may destroy the backend container if it's the last > + * group. > + */ > + if (QLIST_EMPTY(&container->group_list)) { > + vfio_listener_release(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); > - group->container = NULL; > - > 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) {