From patchwork Thu Feb 25 02:12:19 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yinghai Lu X-Patchwork-Id: 8416391 X-Patchwork-Delegate: bhelgaas@google.com Return-Path: X-Original-To: patchwork-linux-pci@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 41566C0553 for ; Thu, 25 Feb 2016 02:19:03 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 51C6C20274 for ; Thu, 25 Feb 2016 02:19:02 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 52E1F2034A for ; Thu, 25 Feb 2016 02:19:01 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1759560AbcBYCSo (ORCPT ); Wed, 24 Feb 2016 21:18:44 -0500 Received: from aserp1040.oracle.com ([141.146.126.69]:39708 "EHLO aserp1040.oracle.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1759554AbcBYCSn (ORCPT ); Wed, 24 Feb 2016 21:18:43 -0500 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u1P2DLRM019074 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Feb 2016 02:13:21 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u1P2DKXu013965 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Thu, 25 Feb 2016 02:13:20 GMT Received: from abhmp0017.oracle.com (abhmp0017.oracle.com [141.146.116.23]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u1P2DKWO003211; Thu, 25 Feb 2016 02:13:20 GMT Received: from userv0022.oracle.com (/10.132.126.176) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 24 Feb 2016 18:13:19 -0800 From: Yinghai Lu To: Bjorn Helgaas , David Miller , Benjamin Herrenschmidt , Wei Yang , TJ , Yijing Wang , Khalid Aziz Cc: linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org, Yinghai Lu Subject: [PATCH v10 28/59] PCI: Don't add too much optional size for hotplug bridge MMIO Date: Wed, 24 Feb 2016 18:12:19 -0800 Message-Id: <1456366370-28995-29-git-send-email-yinghai@kernel.org> X-Mailer: git-send-email 1.8.4.5 In-Reply-To: <1456366370-28995-1-git-send-email-yinghai@kernel.org> References: <1456366370-28995-1-git-send-email-yinghai@kernel.org> X-Source-IP: userv0022.oracle.com [156.151.31.74] Sender: linux-pci-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pci@vger.kernel.org X-Spam-Status: No, score=-6.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Current code will always add 2M for hotplug bridge MMIO even there is child device under it already. For example: 40:03.0 --- 43:00.0 --- 44:02.0 -+- 45:00.0 \- 45:00.1 44:02.0 will need 1M as must for 45:00.0 and 45:00.1 When we calculate add_size for 44:02.0, we pass 2M as additional size for hotplug bridge, total will be 3M. That is different from code before changes for optional support, or even current code that treat optional as required directly by not passing realloc list. We only need 2M as total. The optional size should be 1M, and total size should be 2M. This patch change to comparing required+optional with min_sum_size to get smaller optional size. Signed-off-by: Yinghai Lu --- drivers/pci/setup-bus.c | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c index 6265f4d..9fdbd98 100644 --- a/drivers/pci/setup-bus.c +++ b/drivers/pci/setup-bus.c @@ -1199,7 +1199,6 @@ out: * @type2: second match type * @type3: third match type * @min_size : the minimum memory window that must to be allocated - * @add_size : additional optional memory window * @realloc_head : track the additional memory window on this list * * Calculate the size of the bus and minimal alignment which @@ -1212,10 +1211,11 @@ out: static int pbus_size_mem(struct pci_bus *bus, unsigned long mask, unsigned long type, unsigned long type2, unsigned long type3, - resource_size_t min_size, resource_size_t add_size, + resource_size_t min_size, struct list_head *realloc_head) { struct pci_dev *dev; + resource_size_t min_sum_size = 0; resource_size_t min_align = 0, min_add_align = 0; resource_size_t max_align = 0, max_add_align = 0; resource_size_t size = 0, size0 = 0, size1 = 0, sum_add_size = 0; @@ -1227,6 +1227,11 @@ static int pbus_size_mem(struct pci_bus *bus, unsigned long mask, if (!b_res) return -ENOSPC; + if (realloc_head) { + min_sum_size = min_size; + min_size = 0; + } + list_for_each_entry(dev, &bus->devices, bus_list) { int i; @@ -1299,8 +1304,8 @@ static int pbus_size_mem(struct pci_bus *bus, unsigned long mask, } free_align_test_list(&align_test_list); - if ((sum_add_size - size) < add_size) - sum_add_size = size + add_size; + if (sum_add_size < min_sum_size) + sum_add_size = min_sum_size; if (sum_add_size > size && realloc_head) { min_add_align = calculate_mem_align(&align_test_add_list, max_add_align, sum_add_size, @@ -1437,7 +1442,7 @@ void __pci_bus_size_bridges(struct pci_bus *bus, struct list_head *realloc_head) { struct pci_dev *dev; unsigned long mask, prefmask, type2 = 0, type3 = 0; - resource_size_t additional_mem_size = 0, additional_io_size = 0; + resource_size_t min_mem_size = 0, additional_io_size = 0; struct resource *b_res; int ret; @@ -1474,7 +1479,7 @@ void __pci_bus_size_bridges(struct pci_bus *bus, struct list_head *realloc_head) case PCI_CLASS_BRIDGE_PCI: if (bus->self->is_hotplug_bridge) { additional_io_size = pci_hotplug_io_size; - additional_mem_size = pci_hotplug_mem_size; + min_mem_size = pci_hotplug_mem_size; } /* Fall through */ default: @@ -1494,8 +1499,7 @@ void __pci_bus_size_bridges(struct pci_bus *bus, struct list_head *realloc_head) prefmask |= IORESOURCE_MEM_64; ret = pbus_size_mem(bus, prefmask, prefmask, prefmask, prefmask, - realloc_head ? 0 : additional_mem_size, - additional_mem_size, realloc_head); + min_mem_size, realloc_head); /* * If successful, all non-prefetchable resources @@ -1518,8 +1522,7 @@ void __pci_bus_size_bridges(struct pci_bus *bus, struct list_head *realloc_head) prefmask &= ~IORESOURCE_MEM_64; ret = pbus_size_mem(bus, prefmask, prefmask, prefmask, prefmask, - realloc_head ? 0 : additional_mem_size, - additional_mem_size, realloc_head); + min_mem_size, realloc_head); /* * If successful, only non-prefetchable resources @@ -1528,7 +1531,7 @@ void __pci_bus_size_bridges(struct pci_bus *bus, struct list_head *realloc_head) if (ret == 0) mask = prefmask; else - additional_mem_size += additional_mem_size; + min_mem_size += min_mem_size; type2 = type3 = IORESOURCE_MEM; } @@ -1549,8 +1552,7 @@ void __pci_bus_size_bridges(struct pci_bus *bus, struct list_head *realloc_head) * window. */ pbus_size_mem(bus, mask, IORESOURCE_MEM, type2, type3, - realloc_head ? 0 : additional_mem_size, - additional_mem_size, realloc_head); + min_mem_size, realloc_head); break; } }