On Fri, Feb 03, 2023 at 08:31:52AM -0400, Jason Gunthorpe wrote: > On Fri, Feb 03, 2023 at 10:10:45AM +0000, Tian, Kevin wrote: > > > From: Nicolin Chen <nicolinc@xxxxxxxxxx> > > > Sent: Thursday, February 2, 2023 3:05 PM > > > > > > Support an access->ioas replacement in iommufd_access_set_ioas(), which > > > sets the access->ioas to NULL provisionally so that any further incoming > > > iommufd_access_pin_pages() callback can be blocked. > > > > > > Then, call access->ops->unmap() to clean up the entire iopt. To allow an > > > iommufd_access_unpin_pages() callback to happen via this unmap() call, > > > add an ioas_unpin pointer so the unpin routine won't be affected by the > > > "access->ioas = NULL" trick above. > > > > > > Also, a vdev without an ops->dma_unmap implementation cannot replace its > > > access->ioas pointer. So add an iommufd_access_ioas_is_attached() helper > > > to sanity that. > > > > > > > Presumably a driver which doesn't implement ops->dma_unmap shouldn't > > be allowed to do pin/unpin. But it could use vfio_dma_rw() to access an > > iova range. In the latter case I don't see why replace cannot work. > > > > Probably what's required here is to deny !ops->dma_unmap in > > vfio_pin/unpin_pages then making here replace always allowed? > > That makes sense Will change that in v2. Thanks Nic