Re: [PATCH v11 04/13] PCI: Allow PASID only when ACS enforced on upstreaming path

From: Baolu Lu
Date: Thu Aug 18 2022 - 07:53:31 EST


Hi Bjorn,

On 2022/8/18 05:17, Bjorn Helgaas wrote:
On Wed, Aug 17, 2022 at 09:20:15AM +0800, Lu Baolu wrote:
Some configurations of the PCI fabric will route device originated TLP
packets based on the memory addresses.
This makes it sound like a few unusual configurations will route TLPs
based on memory addresses, but address routing is the default for all
PCIe Memory Requests, and ACS provides a way to override that default.

These configurations are incompatible with PASID as the PASID
packets form a distinct address space.
I would say "the Requester ID/PASID combination forms a distinct
address space."

For instance, any configuration where switches are present
without ACS enabled is incompatible.

This enhances the pci_enable_pasid() interface by requiring the ACS to
support Source Validation, Request Redirection, Completer Redirection,
and Upstream Forwarding. This effectively means that devices cannot
spoof their requester ID, requests and completions cannot be redirected,
and all transactions are forwarded upstream, even as it passes through a
bridge where the target device is downstream.
I think your patch actually requires all those features to be not just
"supported" but actually*enabled* for the entire path leading to the
device.

To use the terms from the spec:

"P2P Request Redirect"
"P2P Completion Redirect"
"Requester ID, Requests, and Completions"

and maybe something like:

... even if the TLP looks like a P2P Request because its memory
address (ignoring the PASID) would fall in a bridge window and would
normally be routed downstream.

Thank you for the suggestions. I will rephrase the commit message
accordingly like this:


PCI: Allow PASID only when ACS enforced on upstreaming path

The PCIe fabric routes TLPs based on memory addresses for all PCIe Memory
Requests regardless of whether TLPs have PASID prefixes. This is stated in
section "2.2.10.2 End-End TLP Prefix Processing" of the specification:

The presence of an End-End TLP Prefix does not alter the routing of a
TLP. TLPs are routed based on the routing rules covered in Section
2.2.4 .

As the Requester ID/PASID combination forms a distinct address space. The
memory address based routing is not compatible for PASID TLPs anymore.
Therefore we have to rely on ACS to override that default.

This enhances pci_enable_pasid() interface by requiring the ACS features
to be enabled for the entire path leading to the device. So that even if
the TLP looks like a P2P Request because its memory address (ignoring the
PASID) would fall in a bridge window and would normally be routed
downstream.

Best regards,
baolu