On Tue, Jul 26, 2022 at 02:23:26PM +0800, Baolu Lu wrote:
On 2022/7/25 22:40, Jason Gunthorpe wrote:
On Sun, Jul 24, 2022 at 03:03:16PM +0800, Baolu Lu wrote:
How about rephrasing this part of commit message like below:
Some buses, like PCI, route packets without considering the PASID value.
Thus a DMA target address with PASID might be treated as P2P if the
address falls into the MMIO BAR of other devices in the group. To make
things simple, these interfaces only apply to devices belonging to the
singleton groups.
Considering that the PCI bus supports hot-plug, even a device boots with
a singleton group, a later hot-added device is still possible to share
the group, which breaks the singleton group assumption. In order to
avoid this situation, this interface requires that the ACS is enabled on
all devices on the path from the device to the host-PCI bridge.
But ACS directly fixes the routing issue above
This entire explanation can be recast as saying we block PASID
attachment in all cases where the PCI fabric is routing based on
address. ACS disables that.
Not sure it even has anything to do with hotplug or singleton??
Yes, agreed. I polished this patch like below. Does it look good to you?
iommu: Add attach/detach_dev_pasid iommu interface
Attaching an IOMMU domain to a PASID of a device is a generic operation
for modern IOMMU drivers which support PASID-granular DMA address
translation. Currently visible usage scenarios include (but not limited):
- SVA (Shared Virtual Address)
- kernel DMA with PASID
- hardware-assist mediated device
This adds a pair of domain ops for this purpose and adds the interfaces
for device drivers to attach/detach a domain to/from a {device,
PASID}.
The PCI bus routes packets without considering the PASID value.
More like:
Some configurations of the PCI fabric will route device originated TLP
packets based on memory address, and these configurations are
incompatible with PASID as the PASID packets form a distinct address
space. For instance any configuration where switches are present
without ACS is incompatible with PASID.
+ /*
+ * Block PASID attachment in all cases where the PCI fabric is
+ * routing based on address. ACS disables it.
+ */
+ if (dev_is_pci(dev) &&
+ !pci_acs_path_enabled(to_pci_dev(dev), NULL, REQ_ACS_FLAGS))
+ return -ENODEV;
I would probably still put this in a function just to be clear, and
probably even a PCI layer funcion 'pci_is_pasid_supported' that
clearly indicates that the fabric path can route a PASID packet
without mis-routing it.
If the fabric routes PASID properly then groups are not an issue - all
agree on this?