On 29/03/2017 23:28, Michael S. Tsirkin wrote: >> Something like this? >> >> diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c >> index 03592c5..73e69ac 100644 >> --- a/hw/virtio/virtio.c >> +++ b/hw/virtio/virtio.c >> @@ -176,6 +176,10 @@ err_used: >> address_space_cache_destroy(&new->desc); >> err_desc: >> g_free(new); >> + atomic_rcu_set(&vq->vring.caches, NULL); >> + if (old) { >> + call_rcu(old, virtio_free_region_cache, rcu); >> + } >> } >> >> /* virt queue functions */ > I would be worried about call_rcu here - this means > something can hang on to and use the old cache, > and reset really must act as a sync/flush point.
The flush is done later in virtio_reset. Here it's just reacting asynchronously to the IOMMU reset. I'm thinking of adding a global generation count for IOMMU mappings, and forcing an update when the IOMMU mappings have changed. Paolo