summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBjorn Helgaas2017-04-17 22:20:58 +0200
committerBjorn Helgaas2017-04-19 19:52:40 +0200
commit0dde1c08d1b9dea01cefb327dba8a6e3ae795214 (patch)
tree0bb3fcdc85007277cafcd3dcd0e52f6a4136c101
parentPCI: Factor pci_reassigndev_resource_alignment() (diff)
downloadkernel-qcow2-linux-0dde1c08d1b9dea01cefb327dba8a6e3ae795214.tar.gz
kernel-qcow2-linux-0dde1c08d1b9dea01cefb327dba8a6e3ae795214.tar.xz
kernel-qcow2-linux-0dde1c08d1b9dea01cefb327dba8a6e3ae795214.zip
PCI: Don't reassign resources that are already aligned
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>
-rw-r--r--drivers/pci/pci.c40
1 files changed, 19 insertions, 21 deletions
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
index 1d8bb090a40b..7eb6eb384e36 100644
--- a/drivers/pci/pci.c
+++ b/drivers/pci/pci.c
@@ -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;
}
/*