Thank you for your contribution! Sashiko AI review found 1 potential issue(s) 
to consider:
- [High] pci/p2pdma: deadlock in calc_map_type_and_dist() calling xa_store() 
from softirq
--

commit 6120f97b22446453f3e4fa09135e1a44135ecfe8
Author: Leon Romanovsky <[email protected]>

PCI/P2PDMA: Honor device-specific ACS redirection

This commit updates PCI P2PDMA to respect device-specific ACS redirection
quirks for switches and ports that redirect peer-to-peer traffic without a
standard ACS capability. It queries quirks to set Request and Completion
Redirect flags and modifies how affected ports are warned about.

> diff --git a/drivers/pci/p2pdma.c b/drivers/pci/p2pdma.c
> index 45260423dfb09..ba94b0f339285 100644
> --- a/drivers/pci/p2pdma.c
> +++ b/drivers/pci/p2pdma.c
[ ... ]
> @@ -782,15 +867,8 @@ calc_map_type_and_dist(struct pci_dev *provider, struct 
> pci_dev *client,
>               goto done;
>       }
>  
> -     if (verbose) {
> -             /* Drop the final semicolon; the list is not empty here */
> -             if (!seq_buf_has_overflowed(&acs_list))
> -                     acs_list.buffer[acs_list.len - 1] = '\0';
> -             pci_warn(client, "ACS redirect is set between the client and 
> provider (%s)\n",
> -                      pci_name(provider));
> -             pci_warn(client, "to disable ACS redirect for this path, add 
> the kernel parameter: pci=disable_acs_redir=%s\n",
> -                      seq_buf_str(&acs_list));
> -     }
> +     if (verbose)
> +             pci_p2pdma_warn_redir(client, provider, &acs_list, &quirk_list);
>  
>  map_through_host_bridge:
>       if (!cpu_supports_p2pdma() &&

[Severity: High]
Does calling xa_store() further down in this function risk a deadlock?

The map_types xarray is initialized with a plain xa_init() (without
XA_FLAGS_LOCK_IRQ) in pcim_p2pdma_init(). This means its internal lock
operates as a simple process-context spin_lock.

Since calc_map_type_and_dist() can be called from softirq/hardirq context
during P2P DMA mapping (e.g., via dma_map_sg()), and xa_store() takes the
xarray lock without disabling interrupts, a process-context thread interrupted
by a DMA mapping on the same CPU could cause a deadlock if they both try to
access this xarray:

drivers/pci/p2pdma.c:calc_map_type_and_dist() {
    ...
done:
        rcu_read_lock();
        p2pdma = rcu_dereference(provider->p2pdma);
        if (p2pdma)
                xa_store(&p2pdma->map_types, map_types_idx(client),
                         xa_mk_value(map_type), GFP_ATOMIC);
        rcu_read_unlock();
        return map_type;
}

-- 
Sashiko AI review ยท 
https://sashiko.dev/#/patchset/[email protected]?part=1

Reply via email to