* [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).