]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
PCI: Don't reassign resources that are already aligned
authorBjorn Helgaas <bhelgaas@google.com>
Mon, 17 Apr 2017 20:20:58 +0000 (15:20 -0500)
committerBjorn Helgaas <bhelgaas@google.com>
Wed, 19 Apr 2017 17:52:40 +0000 (12:52 -0500)
The "pci=resource_alignment=" kernel argument designates devices for which
we want alignment greater than is required by the PCI specs.  Previously we
set IORESOURCE_UNSET for every MEM resource of those devices, even if the
resource was *already* sufficiently aligned.

If a resource is already sufficiently aligned, leave it alone and don't try
to reassign it.

Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
drivers/pci/pci.c

index 1d8bb090a40b93815cc558a181502557f27813ef..7eb6eb384e36fc803697a233bd1f4effc648d01f 100644 (file)
@@ -5065,30 +5065,28 @@ static void pci_request_resource_alignment(struct pci_dev *dev, int bar,
        }
 
        size = resource_size(r);
-       if (size < align) {
+       if (size >= align)
+               return;
 
-               /*
-                * Increase the size of the resource.  BARs are aligned on
-                * their size, so when we reallocate space for this
-                * resource, we'll allocate it with the larger alignment.
-                * It also prevents assignment of any other BARs inside the
-                * size.  If we're requesting page alignment, this means no
-                * other BARs will share the page.
-                *
-                * This makes the resource larger than the hardware BAR,
-                * which may break drivers that compute things based on the
-                * resource size, e.g., to find registers at a fixed offset
-                * before the end of the BAR.  We hope users don't request
-                * alignment for such devices.
-                */
-               size = align;
-               dev_info(&dev->dev, "BAR%d %pR: requesting alignment to %#llx\n",
-                        bar, r, (unsigned long long)align);
+       /*
+        * Increase the size of the resource.  BARs are aligned on their
+        * size, so when we reallocate space for this resource, we'll
+        * allocate it with the larger alignment.  It also prevents
+        * assignment of any other BARs inside the size.  If we're
+        * requesting page alignment, this means no other BARs will share
+        * the page.
+        *
+        * This makes the resource larger than the hardware BAR, which may
+        * break drivers that compute things based on the resource size,
+        * e.g., to find registers at a fixed offset before the end of the
+        * BAR.  We hope users don't request alignment for such devices.
+        */
+       dev_info(&dev->dev, "BAR%d %pR: requesting alignment to %#llx\n",
+                bar, r, (unsigned long long)align);
 
-       }
-       r->flags |= IORESOURCE_UNSET;
-       r->end = size - 1;
        r->start = 0;
+       r->end = align - 1;
+       r->flags |= IORESOURCE_UNSET;
 }
 
 /*