On Wed, Jul 02, 2025 at 09:45:26AM +0000, Tian, Kevin wrote: > > From: Nicolin Chen <nicolinc@xxxxxxxxxx> > > Sent: Friday, June 27, 2025 3:35 AM > > > > +int iommufd_access_notify_unmap(struct io_pagetable *iopt, unsigned long > > iova, > > + unsigned long length) > > { > > struct iommufd_ioas *ioas = > > container_of(iopt, struct iommufd_ioas, iopt); > > struct iommufd_access *access; > > unsigned long index; > > + int ret = 0; > > > > xa_lock(&ioas->iopt.access_list); > > + /* Bypass any unmap if there is an internal access */ > > + xa_for_each(&ioas->iopt.access_list, index, access) { > > + if (iommufd_access_is_internal(access)) { > > + ret = -EBUSY; > > + goto unlock; > > + } > > + } > > + > > hmm all those checks are per iopt. Could do one-off check in > iopt_unmap_iova_range() and store the result in a local flag. > > Then use that flag to decide whether to return -EBUSY if > area->num_accesses is true in the loop. I don't quite follow this... Do you suggest to move this xa_for_each to iopt_unmap_iova_range? What's that local flag used for? Thanks Nicolin