| Message ID | 20261001-fix-p2p-acs-v4-0-v9-3-1a8e0f50ddd9@nvidia.com |
|---|---|
| State | New |
| Headers | show |
| Series | PCI/P2PDMA: Route peer-to-peer DMA by TLP class | expand |
> From: Leon Romanovsky <leonro@nvidia.com> > > pci_acs_flags_enabled() and the Intel SPT PCH quirk use ACS registers > without checking config-space read errors. A failed read may leave control > state indeterminate yet allow the device to satisfy requested isolation > controls. > > Return false when either ACS capability or control state cannot be read. > An unknown state cannot prove isolation. > > Reviewed-by: Logan Gunthorpe <logang@deltatee.com> > Tested-by: Tushar Dave <tdave@nvidia.com> > Signed-off-by: Leon Romanovsky <leonro@nvidia.com> Sashiko has reviewed this patch and found no issues. It looks great!
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index b2879a6be5f8..f7d94ecf9157 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c @@ -3594,7 +3594,8 @@ static bool pci_acs_flags_enabled(struct pci_dev *pdev, u16 acs_flags) */ acs_flags &= (pdev->acs_capabilities | PCI_ACS_EC); - pci_read_config_word(pdev, pos + PCI_ACS_CTRL, &ctrl); + if (pci_read_config_word(pdev, pos + PCI_ACS_CTRL, &ctrl)) + return false; return (ctrl & acs_flags) == acs_flags; } diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index de9bbccda21f..d5c3e6802840 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c @@ -4992,10 +4992,12 @@ static int pci_quirk_intel_spt_pch_acs(struct pci_dev *dev, u16 acs_flags) return -ENOTTY; /* see pci_acs_flags_enabled() */ - pci_read_config_dword(dev, pos + PCI_ACS_CAP, &cap); + if (pci_read_config_dword(dev, pos + PCI_ACS_CAP, &cap)) + return 0; acs_flags &= (cap | PCI_ACS_EC); - pci_read_config_dword(dev, pos + INTEL_SPT_ACS_CTRL, &ctrl); + if (pci_read_config_dword(dev, pos + INTEL_SPT_ACS_CTRL, &ctrl)) + return 0; return pci_acs_ctrl_enabled(acs_flags, ctrl); }