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 > Signed-off-by: Peter Xu Reviewed-by: David Gibson 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 -- David Gibson | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_ | _way_ _around_! http://www.ozlabs.org/~dgibson