linux-pci.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2] PCI: don't UNSET valid resources when reassign fails
@ 2014-06-19 11:58 Guo Chao
  2014-07-05 16:27 ` Bjorn Helgaas
  0 siblings, 1 reply; 3+ messages in thread
From: Guo Chao @ 2014-06-19 11:58 UTC (permalink / raw)
  To: linux-pci; +Cc: Guo Chao

Commit bd064f0a sets IORESOURCE_UNSET flag if resources can not be
assgined. Part of these changes breaks resource assignment.

If resource is too big, PCI core assgins basic part first and
extends (reassigns) it to include optional part (notably SR-IOV resources).
In this case, IORESOURCE_UNSET should not be set if resource is properly
assigned before reassigning. Otherwise, these resources are never updated
to hardware and we will see errors like this:

	pci 0003:00:00.0: can't enable device: BAR 15 [mem size 0x0c000000 64bit pref] not assigned
	pci 0003:00:00.0: Error enabling bridge (-22), continuing

Signed-off-by: Guo Chao <yan@linux.vnet.ibm.com>
---
Changed from v1: don't clear IORESOURCE_UNSET unconditionally
---
 drivers/pci/setup-res.c | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

diff --git a/drivers/pci/setup-res.c b/drivers/pci/setup-res.c
index caed1ce..2022f49 100644
--- a/drivers/pci/setup-res.c
+++ b/drivers/pci/setup-res.c
@@ -321,9 +321,14 @@ int pci_reassign_resource(struct pci_dev *dev, int resno, resource_size_t addsiz
 {
 	struct resource *res = dev->resource + resno;
 	resource_size_t new_size;
-	int ret;
+	int ret, valid;
+
+	if (!(res->flags & IORESOURCE_UNSET)) {
+		valid = 1;
+		res->flags |= IORESOURCE_UNSET;
+	} else
+		valid = 0;
 
-	res->flags |= IORESOURCE_UNSET;
 	if (!res->parent) {
 		dev_info(&dev->dev, "BAR %d: can't reassign an unassigned resource %pR\n",
 			 resno, res);
@@ -339,7 +344,9 @@ int pci_reassign_resource(struct pci_dev *dev, int resno, resource_size_t addsiz
 		dev_info(&dev->dev, "BAR %d: reassigned %pR\n", resno, res);
 		if (resno < PCI_BRIDGE_RESOURCES)
 			pci_update_resource(dev, resno);
-	}
+	} else if (valid)
+		res->flags &= ~IORESOURCE_UNSET;
+
 	return ret;
 }
 
-- 
1.8.3.1


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH v2] PCI: don't UNSET valid resources when reassign fails
  2014-06-19 11:58 [PATCH v2] PCI: don't UNSET valid resources when reassign fails Guo Chao
@ 2014-07-05 16:27 ` Bjorn Helgaas
  2014-07-09  3:30   ` Guo Chao
  0 siblings, 1 reply; 3+ messages in thread
From: Bjorn Helgaas @ 2014-07-05 16:27 UTC (permalink / raw)
  To: Guo Chao; +Cc: linux-pci

On Thu, Jun 19, 2014 at 07:58:16PM +0800, Guo Chao wrote:
> Commit bd064f0a sets IORESOURCE_UNSET flag if resources can not be
> assgined. Part of these changes breaks resource assignment.
> 
> If resource is too big, PCI core assgins basic part first and
> extends (reassigns) it to include optional part (notably SR-IOV resources).
> In this case, IORESOURCE_UNSET should not be set if resource is properly
> assigned before reassigning. Otherwise, these resources are never updated
> to hardware and we will see errors like this:
> 
> 	pci 0003:00:00.0: can't enable device: BAR 15 [mem size 0x0c000000 64bit pref] not assigned
> 	pci 0003:00:00.0: Error enabling bridge (-22), continuing
> 
> Signed-off-by: Guo Chao <yan@linux.vnet.ibm.com>

I propose the following simpler patch.  Can you verify that it works for
you?


commit 57ece376a3b9e013277032f473197052f1144142
Author: Guo Chao <yan@linux.vnet.ibm.com>
Date:   Thu Jul 3 18:30:29 2014 -0600

    PCI: Keep original resource if we fail to expand it
    
    If we have space assigned to a resource, we try to expand the resource
    (e.g., to accommodate SR-IOV resources), and the expansion attempt fails,
    we should keep the original assignment.
    
    After bd064f0a231a ("PCI: Mark resources as IORESOURCE_UNSET if we can't
    assign them"), we left the resource marked IORESOURCE_UNSET when the
    expansion failed, even if it had originally been set.  That caused errors
    like this:
    
      pci 0003:00:00.0: can't enable device: BAR 15 [mem size 0x0c000000 64bit pref] not assigned
      pci 0003:00:00.0: Error enabling bridge (-22), continuing
    
    Fix this by restoring the original flags when reassignment fails.
    
    [bhelgaas: reworked to simplify, changelog]
    Fixes: bd064f0a231a ("PCI: Mark resources as IORESOURCE_UNSET if we can't assign them")
    Signed-off-by: Guo Chao <yan@linux.vnet.ibm.com>
    Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
    CC: stable@vger.kernel.org	# v3.15+

diff --git a/drivers/pci/setup-res.c b/drivers/pci/setup-res.c
index caed1ce6facd..9faebcfeec4d 100644
--- a/drivers/pci/setup-res.c
+++ b/drivers/pci/setup-res.c
@@ -320,9 +320,11 @@ int pci_reassign_resource(struct pci_dev *dev, int resno, resource_size_t addsiz
 			resource_size_t min_align)
 {
 	struct resource *res = dev->resource + resno;
+	unsigned long flags;
 	resource_size_t new_size;
 	int ret;
 
+	flags = res->flags;
 	res->flags |= IORESOURCE_UNSET;
 	if (!res->parent) {
 		dev_info(&dev->dev, "BAR %d: can't reassign an unassigned resource %pR\n",
@@ -339,7 +341,12 @@ int pci_reassign_resource(struct pci_dev *dev, int resno, resource_size_t addsiz
 		dev_info(&dev->dev, "BAR %d: reassigned %pR\n", resno, res);
 		if (resno < PCI_BRIDGE_RESOURCES)
 			pci_update_resource(dev, resno);
+	} else {
+		res->flags = flags;
+		dev_info(&dev->dev, "BAR %d: %pR (failed to expand by %#llx)\n",
+			 resno, res, addsize);
 	}
+
 	return ret;
 }
 

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH v2] PCI: don't UNSET valid resources when reassign fails
  2014-07-05 16:27 ` Bjorn Helgaas
@ 2014-07-09  3:30   ` Guo Chao
  0 siblings, 0 replies; 3+ messages in thread
From: Guo Chao @ 2014-07-09  3:30 UTC (permalink / raw)
  To: Bjorn Helgaas; +Cc: linux-pci

On Sat, Jul 05, 2014 at 10:27:08AM -0600, Bjorn Helgaas wrote:
> On Thu, Jun 19, 2014 at 07:58:16PM +0800, Guo Chao wrote:
> > Commit bd064f0a sets IORESOURCE_UNSET flag if resources can not be
> > assgined. Part of these changes breaks resource assignment.
> > 
> > If resource is too big, PCI core assgins basic part first and
> > extends (reassigns) it to include optional part (notably SR-IOV resources).
> > In this case, IORESOURCE_UNSET should not be set if resource is properly
> > assigned before reassigning. Otherwise, these resources are never updated
> > to hardware and we will see errors like this:
> > 
> > 	pci 0003:00:00.0: can't enable device: BAR 15 [mem size 0x0c000000 64bit pref] not assigned
> > 	pci 0003:00:00.0: Error enabling bridge (-22), continuing
> > 
> > Signed-off-by: Guo Chao <yan@linux.vnet.ibm.com>
> 
> I propose the following simpler patch.  Can you verify that it works for
> you?

Hi Bjorn:

	Sure it works.

	(Sorry for this late response. The machine is out of reach for
	past few days.)

Thanks,
Guo Chao
> 
> 
> commit 57ece376a3b9e013277032f473197052f1144142
> Author: Guo Chao <yan@linux.vnet.ibm.com>
> Date:   Thu Jul 3 18:30:29 2014 -0600
> 
>     PCI: Keep original resource if we fail to expand it
>     
>     If we have space assigned to a resource, we try to expand the resource
>     (e.g., to accommodate SR-IOV resources), and the expansion attempt fails,
>     we should keep the original assignment.
>     
>     After bd064f0a231a ("PCI: Mark resources as IORESOURCE_UNSET if we can't
>     assign them"), we left the resource marked IORESOURCE_UNSET when the
>     expansion failed, even if it had originally been set.  That caused errors
>     like this:
>     
>       pci 0003:00:00.0: can't enable device: BAR 15 [mem size 0x0c000000 64bit pref] not assigned
>       pci 0003:00:00.0: Error enabling bridge (-22), continuing
>     
>     Fix this by restoring the original flags when reassignment fails.
>     
>     [bhelgaas: reworked to simplify, changelog]
>     Fixes: bd064f0a231a ("PCI: Mark resources as IORESOURCE_UNSET if we can't assign them")
>     Signed-off-by: Guo Chao <yan@linux.vnet.ibm.com>
>     Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
>     CC: stable@vger.kernel.org	# v3.15+
> 
> diff --git a/drivers/pci/setup-res.c b/drivers/pci/setup-res.c
> index caed1ce6facd..9faebcfeec4d 100644
> --- a/drivers/pci/setup-res.c
> +++ b/drivers/pci/setup-res.c
> @@ -320,9 +320,11 @@ int pci_reassign_resource(struct pci_dev *dev, int resno, resource_size_t addsiz
>  			resource_size_t min_align)
>  {
>  	struct resource *res = dev->resource + resno;
> +	unsigned long flags;
>  	resource_size_t new_size;
>  	int ret;
> 
> +	flags = res->flags;
>  	res->flags |= IORESOURCE_UNSET;
>  	if (!res->parent) {
>  		dev_info(&dev->dev, "BAR %d: can't reassign an unassigned resource %pR\n",
> @@ -339,7 +341,12 @@ int pci_reassign_resource(struct pci_dev *dev, int resno, resource_size_t addsiz
>  		dev_info(&dev->dev, "BAR %d: reassigned %pR\n", resno, res);
>  		if (resno < PCI_BRIDGE_RESOURCES)
>  			pci_update_resource(dev, resno);
> +	} else {
> +		res->flags = flags;
> +		dev_info(&dev->dev, "BAR %d: %pR (failed to expand by %#llx)\n",
> +			 resno, res, addsize);
>  	}
> +
>  	return ret;
>  }
> 
> 


^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2014-07-09  3:30 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-06-19 11:58 [PATCH v2] PCI: don't UNSET valid resources when reassign fails Guo Chao
2014-07-05 16:27 ` Bjorn Helgaas
2014-07-09  3:30   ` Guo Chao

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).