Re: [RFC/PATCH] PCI: Protect pci_reassign_bridge_resources() against concurrent addition/removal

Bjorn Helgaas
2019-08-21T13:08:31Z

On Mon, Jun 24, 2019 at 02:32:19PM +1000, Benjamin Herrenschmidt wrote:
> pci_reassign_bridge_resources() can be called by pci_resize_resource()
> at runtime.
>
> It will walk the PCI tree up and down, and isn't currently protected
> against any changes or hotplug operation.
>
> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>

Applied to pci/resource for v5.4, thanks!

> ---
>
> --- a/drivers/pci/setup-bus.c
> +++ b/drivers/pci/setup-bus.c
> @@ -2104,6 +2104,8 @@ int pci_reassign_bridge_resources(struct pci_dev *bridge, unsigned long type)
> unsigned int i;
> int ret;
>
> + down_read(&pci_bus_sem);
> +
> /* Walk to the root hub, releasing bridge BARs when possible */
> next = bridge;
> do {
> @@ -2160,6 +2162,7 @@ int pci_reassign_bridge_resources(struct pci_dev *bridge, unsigned long type)
> }
>
> free_list(&saved);
> + up_read(&pci_bus_sem);
> return 0;
>
> cleanup:
> @@ -2188,6 +2191,7 @@ int pci_reassign_bridge_resources(struct pci_dev *bridge, unsigned long type)
> pci_setup_bridge(bridge->subordinate);
> }
> free_list(&saved);
> + up_read(&pci_bus_sem);
>
> return ret;
> }
>