On 13/03/18 11:49 AM, Sinan Kaya wrote:
And there's also the ACS problem which means if you want to use P2P on the root ports you'll have to disable ACS on the entire system. (Or preferably, the IOMMU groups need to get more sophisticated to allow for dynamic changes).
Do you think you can keep a pointer to the parent bridge instead of querying it
via get_upstream_bridge_port() here so that we can reuse your
pci_p2pdma_disable_acs() in the future.
Keep a pointer where? pci_p2pdma_disable_acs() and
pci_p2pdma_add_client() are used in completely different cases on
completely different devices. There really is no overlap and no obvious
place to store the port pointer (except in the struct pci_dev itself, in
which case why not just call the function again).
+int pci_p2pdma_disable_acs(struct pci_dev *pdev)
+{
+ struct pci_dev *up;
+ int pos;
+ u16 ctrl;
+
+ up = get_upstream_bridge_port(pdev);
+ if (!up)
+ return 0;
Some future device would only deal with pci_p2pdma_add_client(() for whitelisting
instead of changing all of your code.
That's a problem for whoever writes the future code.
We should at least limit the usage of get_upstream_bridge_port() family of functions
to probe time only.
Why?
We can tell iommu to do one to one translation by passing iommu.passthrough=1 to kernel
command line to have identical behavior to your switch case.
Well, someone will need to write code for all available IOMMUs to
support this. That's a very big project.
Logan