On Thu, Oct 01, 2026 at 12:08:07PM +0000, [email protected] wrote:
> Thank you for your contribution! Sashiko AI review found 1 potential issue(s) 
> to consider:
> - [Medium] pci/p2pdma: pure clients cannot set ats_per_mapping because 
> pdev->p2pdma is NULL
> --
> 
> commit f332086fc4a4273d099c81fafb33298021d47d1a
> Author: Leon Romanovsky <[email protected]>
> 
> PCI/P2PDMA: Let a client declare that it selects ATS per mapping
> 
> The PCIe ATS Enable bit covers the whole device, so P2PDMA cannot tell
> from it whether a client will translate a given address. Most devices
> translate any address once ATS is enabled, but some choose ATS per DMA
> mapping and can still use bus addresses for the rest.
> 
> Add pcim_p2pdma_set_ats_per_mapping() so the driver of such a device can
> declare that before P2PDMA starts treating clients with ATS enabled as
> translating everything.
> 
> > diff --git a/drivers/pci/p2pdma.c b/drivers/pci/p2pdma.c
> > index cf190bd572d4a..6a63901c65fb6 100644
> > --- a/drivers/pci/p2pdma.c
> > +++ b/drivers/pci/p2pdma.c
> 
> [ ... ]
> 
> > @@ -1562,6 +1563,32 @@ void pci_p2pmem_publish(struct pci_dev *pdev, bool 
> > publish)
> >  }
> >  EXPORT_SYMBOL_GPL(pci_p2pmem_publish);
> >  
> > +/**
> > + * pcim_p2pdma_set_ats_per_mapping - Declare per-mapping ATS for a client
> > + * @pdev: PCI device that initiates peer-to-peer DMA
> > + *
> > + * Declare that @pdev issues Translated Requests only for the DMA mappings 
> > its
> > + * driver sets up to use ATS, rather than for any address once ATS is 
> > enabled.
> > + * P2PDMA then routes this client's Requests with the Address Type each 
> > query
> > + * asks about, rather than the one its ATS Enable bit implies.
> > + */
> > +void pcim_p2pdma_set_ats_per_mapping(struct pci_dev *pdev)
> > +{
> > +   struct pci_p2pdma *p2p;
> > +
> > +   p2p = rcu_dereference_protected(pdev->p2pdma, 1);
> > +   if (!p2p)
> > +           /*
> > +            * ats_per_mapping is a performance optimization,
> > +            * if pcim_p2pdma_init() didn't set pdev->p2pdma pointer
> > +            * for some reason, let's simply use ATS global settings.
> > +            */
> > +           return;
> 
> [Severity: Medium]
> Will this silently fail for pure P2PDMA clients?
> 
> It looks like pdev->p2pdma is only allocated when a device registers as a
> P2P memory provider via pcim_p2pdma_init():

Yes, this is exactly for them and no one else.

Thanks

> 
> drivers/pci/p2pdma.c:pcim_p2pdma_init() {
>       ...
>       p2p = devm_kzalloc(&pdev->dev, sizeof(*p2p), GFP_KERNEL);
>       ...
> }
> 
> If a driver for a pure P2PDMA client (e.g., an NVMe initiator without CMB)
> calls pcim_p2pdma_set_ats_per_mapping() to declare its ATS behavior, won't
> pdev->p2pdma be NULL since it never called pcim_p2pdma_init()?

Only RDMA NICs support that per-mapping thing.

Thanks

> 
> If so, wouldn't this cause the client to silently fall back to suboptimal
> global ATS routing, as it can never successfully set the ats_per_mapping flag?
> 
> -- 
> Sashiko AI review ยท 
> https://sashiko.dev/#/patchset/[email protected]?part=16

Reply via email to