On Sat, Mar 21, 2020 at 03:41:42AM +0800, Alex Williamson wrote: > On Thu, 19 Mar 2020 02:24:33 -0400 > Yan Zhao <yan.y.zhao@xxxxxxxxx> wrote: > > On Thu, Mar 19, 2020 at 03:41:14AM +0800, Kirti Wankhede wrote: > > > diff --git a/drivers/vfio/vfio_iommu_type1.c b/drivers/vfio/vfio_iommu_type1.c > > > index 912629320719..deec09f4b0f6 100644 > > > --- a/drivers/vfio/vfio_iommu_type1.c > > > +++ b/drivers/vfio/vfio_iommu_type1.c > > > @@ -72,6 +72,7 @@ struct vfio_iommu { > > > bool v2; > > > bool nesting; > > > bool dirty_page_tracking; > > > + bool pinned_page_dirty_scope; > > > }; > > > > > > struct vfio_domain { > > > @@ -99,6 +100,7 @@ struct vfio_group { > > > struct iommu_group *iommu_group; > > > struct list_head next; > > > bool mdev_group; /* An mdev group */ > > > + bool pinned_page_dirty_scope; > > > }; > > > > > > struct vfio_iova { > > > @@ -132,6 +134,10 @@ struct vfio_regions { > > > static int put_pfn(unsigned long pfn, int prot); > > > static unsigned long vfio_pgsize_bitmap(struct vfio_iommu *iommu); > > > > > > +static struct vfio_group *vfio_iommu_find_iommu_group(struct vfio_iommu *iommu, > > > + struct iommu_group *iommu_group); > > > + > > > +static void update_pinned_page_dirty_scope(struct vfio_iommu *iommu); > > > /* > > > * This code handles mapping and unmapping of user data buffers > > > * into DMA'ble space using the IOMMU > > > @@ -556,11 +562,13 @@ static int vfio_unpin_page_external(struct vfio_dma *dma, dma_addr_t iova, > > > } > > > > > > static int vfio_iommu_type1_pin_pages(void *iommu_data, > > > + struct iommu_group *iommu_group, > > > unsigned long *user_pfn, > > > int npage, int prot, > > > unsigned long *phys_pfn) > > > { > > > struct vfio_iommu *iommu = iommu_data; > > > + struct vfio_group *group; > > > int i, j, ret; > > > unsigned long remote_vaddr; > > > struct vfio_dma *dma; > > > @@ -630,8 +638,14 @@ static int vfio_iommu_type1_pin_pages(void *iommu_data, > > > (vpfn->iova - dma->iova) >> pgshift, 1); > > > } > > > } > > > > Could you provide an interface lightweight than vfio_pin_pages for pass-through > > devices? e.g. vfio_mark_iova_dirty() > > > > Or at least allowing phys_pfn to be empty for pass-through devices. > > > > This is really inefficient: > > bitmap_set(dma->bitmap, (vpfn->iova - dma->iova) / pgsize, 1)); > > i.e. > > in order to mark an iova dirty, it has to go through iova ---> pfn --> iova > > while acquiring pfn is not necessary for pass-through devices. > > I think this would be possible, but I don't think it should be gating > to this series. We don't have such consumers yet. Thanks, > ok. Reasonable. Thanks Yan