On Wed, Sep 26, 2018 at 10:59:30PM +0300, Peter Anemone wrote: > I think this should also be applied to 4.18 and 4.19 as this fixes a boot > hang. OK, I guess that makes sense. I added a stable tag for v4.18 and moved it to for-linus for v4.19. Thanks! > On Wed, 26 Sep 2018 at 00:01, Bjorn Helgaas <helgaas@xxxxxxxxxx> wrote: > > > > On Mon, Sep 24, 2018 at 12:42:59PM +0300, Mika Westerberg wrote: > > > HP 6730b laptop has an ethernet NIC connected to one of the PCIe root > > > ports. The root ports itself are native PCIe hotplug capable. Now, > > > during boot after PCI devices are scanned the BIOS triggers ACPI bus > > > check directly to the NIC: > > > > > > [ 0.942239] ACPI: \_SB_.PCI0.RP06.NIC_: Bus check in hotplug_event() > > > > > > It is not clear why it is sending bus check but regardless the ACPI > > > hotplug notify handler calls enable_slot() directly (instead of going > > > through acpiphp_check_bridge() as there is no bridge) which ends up > > > handling special case for non-hotplug bridges with native PCIe hotplug. > > > This results a crash of some kind but the reporter only sees black > > > screen so it is hard to figure out the exact spot and what actually > > > happens. Based on few fix proposals it was tracked to crash somewhere > > > inside pci_assign_unassigned_bridge_resources(). > > > > > > In any case we should not really be in that special branch at all > > > because the ACPI notify happened to a slot that is not a PCI bridge (it > > > is just a regular PCI device). > > > > > > Fix this so that we only go to that special branch if we are calling > > > enable_slot() for a bridge (e.g the ACPI notification was for the bridge). > > > > > > Link: https://bugzilla.kernel.org/show_bug.cgi?id=201127 > > > Fixes: 84c8b58ed3ad ACPI / hotplug / PCI: Don't scan bridges managed by native hotplug > > > Reported-by: Peter Anemone <peter.anemone@xxxxxxxxx> > > > Signed-off-by: Mika Westerberg <mika.westerberg@xxxxxxxxxxxxxxx> > > > > Applied with Rafael's reviewed-by to pci/hotplug for v4.20, thanks! > > > > > --- > > > Changes from v1: > > > > > > * Pass bool instead of a bridge pointer > > > > > > drivers/pci/hotplug/acpiphp_glue.c | 11 ++++++----- > > > 1 file changed, 6 insertions(+), 5 deletions(-) > > > > > > diff --git a/drivers/pci/hotplug/acpiphp_glue.c b/drivers/pci/hotplug/acpiphp_glue.c > > > index ef0b1b6ba86f..12afa7fdf77e 100644 > > > --- a/drivers/pci/hotplug/acpiphp_glue.c > > > +++ b/drivers/pci/hotplug/acpiphp_glue.c > > > @@ -457,17 +457,18 @@ static void acpiphp_native_scan_bridge(struct pci_dev *bridge) > > > /** > > > * enable_slot - enable, configure a slot > > > * @slot: slot to be enabled > > > + * @bridge: true if enable is for the whole bridge (not a single slot) > > > * > > > * This function should be called per *physical slot*, > > > * not per each slot object in ACPI namespace. > > > */ > > > -static void enable_slot(struct acpiphp_slot *slot) > > > +static void enable_slot(struct acpiphp_slot *slot, bool bridge) > > > { > > > struct pci_dev *dev; > > > struct pci_bus *bus = slot->bus; > > > struct acpiphp_func *func; > > > > > > - if (bus->self && hotplug_is_native(bus->self)) { > > > + if (bridge && bus->self && hotplug_is_native(bus->self)) { > > > /* > > > * If native hotplug is used, it will take care of hotplug > > > * slot management and resource allocation for hotplug > > > @@ -701,7 +702,7 @@ static void acpiphp_check_bridge(struct acpiphp_bridge *bridge) > > > trim_stale_devices(dev); > > > > > > /* configure all functions */ > > > - enable_slot(slot); > > > + enable_slot(slot, true); > > > } else { > > > disable_slot(slot); > > > } > > > @@ -785,7 +786,7 @@ static void hotplug_event(u32 type, struct acpiphp_context *context) > > > if (bridge) > > > acpiphp_check_bridge(bridge); > > > else if (!(slot->flags & SLOT_IS_GOING_AWAY)) > > > - enable_slot(slot); > > > + enable_slot(slot, false); > > > > > > break; > > > > > > @@ -973,7 +974,7 @@ int acpiphp_enable_slot(struct acpiphp_slot *slot) > > > > > > /* configure all functions */ > > > if (!(slot->flags & SLOT_ENABLED)) > > > - enable_slot(slot); > > > + enable_slot(slot, false); > > > > > > pci_unlock_rescan_remove(); > > > return 0; > > > -- > > > 2.18.0 > > >