Skip to contentSkip to conversation

PCI: keep resource size during alignment reordering

PATCH In review Yinghai Lu 3 participants 6 messages May 29, 2015 – Jun 5, 2015 PCI

lore
Share & tools
lore

Yinghai Lu

author
#0 lore raw

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.

Fixes d74b9027a4da ("PCI: Consider additional PF's IOV BAR alignment in sizing and assigning")
Cc Wei Yang <[email protected]>
Cc Benjamin Herrenschmidt <[email protected]>
---
 drivers/pci/setup-bus.c |    5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/pci/setup-bus.c +3 -2
Index: linux-2.6/drivers/pci/setup-bus.c
===================================================================
@@ -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,
maintainer
#1 lore raw
Quoted 6 lines · Yinghai Lu

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.

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")
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:

https://git.kernel.org/cgit/linux/kernel/git/helgaas/pci.git/commit/?h=for-linus&id=a6b65983dabceb7ccb1801ee7f5bd421c2704d16

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,
author
#2 lore raw
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 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.

...

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

Acked-by on v1 1/1
#3 lore raw
In reply to Yinghai Lu
Quoted 6 lines · Yinghai Lu

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.

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")
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
maintainer
#4 lore raw
In reply to Yinghai Lu
Quoted 6 lines · Yinghai Lu

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.

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")
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,
maintainer Acked-by Wei Yang on v1 1/1
#5 lore raw
In reply to Yinghai Lu
Quoted 6 lines · Yinghai Lu

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.

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")
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.

[bhelgaas: changelog]
Fixes d74b9027a4da ("PCI: Consider additional PF's IOV BAR alignment in sizing and assigning")
CC Benjamin Herrenschmidt <[email protected]>