104 lines
3.3 KiB
Diff
104 lines
3.3 KiB
Diff
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||
|
From: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
||
|
Date: Mon, 27 Sep 2021 11:28:39 +0200
|
||
|
Subject: [PATCH] Revert "PCI: Coalesce host bridge contiguous apertures"
|
||
|
MIME-Version: 1.0
|
||
|
Content-Type: text/plain; charset=UTF-8
|
||
|
Content-Transfer-Encoding: 8bit
|
||
|
|
||
|
This reverts commit ab20e43b20b60f5cc8e2ea3763ffa388158469ac.
|
||
|
|
||
|
was reverted upstream because of reports similar to
|
||
|
|
||
|
Link: https://bugzilla.proxmox.com/show_bug.cgi?id=3552
|
||
|
Link: https://lore.kernel.org/r/20210709231529.GA3270116@roeck-us.net
|
||
|
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||
|
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
||
|
---
|
||
|
drivers/pci/probe.c | 50 ++++-----------------------------------------
|
||
|
1 file changed, 4 insertions(+), 46 deletions(-)
|
||
|
|
||
|
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
|
||
|
index cb70d2605e97..258350f80f6c 100644
|
||
|
--- a/drivers/pci/probe.c
|
||
|
+++ b/drivers/pci/probe.c
|
||
|
@@ -20,7 +20,6 @@
|
||
|
#include <linux/irqdomain.h>
|
||
|
#include <linux/pm_runtime.h>
|
||
|
#include <linux/bitfield.h>
|
||
|
-#include <linux/list_sort.h>
|
||
|
#include "pci.h"
|
||
|
|
||
|
#define CARDBUS_LATENCY_TIMER 176 /* secondary latency timer */
|
||
|
@@ -881,31 +880,14 @@ static void pci_set_bus_msi_domain(struct pci_bus *bus)
|
||
|
dev_set_msi_domain(&bus->dev, d);
|
||
|
}
|
||
|
|
||
|
-static int res_cmp(void *priv, const struct list_head *a,
|
||
|
- const struct list_head *b)
|
||
|
-{
|
||
|
- struct resource_entry *entry1, *entry2;
|
||
|
-
|
||
|
- entry1 = container_of(a, struct resource_entry, node);
|
||
|
- entry2 = container_of(b, struct resource_entry, node);
|
||
|
-
|
||
|
- if (entry1->res->flags != entry2->res->flags)
|
||
|
- return entry1->res->flags > entry2->res->flags;
|
||
|
-
|
||
|
- if (entry1->offset != entry2->offset)
|
||
|
- return entry1->offset > entry2->offset;
|
||
|
-
|
||
|
- return entry1->res->start > entry2->res->start;
|
||
|
-}
|
||
|
-
|
||
|
static int pci_register_host_bridge(struct pci_host_bridge *bridge)
|
||
|
{
|
||
|
struct device *parent = bridge->dev.parent;
|
||
|
- struct resource_entry *window, *next, *n;
|
||
|
+ struct resource_entry *window, *n;
|
||
|
struct pci_bus *bus, *b;
|
||
|
- resource_size_t offset, next_offset;
|
||
|
+ resource_size_t offset;
|
||
|
LIST_HEAD(resources);
|
||
|
- struct resource *res, *next_res;
|
||
|
+ struct resource *res;
|
||
|
char addr[64], *fmt;
|
||
|
const char *name;
|
||
|
int err;
|
||
|
@@ -988,35 +970,11 @@ static int pci_register_host_bridge(struct pci_host_bridge *bridge)
|
||
|
if (nr_node_ids > 1 && pcibus_to_node(bus) == NUMA_NO_NODE)
|
||
|
dev_warn(&bus->dev, "Unknown NUMA node; performance will be reduced\n");
|
||
|
|
||
|
- /* Sort and coalesce contiguous windows */
|
||
|
- list_sort(NULL, &resources, res_cmp);
|
||
|
- resource_list_for_each_entry_safe(window, n, &resources) {
|
||
|
- if (list_is_last(&window->node, &resources))
|
||
|
- break;
|
||
|
-
|
||
|
- next = list_next_entry(window, node);
|
||
|
- offset = window->offset;
|
||
|
- res = window->res;
|
||
|
- next_offset = next->offset;
|
||
|
- next_res = next->res;
|
||
|
-
|
||
|
- if (res->flags != next_res->flags || offset != next_offset)
|
||
|
- continue;
|
||
|
-
|
||
|
- if (res->end + 1 == next_res->start) {
|
||
|
- next_res->start = res->start;
|
||
|
- res->flags = res->start = res->end = 0;
|
||
|
- }
|
||
|
- }
|
||
|
-
|
||
|
/* Add initial resources to the bus */
|
||
|
resource_list_for_each_entry_safe(window, n, &resources) {
|
||
|
+ list_move_tail(&window->node, &bridge->windows);
|
||
|
offset = window->offset;
|
||
|
res = window->res;
|
||
|
- if (!res->end)
|
||
|
- continue;
|
||
|
-
|
||
|
- list_move_tail(&window->node, &bridge->windows);
|
||
|
|
||
|
if (res->flags & IORESOURCE_BUS)
|
||
|
pci_bus_insert_busn_res(bus, bus->number, res->end);
|