> From: Baolu Lu <baolu.lu@xxxxxxxxxxxxxxx> > Sent: Thursday, April 24, 2025 11:27 AM > > On 4/24/25 10:06, Tushar Dave wrote: > > Generally PASID support requires ACS settings that usually create > > single device groups, but there are some niche cases where we can get > > multi-device groups and still have working PASID support. The primary > > issue is that PCI switches are not required to treat PASID tagged TLPs > > specially so appropriate ACS settings are required to route all TLPs to > > the host bridge if PASID is going to work properly. > > > > pci_enable_pasid() does check that each device that will use PASID has > > the proper ACS settings to achieve this routing. > > > > However, no-PASID devices can be combined with PASID capable devices > > within the same topology using non-uniform ACS settings. In this case > > the no-PASID devices may not have strict route to host ACS flags and > > end up being grouped with the PASID devices. Is there a detailed example? > > > > This configuration fails to allow use of the PASID within the iommu > > core code which wrongly checks if the no-PASID device supports PASID. > > > > Fix this by ignoring no-PASID devices during the PASID validation. They > > will never issue a PASID TLP anyhow so they can be ignored. > > > > Fixes: c404f55c26fc ("iommu: Validate the PASID in > iommu_attach_device_pasid()") > > Cc:stable@xxxxxxxxxxxxxxx > > Signed-off-by: Tushar Dave<tdave@xxxxxxxxxx> > > --- > > drivers/iommu/iommu.c | 8 +++++++- > > 1 file changed, 7 insertions(+), 1 deletion(-) > > > > diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c > > index 4f91a740c15f..e01df4c3e709 100644 > > --- a/drivers/iommu/iommu.c > > +++ b/drivers/iommu/iommu.c > > @@ -3440,7 +3440,13 @@ int iommu_attach_device_pasid(struct > iommu_domain *domain, > > > > mutex_lock(&group->mutex); > > for_each_group_device(group, device) { > > - if (pasid >= device->dev->iommu->max_pasids) { > > + /* > > + * Skip PASID validation for devices without PASID support > > + * (max_pasids = 0). These devices cannot issue transactions > > + * with PASID, so they don't affect group's PASID usage. > > + */ > > + if ((device->dev->iommu->max_pasids > 0) && > > + (pasid >= device->dev->iommu->max_pasids)) { > > What the iommu driver should do when set_dev_pasid is called for a non- > PASID device? The iommu driver has no sense of iommu group, hence it has > no knowledge about this device sharing an iommu group with another PASID > capable device. could add a similar check in __iommu_set_group_pasid() and __iommu_remove_group_pasid() to skip those devices.