Commit 79896cf4 authored by Linus Torvalds's avatar Linus Torvalds

Make pci_claim_resource() use request_resource() rather than insert_resource()

This function has traditionally used "insert_resource()", because before
commit cebd78a8 ("Fix pci_claim_resource") it used to just insert the
resource into whatever root resource tree that was indicated by
"pcibios_select_root()".

So there Matthew fixed it to actually look up the proper parent
resource, which means that now it's actively wrong to then traverse the
resource tree any more: we already know exactly where the new resource
should go.

And when we then did commit a76117df ("x86: Use pci_claim_resource"),
which changed the x86 PCI code from the open-coded

	pr = pci_find_parent_resource(dev, r);
	if (!pr || request_resource(pr, r) < 0) {

to using

	if (pci_claim_resource(dev, idx) < 0) {

that "insert_resource()" now suddenly became a problem, and causes a
regression covered by

	http://bugzilla.kernel.org/show_bug.cgi?id=13891

which this fixes.
Reported-and-tested-by: default avatarRafael J. Wysocki <rjw@sisk.pl>
Cc: Matthew Wilcox <willy@linux.intel.com>
Cc: Andrew Patterson <andrew.patterson@hp.com>
Cc: Linux PCI <linux-pci@vger.kernel.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 0dd8486b
...@@ -100,16 +100,16 @@ int pci_claim_resource(struct pci_dev *dev, int resource) ...@@ -100,16 +100,16 @@ int pci_claim_resource(struct pci_dev *dev, int resource)
{ {
struct resource *res = &dev->resource[resource]; struct resource *res = &dev->resource[resource];
struct resource *root; struct resource *root;
char *dtype = resource < PCI_BRIDGE_RESOURCES ? "device" : "bridge";
int err; int err;
root = pci_find_parent_resource(dev, res); root = pci_find_parent_resource(dev, res);
err = -EINVAL; err = -EINVAL;
if (root != NULL) if (root != NULL)
err = insert_resource(root, res); err = request_resource(root, res);
if (err) { if (err) {
const char *dtype = resource < PCI_BRIDGE_RESOURCES ? "device" : "bridge";
dev_err(&dev->dev, "BAR %d: %s of %s %pR\n", dev_err(&dev->dev, "BAR %d: %s of %s %pR\n",
resource, resource,
root ? "address space collision on" : root ? "address space collision on" :
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment