a7de27ff7d
breaking some NVME setups. these should be picked up by one of the next Ubuntu kernel releases, since both the breaking change and the fix are authored by Canonical devs. Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
103 lines
3.3 KiB
Diff
103 lines
3.3 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: =?UTF-8?q?Fabian=20Gr=C3=BCnbichler?= <f.gruenbichler@proxmox.com>
|
|
Date: Mon, 2 Aug 2021 10:22:30 +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 c2ff8072deba40887560dc73dd2e558ec539ea09.
|
|
|
|
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>
|
|
---
|
|
drivers/pci/probe.c | 49 ++++-----------------------------------------
|
|
1 file changed, 4 insertions(+), 45 deletions(-)
|
|
|
|
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
|
|
index 04664d4fe4be..be51670572fa 100644
|
|
--- a/drivers/pci/probe.c
|
|
+++ b/drivers/pci/probe.c
|
|
@@ -19,7 +19,6 @@
|
|
#include <linux/hypervisor.h>
|
|
#include <linux/irqdomain.h>
|
|
#include <linux/pm_runtime.h>
|
|
-#include <linux/list_sort.h>
|
|
#include "pci.h"
|
|
|
|
#define CARDBUS_LATENCY_TIMER 176 /* secondary latency timer */
|
|
@@ -875,30 +874,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, struct list_head *a, 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;
|
|
@@ -976,35 +959,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);
|