All of lore.kernel.org
 help / color / mirror / Atom feed
From: Yinghai Lu <yinghai@kernel.org>
To: Bjorn Helgaas <bhelgaas@google.com>,
	David Miller <davem@davemloft.net>,
	Benjamin Herrenschmidt <benh@kernel.crashing.org>,
	Wei Yang <weiyang@linux.vnet.ibm.com>, TJ <linux@iam.tj>,
	Yijing Wang <wangyijing@huawei.com>
Cc: Andrew Morton <akpm@linux-foundation.org>,
	linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org,
	Yinghai Lu <yinghai@kernel.org>
Subject: [PATCH v4 05/52] PCI: Optimize bus align/size calculation for optional during sizing
Date: Thu, 20 Aug 2015 23:20:20 -0700	[thread overview]
Message-ID: <1440138067-4314-6-git-send-email-yinghai@kernel.org> (raw)
In-Reply-To: <1440138067-4314-1-git-send-email-yinghai@kernel.org>

Current add_align always use max align, that make required+optional
to get allocated more than needed in some cases.

Now we have new calculate_mem_align, we could use it for add_align
calculation.

Need to create separated list for required+optional align/size info.

After that we can get smaller add_align/size, we have more chance
to make required+optional to get allocated.

The result for bridge that have Intel 4x10g card installed.

 pci 0000:20:03.2: bridge window [mem 0x00000000-0x000fffff 64bit pref]
	to [bus 2a-31] calculate_mem for required
 ===========BEGIN========================
 align/size:
   00800000/00800000
   00800000/00800000
   00800000/00800000
   00800000/00800000
   00008000/00008000
   00008000/00008000
   00008000/00008000
   00008000/00008000
 old min_align/min_size: 00400000/02400000
     min_align/min_size: 00400000/02400000
 ===========END========================

 pci 0000:20:03.2: bridge window [mem 0x00000000-0x000fffff 64bit pref]
	to [bus 2a-31] calculate_mem for required+optional
 ===========BEGIN========================
 align/size:
   00800000/00800000
   00800000/00800000
   00800000/00800000
   00800000/00800000
   00010000/00200000
   00010000/00200000
   00010000/00200000
   00010000/00200000
   00008000/00008000
   00008000/00008000
   00008000/00008000
   00008000/00008000
   00004000/00080000
   00004000/00080000
   00004000/00080000
   00004000/00080000
for parent bridge:
 original code min_align/min_size: 00800000/03000000
 after this patch min_align/min_size: 00100000/02b00000
 ===========END========================

so required align/size: 0x400000/0x2400000, and
 new required+optional align/size: 0x100000/0x2b00000, and it is much better
than original required+optional align/size: 0x800000/0x3000000

-v2: remove not used size1 in calculate_memsize


Link: https://bugzilla.kernel.org/show_bug.cgi?id=81431
Reported-by: TJ <linux@iam.tj>
Signed-off-by: Yinghai Lu <yinghai@kernel.org>


 drivers/pci/setup-bus.c |   82 +++++++++++++++++++++++++++++-------------------
 1 file changed, 51 insertions(+), 31 deletions(-)
---
 drivers/pci/setup-bus.c | 82 ++++++++++++++++++++++++++++++-------------------
 1 file changed, 51 insertions(+), 31 deletions(-)

diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c
index 861fe68..6cccbe4 100644
--- a/drivers/pci/setup-bus.c
+++ b/drivers/pci/setup-bus.c
@@ -900,7 +900,6 @@ static resource_size_t calculate_iosize(resource_size_t size,
 
 static resource_size_t calculate_memsize(resource_size_t size,
 		resource_size_t min_size,
-		resource_size_t size1,
 		resource_size_t old_size,
 		resource_size_t align)
 {
@@ -910,7 +909,7 @@ static resource_size_t calculate_memsize(resource_size_t size,
 		old_size = 0;
 	if (size < old_size)
 		size = old_size;
-	size = ALIGN(size + size1, align);
+	size = ALIGN(size, align);
 	return size;
 }
 
@@ -1173,44 +1172,45 @@ static int pbus_size_mem(struct pci_bus *bus, unsigned long mask,
 			 struct list_head *realloc_head)
 {
 	struct pci_dev *dev;
-	resource_size_t min_align, align, size, size0, size1;
-	resource_size_t max_align = 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;
 	struct resource *b_res = find_free_bus_resource(bus,
 					mask | IORESOURCE_PREFETCH, type);
-	resource_size_t children_add_size = 0;
-	resource_size_t children_add_align = 0;
-	resource_size_t add_align = 0;
 	LIST_HEAD(align_test_list);
+	LIST_HEAD(align_test_add_list);
 
 	if (!b_res)
 		return -ENOSPC;
 
-	size = 0;
-
 	list_for_each_entry(dev, &bus->devices, bus_list) {
 		int i;
 
 		for (i = 0; i < PCI_NUM_RESOURCES; i++) {
 			struct resource *r = &dev->resource[i];
-			resource_size_t r_size;
+			resource_size_t r_size, align;
 
 			if (r->parent || ((r->flags & mask) != type &&
 					  (r->flags & mask) != type2 &&
 					  (r->flags & mask) != type3))
 				continue;
+
 			r_size = resource_size(r);
+			align = pci_resource_alignment(dev, r);
 #ifdef CONFIG_PCI_IOV
 			/* put SRIOV requested res to the optional list */
 			if (realloc_head && i >= PCI_IOV_RESOURCES &&
 					i <= PCI_IOV_RESOURCE_END) {
-				add_align = max(pci_resource_alignment(dev, r), add_align);
+				add_to_align_test_list(&align_test_add_list,
+							align, r_size);
 				r->end = r->start - 1;
 				add_to_list(realloc_head, dev, r, r_size, 0/* don't care */);
-				children_add_size += r_size;
+				sum_add_size += r_size;
+				if (align > max_add_align)
+					max_add_align = align;
 				continue;
 			}
 #endif
-			align = pci_resource_alignment(dev, r);
 			if (align > (1ULL<<37)) { /*128 Gb*/
 				dev_warn(&dev->dev, "disabling BAR %d: %pR (bad alignment %#llx)\n",
 					i, r, (unsigned long long) align);
@@ -1218,33 +1218,52 @@ static int pbus_size_mem(struct pci_bus *bus, unsigned long mask,
 				continue;
 			}
 
-			if (r_size > 1)
+			if (r_size > 1) {
 				add_to_align_test_list(&align_test_list,
 							align, r_size);
-			size += r_size;
-			if (align > max_align)
-				max_align = align;
+				size += r_size;
+				if (align > max_align)
+					max_align = align;
+			}
 
 			if (realloc_head) {
-				children_add_size += get_res_add_size(realloc_head, r);
-				children_add_align = get_res_add_align(realloc_head, r);
-				add_align = max(add_align, children_add_align);
+				resource_size_t add_r_size, add_align;
+
+				add_r_size = get_res_add_size(realloc_head, r);
+				add_align = get_res_add_align(realloc_head, r);
+				/* no add on ? */
+				if (add_align < align)
+					add_align = align;
+				add_to_align_test_list(&align_test_add_list,
+							add_align,
+							r_size + add_r_size);
+				sum_add_size += r_size + add_r_size;
+				if (add_align > max_add_align)
+					max_add_align = add_align;
 			}
 		}
 	}
 
 	max_align = max(max_align, window_alignment(bus, b_res->flags));
-	min_align = calculate_mem_align(&align_test_list, max_align, size,
-					window_alignment(bus, b_res->flags));
-	size0 = calculate_memsize(size, min_size, 0,
+	if (size || min_size) {
+		min_align = calculate_mem_align(&align_test_list, max_align,
+				 size, window_alignment(bus, b_res->flags));
+		size0 = calculate_memsize(size, min_size,
 				  resource_size(b_res), min_align);
+	}
 	free_align_test_list(&align_test_list);
-	add_align = max(min_align, add_align);
-	if (children_add_size > add_size)
-		add_size = children_add_size;
-	size1 = (!realloc_head || (realloc_head && !add_size)) ? size0 :
-		calculate_memsize(size, min_size, add_size,
-				resource_size(b_res), add_align);
+
+	if ((sum_add_size - size) < add_size)
+		sum_add_size = size + add_size;
+	if (sum_add_size > size && realloc_head) {
+		min_add_align = calculate_mem_align(&align_test_add_list,
+					max_add_align, sum_add_size,
+					window_alignment(bus, b_res->flags));
+		size1 = calculate_memsize(sum_add_size, min_size,
+				 resource_size(b_res), min_add_align);
+	}
+	free_align_test_list(&align_test_add_list);
+
 	if (!size0 && !size1) {
 		if (b_res->start || b_res->end)
 			dev_info(&bus->self->dev, "disabling bridge window %pR to %pR (unused)\n",
@@ -1256,11 +1275,12 @@ static int pbus_size_mem(struct pci_bus *bus, unsigned long mask,
 	b_res->end = size0 + min_align - 1;
 	b_res->flags |= IORESOURCE_STARTALIGN;
 	if (size1 > size0 && realloc_head) {
-		add_to_list(realloc_head, bus->self, b_res, size1-size0, add_align);
+		add_to_list(realloc_head, bus->self, b_res, size1 - size0,
+				min_add_align);
 		dev_printk(KERN_DEBUG, &bus->self->dev, "bridge window %pR to %pR add_size %llx add_align %llx\n",
 			   b_res, &bus->busn_res,
 			   (unsigned long long) (size1 - size0),
-			   (unsigned long long) add_align);
+			   (unsigned long long) min_add_align);
 	}
 	return 0;
 }
-- 
1.8.4.5


  parent reply	other threads:[~2015-08-21  6:20 UTC|newest]

Thread overview: 68+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-08-21  6:20 [PATCH v4 00/52] PCI: Resource allocation cleanup for v4.3 Yinghai Lu
2015-08-21  6:20 ` [PATCH v4 01/52] PCI: Cleanup res_to_dev_res() printout Yinghai Lu
2015-08-21  6:20 ` [PATCH v4 02/52] PCI: Reuse res_to_dev_res() in reassign_resources_sorted() Yinghai Lu
2015-08-21  6:20 ` [PATCH v4 03/52] PCI: Use correct align for optional only resources during sorting Yinghai Lu
2015-08-21  6:20 ` [PATCH v4 04/52] PCI: Optimize bus min_align/size calculation during sizing Yinghai Lu
2015-09-14 20:21   ` Bjorn Helgaas
2015-09-14 21:37     ` Yinghai Lu
2015-09-15 14:57       ` Bjorn Helgaas
2015-09-16 19:33         ` Yinghai Lu
2015-08-21  6:20 ` Yinghai Lu [this message]
2015-08-21  6:20 ` [PATCH v4 06/52] PCI: Don't add too much optional size for hotplug bridge MMIO Yinghai Lu
2015-08-21  6:20 ` [PATCH v4 07/52] PCI: Reorder resources list for required/optional resources Yinghai Lu
2015-08-21  6:20 ` [PATCH v4 08/52] PCI: Remove duplicated code for resource sorting Yinghai Lu
2015-08-21  6:20 ` [PATCH v4 09/52] PCI: Rename pdev_sort_resources() to pdev_assign_resources_prepare() Yinghai Lu
2015-08-21  6:20 ` [PATCH v4 10/52] PCI: Treat ROM resource as optional during realloc Yinghai Lu
2015-08-21  6:20 ` [PATCH v4 11/52] PCI: Add debug printout during releasing partial assigned resources Yinghai Lu
2015-08-21  6:20 ` [PATCH v4 12/52] PCI: Simplify res reference using in __assign_resources_sorted() Yinghai Lu
2015-08-21  6:20 ` [PATCH v4 13/52] PCI, acpiphp: Add missing realloc list checking after resource allocation Yinghai Lu
2015-08-24 22:09   ` Rafael J. Wysocki
2015-08-24 22:14     ` Yinghai Lu
2015-08-25  0:37       ` Rafael J. Wysocki
2015-08-25  0:14         ` Yinghai Lu
2015-08-21  6:20 ` [PATCH v4 14/52] PCI: Add __add_to_list() Yinghai Lu
2015-08-21  6:20 ` [PATCH v4 15/52] PCI: Cache window alignment value during bus sizing Yinghai Lu
2015-08-21  6:20 ` [PATCH v4 16/52] PCI: Check if resource is allocated before trying to assign one Yinghai Lu
2015-08-21  6:20 ` [PATCH v4 17/52] PCI: Separate out save_resources()/restore_resources() Yinghai Lu
2015-08-21  6:20 ` [PATCH v4 18/52] PCI: Move comment to pci_need_to_release() Yinghai Lu
2015-08-21  6:20 ` [PATCH v4 19/52] PCI: Separate required+optional assigning to another function Yinghai Lu
2015-08-21  6:20 ` [PATCH v4 20/52] PCI: Skip required+optional if there is no optional Yinghai Lu
2015-08-21  6:20 ` [PATCH v4 21/52] PCI: Move saved required resource list out of required+optional assigning Yinghai Lu
2015-08-21  6:20 ` [PATCH v4 22/52] PCI: Add alt_size ressource allocation support Yinghai Lu
2015-08-21  6:20 ` [PATCH v4 23/52] PCI: Add support for more than two alt_size under same bridge Yinghai Lu
2015-08-21  6:20 ` [PATCH v4 24/52] PCI: Better support for two alt_size Yinghai Lu
2015-08-21  6:20 ` [PATCH v4 25/52] PCI: Fix size calculation with old_size on rescan path Yinghai Lu
2015-08-21  6:20 ` [PATCH v4 26/52] PCI: Don't add too much optional size for hotplug bridge io Yinghai Lu
2015-08-21  6:20 ` [PATCH v4 27/52] PCI: Move ISA io port align out of calculate_iosize() Yinghai Lu
2015-08-21  6:20 ` [PATCH v4 28/52] PCI: Don't add too much io port for hotplug bridge with old size Yinghai Lu
2015-08-21  6:20 ` [PATCH v4 29/52] PCI: Unify calculate_size() for io port and MMIO Yinghai Lu
2015-08-21  6:20 ` [PATCH v4 30/52] PCI: Allow bridge optional only io port resource required size to be 0 Yinghai Lu
2015-08-21  6:20 ` [PATCH v4 31/52] PCI: Unify skip_ioresource_align() Yinghai Lu
2015-08-21  6:20 ` [PATCH v4 32/52] PCI: Kill macro checking for bus io port sizing Yinghai Lu
2015-08-21  6:20 ` [PATCH v4 33/52] resources: Split out __allocate_resource() Yinghai Lu
2015-08-21  6:20 ` [PATCH v4 34/52] resources: Make allocate_resource() return best fit resource Yinghai Lu
2015-08-21  6:20 ` [PATCH v4 35/52] PCI: Check pref compatible bit for mem64 resource of PCIe device Yinghai Lu
2015-08-21  6:20 ` [PATCH v4 36/52] PCI: Only treat non-pref mmio64 as pref if all bridges have MEM_64 Yinghai Lu
2015-08-21  6:20 ` [PATCH v4 37/52] PCI: Add has_mem64 for struct host_bridge Yinghai Lu
2015-08-21  6:20 ` [PATCH v4 38/52] PCI: Only treat non-pref mmio64 as pref if host bridge has mmio64 Yinghai Lu
2015-08-21  6:20 ` [PATCH v4 39/52] PCI: Restore pref MMIO allocation logic for host bridge without mmio64 Yinghai Lu
2015-08-21  6:20 ` [PATCH v4 40/52] sparc/PCI: Add mem64 resource parsing for root bus Yinghai Lu
2015-08-21  6:20 ` [PATCH v4 41/52] sparc/PCI: Add IORESOURCE_MEM_64 for 64-bit resource in OF parsing Yinghai Lu
2015-08-21  6:20   ` Yinghai Lu
2015-08-21  6:20 ` [PATCH v4 42/52] powerpc/PCI: " Yinghai Lu
2015-08-21  6:20 ` [PATCH v4 43/52] OF/PCI: Add IORESOURCE_MEM_64 for 64-bit resource Yinghai Lu
2015-08-21 18:18   ` Rob Herring
2015-08-21 18:18     ` Rob Herring
2015-08-21 18:24     ` Yinghai Lu
2015-08-21 18:24       ` Yinghai Lu
2015-08-21  6:20 ` [PATCH v4 44/52] PCI: Treat optional as required in first try for bridge rescan Yinghai Lu
2015-08-21  6:21 ` [PATCH v4 45/52] PCI: Get new realloc size for bridge for last try Yinghai Lu
2015-08-21  6:21 ` [PATCH v4 46/52] PCI: Don't release sibling bridge resources during hotplug Yinghai Lu
2015-08-21  6:21 ` [PATCH v4 47/52] PCI: Don't release fixed resource for realloc Yinghai Lu
2015-08-21  6:21 ` [PATCH v4 48/52] PCI: Claim fixed resource during remove/rescan path Yinghai Lu
2015-08-21  6:21 ` [PATCH v4 49/52] PCI: Set resource to FIXED for LSI devices Yinghai Lu
2015-08-21  6:21 ` [PATCH v4 50/52] PCI, x86: Add pci=assign_pref_bars to reallocate pref BARs Yinghai Lu
     [not found] ` <1440138067-4314-1-git-send-email-yinghai-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
2015-08-21  6:21   ` [PATCH v4 51/52] PCI: Introduce resource_disabled() Yinghai Lu
2015-08-21  6:21     ` Yinghai Lu
2015-08-21  6:21     ` Yinghai Lu
2015-08-21  6:21 ` [PATCH v4 52/52] PCI: Don't set flags to 0 when assign resource fail Yinghai Lu

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1440138067-4314-6-git-send-email-yinghai@kernel.org \
    --to=yinghai@kernel.org \
    --cc=akpm@linux-foundation.org \
    --cc=benh@kernel.crashing.org \
    --cc=bhelgaas@google.com \
    --cc=davem@davemloft.net \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pci@vger.kernel.org \
    --cc=linux@iam.tj \
    --cc=wangyijing@huawei.com \
    --cc=weiyang@linux.vnet.ibm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.