On Wed, Jan 29, 2020 at 06:29:13PM +0300, Sergei Miroshnichenko wrote: > The PCI_COMMAND_IO and PCI_COMMAND_MEMORY bits of the bridge must be > updated not only when enabling the bridge for the first time, but also if a > hotplugged device requests these types of resources. > > For example, if a bridge had all its slots empty, the IO and MEM bits will > not be set, and a hot hotplugged device will fail. s/hot hotplugged/hot-added/ or something similar > Originally these bits were set by the pci_enable_device_flags() only, which > exits early if the bridge is already pci_is_enabled(). So let's check them > again when requested. s/by the/by/ s/ only,/, IIUC, in the current tree (before this series), we do set PCI_COMMAND_IO and PCI_COMMAND_MEMORY on bridges leading to hot-added devices, but this patch is needed because [01/26] "PCI: Fix race condition in pci_enable/disable_device()" makes pci_enable_device_flags() exit early without setting those bits. That would mean there's a bisection hole between [01/26] and [02/26] where hot-added devices will fail. We don't want a hole like that. > Signed-off-by: Sergei Miroshnichenko <s.miroshnichenko@xxxxxxxxx> > --- > drivers/pci/pci.c | 8 ++++++++ > 1 file changed, 8 insertions(+) > > diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c > index 0366289c75e9..cb0042f28e6a 100644 > --- a/drivers/pci/pci.c > +++ b/drivers/pci/pci.c > @@ -1679,6 +1679,14 @@ static void pci_enable_bridge(struct pci_dev *dev) > pci_enable_bridge(bridge); > > if (pci_is_enabled(dev)) { > + int i, bars = 0; > + > + for (i = PCI_BRIDGE_RESOURCES; i < DEVICE_COUNT_RESOURCE; i++) { > + if (dev->resource[i].flags & (IORESOURCE_MEM | IORESOURCE_IO)) > + bars |= (1 << i); > + } > + do_pci_enable_device(dev, bars); > + > if (!dev->is_busmaster) > pci_set_master(dev); > mutex_unlock(&dev->enable_mutex); > -- > 2.24.1 >