PCI: keep resource size during alignment reordering
PATCH 1/1 PCI: keep resource size during alignment reordering
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.
During update the resource before reordering, it does not calculate resource end correctly.
We need to keep the original resource size before updating start. otherwise we will smaller size during updating end.
--- drivers/pci/setup-bus.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/pci/setup-bus.c +3 -2
@@ -428,9 +428,10 @@ static void __assign_resources_sorted(st* consistent. */ if (add_align > dev_res->res->start) { +resource_size_t r_size =resource_size (dev_res->res); + dev_res->res->start = add_align; - dev_res->res->end = add_align + -resource_size (dev_res->res); + dev_res->res->end = add_align + r_size -1 ;list_for_each_entry (dev_res2, head, list) { align = pci_resource_alignment(dev_res2->dev,
Bjorn Helgaas
maintainerQuoted 6 lines · Yinghai Lu
In
d74b9027a4da("PCI: Consider additional PF's IOV BAR alignment in sizing and assigning"), it stores additional alignment inrealloc_headand takes this into consideration for assignment.
During update the resource before reordering, it does not calculate resource end correctly.
Quoted 7 lines
We need to keep the original resource size before updating start. otherwise we will smaller size during updating end.
Fixes d74b9027a4da ("PCI: Consider additional PF's IOV BAR alignment in sizing and assigning")Signed-off-by Yinghai Lu <[email protected]>Cc Wei Yang <[email protected]>Cc Benjamin Herrenschmidt <[email protected]>
I already merged this fix for the same commit:
http://lkml.kernel.org/r/[email protected]
Is this a separate fix for a different problem? Is it a fix for the same problem, just implemented differently?
I'd like Wei's ack for this just to make sure we don't get things mixed up.
Wei's first fix is on my for-linus branch:
Quoted 21 lines
--- drivers/pci/setup-bus.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)Index:
linux-2.6/drivers/pci/setup-bus.c
===================================================================drivers/pci/setup-bus.c +3
-2@@ -428,9 +428,10 @@ static void __assign_resources_sorted(st* consistent. */ if (add_align > dev_res->res->start) { +resource_size_t r_size =resource_size (dev_res->res); + dev_res->res->start = add_align; - dev_res->res->end = add_align + -resource_size (dev_res->res); + dev_res->res->end = add_align + r_size -1 ;list_for_each_entry (dev_res2, head, list) { align = pci_resource_alignment(dev_res2->dev,
Quoted 9 lines · Bjorn Helgaas
Quoted 8 lines · Yinghai Lu
In
d74b9027a4da("PCI: Consider additional PF's IOV BAR alignment in sizing and assigning"), it stores additional alignment inrealloc_headand takes this into consideration for assignment.
During update the resource before reordering, it does not calculate resource end correctly.We need to keep the original resource size before updating start. otherwise we will smaller size during updating end.
...
Quoted 6 lines
I already merged this fix for the same commit:
http://lkml.kernel.org/r/[email protected]
Is this a separate fix for a different problem? Is it a fix for the same problem, just implemented differently?
It is a separate fix for different problem. We should keep the size while changing the alignement.
Thanks
Yinghai
Quoted 6 lines · Yinghai Lu
In
d74b9027a4da("PCI: Consider additional PF's IOV BAR alignment in sizing and assigning"), it stores additional alignment inrealloc_headand takes this into consideration for assignment.
During update the resource before reordering, it does not calculate resource end correctly.
Quoted 7 lines
We need to keep the original resource size before updating start. otherwise we will smaller size during updating end.
Fixes d74b9027a4da ("PCI: Consider additional PF's IOV BAR alignment in sizing and assigning")Signed-off-by Yinghai Lu <[email protected]>Cc Wei Yang <[email protected]>Cc Benjamin Herrenschmidt <[email protected]>
Thanks Yinghai,
I have tested this on Power8, your code is correct. :-)
Quoted 22 lines
---
drivers/pci/setup-bus.c| 5 +++--1 file changed, 3 insertions(+), 2 deletions(-)Index:
linux-2.6/drivers/pci/setup-bus.c
===================================================================drivers/pci/setup-bus.c +3
-2@@ -428,9 +428,10 @@ static void __assign_resources_sorted(st* consistent. */ if (add_align > dev_res->res->start) { +resource_size_t r_size =resource_size (dev_res->res); + dev_res->res->start = add_align; - dev_res->res->end = add_align + -resource_size (dev_res->res); + dev_res->res->end = add_align + r_size -1 ;list_for_each_entry (dev_res2, head, list) { align = pci_resource_alignment(dev_res2->dev,
Signature · 2 lines
Richard Yang Help you, Help me
Bjorn Helgaas
maintainerQuoted 6 lines · Yinghai Lu
In
d74b9027a4da("PCI: Consider additional PF's IOV BAR alignment in sizing and assigning"), it stores additional alignment inrealloc_headand takes this into consideration for assignment.
During update the resource before reordering, it does not calculate resource end correctly.
Quoted 7 lines
We need to keep the original resource size before updating start. otherwise we will smaller size during updating end.
Fixes d74b9027a4da ("PCI: Consider additional PF's IOV BAR alignment in sizing and assigning")Signed-off-by Yinghai Lu <[email protected]>Cc Wei Yang <[email protected]>Cc Benjamin Herrenschmidt <[email protected]>
Applied with Wei's ack to for-linus for v4.1, thanks!
Quoted 21 lines
--- drivers/pci/setup-bus.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)Index:
linux-2.6/drivers/pci/setup-bus.c
===================================================================drivers/pci/setup-bus.c +3
-2@@ -428,9 +428,10 @@ static void __assign_resources_sorted(st* consistent. */ if (add_align > dev_res->res->start) { +resource_size_t r_size =resource_size (dev_res->res); + dev_res->res->start = add_align; - dev_res->res->end = add_align + -resource_size (dev_res->res); + dev_res->res->end = add_align + r_size -1 ;list_for_each_entry (dev_res2, head, list) { align = pci_resource_alignment(dev_res2->dev,
Quoted 6 lines · Yinghai Lu
In
d74b9027a4da("PCI: Consider additional PF's IOV BAR alignment in sizing and assigning"), it stores additional alignment inrealloc_headand takes this into consideration for assignment.
During update the resource before reordering, it does not calculate resource end correctly.
Quoted 7 lines
We need to keep the original resource size before updating start. otherwise we will smaller size during updating end.
Fixes d74b9027a4da ("PCI: Consider additional PF's IOV BAR alignment in sizing and assigning")Signed-off-by Yinghai Lu <[email protected]>Cc Wei Yang <[email protected]>Cc Benjamin Herrenschmidt <[email protected]>
I applied this with the following changelog, included here so search engines can find the original thread:
PCI: Preserve resource size during alignment reordering
In d74b9027a4da ("PCI: Consider additional PF's IOV BAR alignment in sizing and assigning"), we store additional alignment in realloc_head and take this into consideration for assignment.
In __assign_resources_sorted(), we changed dev_res->res->start, then used resource_start() (which depends on res->start), so the recomputed res->end was completely bogus. Even if we'd had the correct size, the end would have been off by one.
Preserve the resource size when we adjust its alignment.