Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755318AbbG0Xd6 (ORCPT ); Mon, 27 Jul 2015 19:33:58 -0400 Received: from aserp1040.oracle.com ([141.146.126.69]:37664 "EHLO aserp1040.oracle.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754980AbbG0Xd4 (ORCPT ); Mon, 27 Jul 2015 19:33:56 -0400 From: Yinghai Lu To: Bjorn Helgaas , David Miller , Benjamin Herrenschmidt , Wei Yang , TJ , Yijing Wang Cc: Andrew Morton , linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org, Yinghai Lu Subject: [PATCH v3 44/51] PCI: Get new realloc size for bridge for last try Date: Mon, 27 Jul 2015 16:30:02 -0700 Message-Id: <1438039809-24957-45-git-send-email-yinghai@kernel.org> X-Mailer: git-send-email 1.8.4.5 In-Reply-To: <1438039809-24957-1-git-send-email-yinghai@kernel.org> References: <1438039809-24957-1-git-send-email-yinghai@kernel.org> X-Source-IP: aserv0022.oracle.com [141.146.126.234] Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2246 Lines: 76 Current realloc path would not shrink bridge resource through pbus_size_mem() checking with the old size. That cause problem: when "must+optional" resource allocation fails, the cached bridge resource size will prevent "must" resource to get allocated smaller resource. Clear the old resource size for last try or third and later try. -v3: change reset_bridge_resource_size to static according to Fengguang. Link: https://bugzilla.kernel.org/show_bug.cgi?id=81431 Tested-by: TJ Signed-off-by: Yinghai Lu --- drivers/pci/setup-bus.c | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c index 541cea5..83e3201 100644 --- a/drivers/pci/setup-bus.c +++ b/drivers/pci/setup-bus.c @@ -2256,6 +2256,17 @@ static enum enable_type pci_realloc_detect(struct pci_bus *bus, } #endif +static void reset_bridge_resource_size(struct pci_dev *dev, + struct resource *res) +{ + int idx = res - &dev->resource[0]; + + if (idx >= PCI_BRIDGE_RESOURCES && idx <= PCI_BRIDGE_RESOURCE_END) { + res->start = 0; + res->end = res->start - 1; + } +} + /* * first try will not touch pci bridge res * second and later try will clear small leaf bridge res @@ -2338,8 +2349,13 @@ again: struct resource *res = fail_res->res; restore_resource(fail_res, res); - if (fail_res->dev->subordinate) + if (fail_res->dev->subordinate) { res->flags = 0; + /* last or third times and later */ + if (tried_times + 1 == pci_try_num || + tried_times + 1 > 2) + reset_bridge_resource_size(fail_res->dev, res); + } } free_list(&fail_head); @@ -2411,8 +2427,11 @@ again: struct resource *res = fail_res->res; restore_resource(fail_res, res); - if (fail_res->dev->subordinate) + if (fail_res->dev->subordinate) { res->flags = 0; + /* last time */ + reset_bridge_resource_size(fail_res->dev, res); + } } free_list(&fail_head); -- 1.8.4.5 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/