Message ID | 1486456099-7345-4-git-send-email-peterx@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Tue, Feb 07, 2017 at 04:28:05PM +0800, Peter Xu wrote: > Linux vfio driver supports to do VFIO_IOMMU_UNMAP_DMA for a very big > region. This can be leveraged by QEMU IOMMU implementation to cleanup > existing page mappings for an entire iova address space (by notifying > with an IOTLB with extremely huge addr_mask). However current > vfio_iommu_map_notify() does not allow that. It make sure that all the > translated address in IOTLB is falling into RAM range. > > The check makes sense, but it should only be a sensible checker for > mapping operations, and mean little for unmap operations. > > This patch moves this check into map logic only, so that we'll get > faster unmap handling (no need to translate again), and also we can then > better support unmapping a very big region when it covers non-ram ranges > or even not-existing ranges. > > Acked-by: Alex Williamson <alex.williamson@redhat.com> > Signed-off-by: Peter Xu <peterx@redhat.com> Reviewed-by: David Gibson <david@gibson.dropbear.id.au> Seems sensible of itself, except that I don't understand how we were ever working before this. > --- > hw/vfio/common.c | 7 +++---- > 1 file changed, 3 insertions(+), 4 deletions(-) > > diff --git a/hw/vfio/common.c b/hw/vfio/common.c > index 42c4790..f3ba9b9 100644 > --- a/hw/vfio/common.c > +++ b/hw/vfio/common.c > @@ -352,11 +352,10 @@ static void vfio_iommu_map_notify(IOMMUNotifier *n, IOMMUTLBEntry *iotlb) > > rcu_read_lock(); > > - if (!vfio_get_vaddr(iotlb, &vaddr, &read_only)) { > - goto out; > - } > - > if ((iotlb->perm & IOMMU_RW) != IOMMU_NONE) { > + if (!vfio_get_vaddr(iotlb, &vaddr, &read_only)) { > + goto out; > + } > /* > * vaddr is only valid until rcu_read_unlock(). But after > * vfio_dma_map has set up the mapping the pages will be
diff --git a/hw/vfio/common.c b/hw/vfio/common.c index 42c4790..f3ba9b9 100644 --- a/hw/vfio/common.c +++ b/hw/vfio/common.c @@ -352,11 +352,10 @@ static void vfio_iommu_map_notify(IOMMUNotifier *n, IOMMUTLBEntry *iotlb) rcu_read_lock(); - if (!vfio_get_vaddr(iotlb, &vaddr, &read_only)) { - goto out; - } - if ((iotlb->perm & IOMMU_RW) != IOMMU_NONE) { + if (!vfio_get_vaddr(iotlb, &vaddr, &read_only)) { + goto out; + } /* * vaddr is only valid until rcu_read_unlock(). But after * vfio_dma_map has set up the mapping the pages will be