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
