On 2017年03月29日 16:45, Cornelia Huck wrote:
On Wed, 29 Mar 2017 10:09:10 +0200
Paolo Bonzini <pbonz...@redhat.com> wrote:
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);
+ }
Maybe I'm just confused here, but isn't ->broken enough to prevent
further accesses?
Looks not (e.g virtio_queue_update_used_idx() that was called by vhost).
We only have pfn check for all helpers now.
And a reset will unset both ->broken and the caches
anyway? What am I missing?
Yes, but is it good to store invalid or even wrong mappings in the cache?
Thanks
}
/* virt queue functions */
Paolo