On 29/03/2017 10:00, Jason Wang wrote: > > > 1) vtd was reset first > > 2) during the reset of virtio-net-pci #1, deletion of msix subregion > will cause a commit of all memory listeners > > 3) virito-net-pci #2's region cache will be update, but since vtd has > already been reset, it can't get a valid mappings here > > Any ideas on how to fix this? Need region cache be aware of IOMMU/IOTLB > state in this case? Or can we simply reset IOMMU as the last one?
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 */ Paolo