提交 3ad674d6 编写于 作者: A Alexey Neyman 提交者: Bjorn Helgaas

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=62511Signed-off-by: NAlexey Neyman <stilor@att.net>
Signed-off-by: NBjorn Helgaas <bhelgaas@google.com>
上级 6b49ee49
...@@ -354,12 +354,12 @@ static void coalesce_windows(struct pci_root_info *info, unsigned long type) ...@@ -354,12 +354,12 @@ static void coalesce_windows(struct pci_root_info *info, unsigned long type)
* the kernel resource tree doesn't allow overlaps. * the kernel resource tree doesn't allow overlaps.
*/ */
if (resource_overlaps(res1, res2)) { if (resource_overlaps(res1, res2)) {
res1->start = min(res1->start, res2->start); res2->start = min(res1->start, res2->start);
res1->end = max(res1->end, res2->end); res2->end = max(res1->end, res2->end);
dev_info(&info->bridge->dev, dev_info(&info->bridge->dev,
"host bridge window expanded to %pR; %pR ignored\n", "host bridge window expanded to %pR; %pR ignored\n",
res1, res2); res2, res1);
res2->flags = 0; res1->flags = 0;
} }
} }
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册