Re: [PATCH v10 04/12] iommu: Add attach/detach_dev_pasid iommu interface

From: Baolu Lu
Date: Wed Jul 27 2022 - 22:45:03 EST


On 2022/7/26 21:57, Jason Gunthorpe wrote:
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.

This description reads more accurate and professional. Thank you! I will
update the patch with this.


+ /*
+ * 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.

Fair enough. Let's keep this in iommu for now and leave the possible
merging in PCI subsystem a future task.


If the fabric routes PASID properly then groups are not an issue - all
agree on this?

I still think the singleton group is required, but it's not related to
the PCI fabric routing discussed here.

We have a single array for PASIDs in the iommu group. All devices
sitting in the group should share a single PASID namespace. However both
the translation structures for IOMMU hardware or the device drivers can
only adapt to per-device PASID namespace. Hence, it's reasonable to
require the singleton group.

Best regards,
baolu