aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pci/setup-bus.c
diff options
context:
space:
mode:
authorWei Yang <weiyang@linux.vnet.ibm.com>2015-05-19 14:24:17 +0800
committerBjorn Helgaas <bhelgaas@google.com>2015-05-27 11:47:17 -0500
commita6b65983dabceb7ccb1801ee7f5bd421c2704d16 (patch)
tree04d4f169875b6839c5e801534f2a072c906a58b5 /drivers/pci/setup-bus.c
parentMAINTAINERS: Add Pratyush Anand as SPEAr13xx and DesignWare PCIe maintainer (diff)
downloadlinux-dev-a6b65983dabceb7ccb1801ee7f5bd421c2704d16.tar.xz
linux-dev-a6b65983dabceb7ccb1801ee7f5bd421c2704d16.zip
PCI: Fix IOV resource sorting by alignment requirement
In d74b9027a4da ("PCI: Consider additional PF's IOV BAR alignment in sizing and assigning"), it stores additional alignment in realloc_head and takes this into consideration for assignment. After getting the additional alignment, it reorders the head list so resources with bigger alignment are ahead of resources with smaller alignment. It does this by iterating over the head list and inserting ahead of any resource with smaller alignment. This should be done for the first occurrence, but the code currently iterates over the whole list. Fix this by terminating the loop when we find the first smaller resource in the head list. [bhelgaas: changelog] Fixes: d74b9027a4da ("PCI: Consider additional PF's IOV BAR alignment in sizing and assigning") Signed-off-by: Wei Yang <weiyang@linux.vnet.ibm.com> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Diffstat (limited to 'drivers/pci/setup-bus.c')
-rw-r--r--drivers/pci/setup-bus.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c
index 4fd0cacf7ca0..aa281d909eb0 100644
--- a/drivers/pci/setup-bus.c
+++ b/drivers/pci/setup-bus.c
@@ -435,9 +435,11 @@ static void __assign_resources_sorted(struct list_head *head,
list_for_each_entry(dev_res2, head, list) {
align = pci_resource_alignment(dev_res2->dev,
dev_res2->res);
- if (add_align > align)
+ if (add_align > align) {
list_move_tail(&dev_res->list,
&dev_res2->list);
+ break;
+ }
}
}