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? And a reset will unset both ->broken and the caches anyway? What am I missing? > } > > /* virt queue functions */ > > Paolo >