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

Reply via email to