Thread (81 messages) 81 messages, 6 authors, 2021-05-11

Re: [PATCH 02/16] PCI/P2PDMA: Avoid pci_get_slot() which sleeps

From: Logan Gunthorpe <logang@deltatee.com>
Date: 2021-05-11 16:14:52
Also in: linux-block, linux-iommu, linux-nvme, linux-pci, lkml


On 2021-05-11 10:05 a.m., Don Dutile wrote:
On 4/8/21 1:01 PM, Logan Gunthorpe wrote:
quoted
In order to use upstream_bridge_distance_warn() from a dma_map function,
it must not sleep. However, pci_get_slot() takes the pci_bus_sem so it
might sleep.

In order to avoid this, try to get the host bridge's device from
bus->self, and if that is not set, just get the first element in the
device list. It should be impossible for the host bridge's device to
go away while references are held on child devices, so the first element
should not be able to change and, thus, this should be safe.
Bjorn:
Why wouldn't (shouldn't?) the bus->self field be set for a host bridge device?
Should this situation be repaired in the host-brige config/setup code elsewhere in the kernel.
... and here, a check-and-fail with info of what doesn't have it setup (another new pci function to do the check & prinfo), so it can point to the offending host-bridge, and thus, the code that needs to be updated?
I've dropped the bus->self thing in v2. Seems bus->self is explicitly
unset for root bridges. There's remnants in the pci code that used to
check bus->self to see if the bridge is the root bridge.

I tried setting bus->self with the pci device of the root bridge but
that just caused my machine not to boot and I didn't dig any further.

Logan
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help