Received: by 2002:ac0:a581:0:0:0:0:0 with SMTP id m1-v6csp3000001imm; Sun, 1 Jul 2018 10:02:29 -0700 (PDT) X-Google-Smtp-Source: ADUXVKIsRSDvjzYYqFKfgBvIhl5d2zX79ptBvSrpSDXC0b6uKB17s9gF1zRluSlVCf6y1e5lDNRd X-Received: by 2002:a63:9041:: with SMTP id a62-v6mr19289567pge.220.1530464549434; Sun, 01 Jul 2018 10:02:29 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1530464549; cv=none; d=google.com; s=arc-20160816; b=AqxFPY2RTnSNfaIc9UlbanHNy8mE9e6jqXNDWM2y50HyiIvUax7PVd+epx36TLemhX ULWjqrvSfNvOsWuqAkQqAYg1Ryw9SNSS2rLsUzGnaRPzMhxG2U2mXbj05MUPyALBMT6p Gpyez/VYhfyI1jUmC+HJ5enZrluizRn8oHrImTfQscaLWeihxRlxIXbH66CRiMqAR/w9 YiuPUfbRXJ/qwy96Cg9494E9DjxIwnzoCH9aOEBf+gBrqYS1klW1pCtQ51XjW2UJl2ic F3LkFGb9h8tqK16ds6WAZG93qZq6xFN09Up/xagHu1aQNZ0OqdWFP6lMIrnfNU6pzoyF yq9A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:user-agent:references :in-reply-to:message-id:date:subject:cc:to:from :arc-authentication-results; bh=RI093YZbkXD0AaH0yBsl7dq1aqGv6ut3U8wwCY5LskQ=; b=CWj4jJXLoo9AbIVh0sJNp+X1r9w4btCT1enGNTfOUoy6aV9iBQyQciRUyzCkCPgOCL 2Gnsk4H7L5oLZVl9eqZH/rVM2PixbKBF3DS8MgE5lRvfH55VJI/5dug2U8vl6IrJ2plK 99SiOPE+9uBfz1c9gd9YCCUkliS5r8fbfOjRNMwW3BWW8YJaCjo1oKMvau1IsVl85ivC XuYYzKp5exutVfVyYrWu+6XjV0Cf5XtVDduPpQ3N77jaVQxk7guHdbhPj+fms2ckrd9K 1TjGDczZj0+tiE5OMlBPBT5TSgTwI0K2HEnX5PgUAQO6wfZLW4+lothWatHPH0M68agc LGeA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id j2-v6si11906999pgv.575.2018.07.01.10.02.14; Sun, 01 Jul 2018 10:02:29 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753692AbeGARBN (ORCPT + 99 others); Sun, 1 Jul 2018 13:01:13 -0400 Received: from mail.linuxfoundation.org ([140.211.169.12]:37842 "EHLO mail.linuxfoundation.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1032358AbeGAQna (ORCPT ); Sun, 1 Jul 2018 12:43:30 -0400 Received: from localhost (LFbn-1-12247-202.w90-92.abo.wanadoo.fr [90.92.61.202]) by mail.linuxfoundation.org (Postfix) with ESMTPSA id DB772AA6; Sun, 1 Jul 2018 16:43:28 +0000 (UTC) From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Mario Limonciello , Mika Westerberg , Bjorn Helgaas , "Rafael J. Wysocki" , Andy Shevchenko Subject: [PATCH 4.17 116/220] PCI: Account for all bridges on bus when distributing bus numbers Date: Sun, 1 Jul 2018 18:22:20 +0200 Message-Id: <20180701160913.209172943@linuxfoundation.org> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20180701160908.272447118@linuxfoundation.org> References: <20180701160908.272447118@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 4.17-stable review patch. If anyone has any objections, please let me know. ------------------ From: Mika Westerberg commit 3374c545c27c5350b954d1ab03c880d5502e5eba upstream. When distributing extra bus number space to hotplug bridges for future extension, we don't account for the fact that there might be non-hotplug bridges on the bus after the hotplug bridges. For example: 01:00.0 --+- 02:00.0 (HotPlug-) -- Thunderbolt host controller +- 02:01.0 (HotPlug+) \- 02:02.0 (HotPlug-) -- xHCI host controller pci_scan_child_bus_extend() is supposed to distribute the remaining bus numbers to the hotplug bridge at 02:01.0, but only after accounting for all bridges on bus 02. Since we don't check whether there's another non-hotplug bridge after the hotplug bridge 02:01.0, it may not leave space for the non-hotplug bridge: pci 0000:00:1b.0: PCI bridge to [bus 01-39] (Root Port) pci 0000:01:00.0: PCI bridge to [bus 02-39] ... pci 0000:02:00.0: PCI bridge to [bus 03] pci 0000:02:01.0: PCI bridge to [bus 04] pci_bus 0000:04: [bus 04-39] extended by 0x35 pci_bus 0000:04: bus scan returning with max=39 pci_bus 0000:04: busn_res: [bus 04-39] end is updated to 39 pci 0000:02:02.0: scanning [bus 00-00] behind bridge, pass 1 pci_bus 0000:3a: scanning bus pci_bus 0000:3a: bus scan returning with max=3a pci_bus 0000:3a: busn_res: [bus 3a] end is updated to 3a pci_bus 0000:3a: [bus 3a] partially hidden behind bridge 0000:02 [bus 02-39] pci_bus 0000:3a: [bus 3a] partially hidden behind bridge 0000:01 [bus 01-39] pci_bus 0000:02: bus scan returning with max=3a pci_bus 0000:02: busn_res: [bus 02-39] end can not be updated to 3a The resulting 'lspci -t' output looks like this: +-1b.0-[01-39]----00.0-[02-3a]--+-00.0-[03]----00.0 ^^ +-01.0-[04-39]-- \-02.0-[3a]----00.0 ^^ The xHCI host controller behind 02:02.0 is not usable because it would have to be assigned bus 3a, which is not accessible through 00:1b.0. To fix this, reserve at least one bus for each bridge while scanning already configured bridges. Then use this information in the second scan to correct the available extra bus space for hotplug bridges. After this change the 'lspci -t' output is what is expected: +-1b.0-[01-39]----00.0-[02-39]--+-00.0-[03]----00.0 +-01.0-[04-38]-- \-02.0-[39]----00.0 The xHCI controller is now on bus 39, where it is usable. Fixes: 1c02ea810065 ("PCI: Distribute available buses to hotplug-capable bridges") Reported-by: Mario Limonciello Signed-off-by: Mika Westerberg [bhelgaas: changelog] Signed-off-by: Bjorn Helgaas Reviewed-by: Rafael J. Wysocki Reviewed-by: Andy Shevchenko Cc: stable@vger.kernel.org Signed-off-by: Greg Kroah-Hartman --- drivers/pci/probe.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c @@ -2638,7 +2638,14 @@ static unsigned int pci_scan_child_bus_e for_each_pci_bridge(dev, bus) { cmax = max; max = pci_scan_bridge_extend(bus, dev, max, 0, 0); - used_buses += cmax - max; + + /* + * Reserve one bus for each bridge now to avoid extending + * hotplug bridges too much during the second scan below. + */ + used_buses++; + if (cmax - max > 1) + used_buses += cmax - max - 1; } /* Scan bridges that need to be reconfigured */ @@ -2661,12 +2668,14 @@ static unsigned int pci_scan_child_bus_e * bridges if any. */ buses = available_buses / hotplug_bridges; - buses = min(buses, available_buses - used_buses); + buses = min(buses, available_buses - used_buses + 1); } cmax = max; max = pci_scan_bridge_extend(bus, dev, cmax, buses, 1); - used_buses += max - cmax; + /* One bus is already accounted so don't add it again */ + if (max - cmax > 1) + used_buses += max - cmax - 1; } /*