On Fri, Aug 15, 2025 at 08:55:28AM +0000, Tian, Kevin wrote: > > From: Nicolin Chen <nicolinc@xxxxxxxxxx> > > Sent: Tuesday, August 12, 2025 6:59 AM > > On the other hand, the iommu_get_domain_for_dev() API always returns the > > group->domain pointer, and several IOMMMU drivers call this API in their > > attach_dev callback functions to get the currently attached domain for a > > device, which will be broken for the recovery case mentioned above: > > 1. core asks the driver to attach dev from blocked to group->domain > > 2. driver attaches dev from group->domain to group->domain > > the 2nd bullet implies that a driver may skip the operation by noting that > old domain is same as the new one? Drivers uses iommu_get_domain_for_dev() to get the "old domain". But during a reset, it doesn't return the actual old domain that should be blocked domain but returns the group->domain. Driver needs the actual domain (blocked) in that case because it handles the requests from iommu_dev_reset_prepare/done(). > > So, iommu_get_domain_for_dev() should check the gdev flag and return the > > blocked domain if the flag is set. But the caller of this API could hold > > the group->mutex already or not, making it difficult to add the lock. > > > > Introduce a new iommu_get_domain_for_dev_locked() helper to be used by > > those drivers in a context that is already under the protection of the > > group->mutex, e.g. those attach_dev callback functions. And roll out the > > new helper to all the existing IOMMU drivers. > > iommu_get_domain_for_dev() is also called outside of attach_dev > callback functions, e.g. malidp_get_pgsize_bitmap(). and the returned > info according to the attached domain might be saved in static > structures, e.g.: > > ms->mmu_prefetch_pgsize = malidp_get_pgsize_bitmap(mp); > > would that cause weird issues when blocking domain is returned > though one may not expect reset to happen at that point? We aren't changing the iommu_get_domain_for_dev(). So, it should be used exclusively for functions that are outside group->mutex, like this one, i.e. they should still get the group->domain v.s. the blocked domain. Thanks Nicolin