diff options
author | Alexey Neyman <stilor@att.net> | 2013-10-09 16:16:38 -0600 |
---|---|---|
committer | Bjorn Helgaas <bhelgaas@google.com> | 2013-10-10 07:11:59 -0600 |
commit | 3ad674d6c6c5724c83f10f422d826420c83536cd (patch) | |
tree | bf5856358a7c924c79e9d79e8fb1741009e3df47 | |
parent | 6b49ee49af11890f83fa660a99cd95ac6dacd2fa (diff) | |
download | op-kernel-dev-3ad674d6c6c5724c83f10f422d826420c83536cd.zip op-kernel-dev-3ad674d6c6c5724c83f10f422d826420c83536cd.tar.gz |
x86/PCI: Coalesce multiple overlapping host bridge windows
Previously we coalesced windows by expanding the first overlapping one and
making the second invalid. But we never look at the expanded first window
again, so we fail to notice other windows that overlap it. For example, we
coalesced these:
[io 0x0000-0x03af] // #0
[io 0x03e0-0x0cf7] // #1
[io 0x0000-0xdfff] // #2
into these, which still overlap:
[io 0x0000-0xdfff] // #0
[io 0x03e0-0x0cf7] // #1
The fix is to expand the *second* overlapping resource and ignore the
first, so we get this instead with no overlaps:
[io 0x0000-0xdfff] // #2
[bhelgaas: changelog]
Reference: https://bugzilla.kernel.org/show_bug.cgi?id=62511
Signed-off-by: Alexey Neyman <stilor@att.net>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
-rw-r--r-- | arch/x86/pci/acpi.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/arch/x86/pci/acpi.c b/arch/x86/pci/acpi.c index b30e937..7fb24e5 100644 --- a/arch/x86/pci/acpi.c +++ b/arch/x86/pci/acpi.c @@ -354,12 +354,12 @@ static void coalesce_windows(struct pci_root_info *info, unsigned long type) * the kernel resource tree doesn't allow overlaps. */ if (resource_overlaps(res1, res2)) { - res1->start = min(res1->start, res2->start); - res1->end = max(res1->end, res2->end); + res2->start = min(res1->start, res2->start); + res2->end = max(res1->end, res2->end); dev_info(&info->bridge->dev, "host bridge window expanded to %pR; %pR ignored\n", - res1, res2); - res2->flags = 0; + res2, res1); + res1->flags = 0; } } } |