Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1342677
| From | Yinghai Lu <yinghai@kernel.org> |
|---|---|
| Newsgroups | linux.kernel |
| Subject | [PATCH v10 16/59] PCI: Don't release fixed resource for realloc |
| Date | 2016-02-25 03:40 +0100 |
| Message-ID | <r5U0p-5vw-7@gated-at.bofh.it> (permalink) |
| References | <r5TH3-5ok-3@gated-at.bofh.it> |
| Organization | linux.* mail to news gateway |
We should not release bridge resource if there is fixed resources
under it, otherwise the children firmware would stop working.
Reported-by: Paul Johnson <pjay@nwtrail.com>
Suggested-by: Bjorn Helgaas <bhelgaas@google.com>
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=92351
Signed-off-by: Yinghai Lu <yinghai@kernel.org>
Cc: stable@vger.kernel.org
---
drivers/pci/setup-bus.c | 6 ++++--
include/linux/ioport.h | 2 +-
kernel/resource.c | 28 ++++++++++++++++++++++++++--
3 files changed, 31 insertions(+), 5 deletions(-)
diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c
index 7a758e8..05769c4 100644
--- a/drivers/pci/setup-bus.c
+++ b/drivers/pci/setup-bus.c
@@ -1541,14 +1541,16 @@ static void pci_bridge_release_resources(struct pci_bus *bus,
r = &b_res[idx];
- if (!r->parent)
+ if (!r->parent || r->flags & IORESOURCE_PCI_FIXED)
return;
/*
* if there are children under that, we should release them
* all
*/
- release_child_resources(r);
+ if (!release_child_resources(r))
+ return;
+
if (!release_resource(r)) {
type = old_flags = r->flags & type_mask;
dev_printk(KERN_DEBUG, &dev->dev, "resource %d %pR released\n",
diff --git a/include/linux/ioport.h b/include/linux/ioport.h
index 24bea08..26b0a08 100644
--- a/include/linux/ioport.h
+++ b/include/linux/ioport.h
@@ -142,7 +142,7 @@ extern struct resource iomem_resource;
extern struct resource *request_resource_conflict(struct resource *root, struct resource *new);
extern int request_resource(struct resource *root, struct resource *new);
extern int release_resource(struct resource *new);
-void release_child_resources(struct resource *new);
+bool release_child_resources(struct resource *new);
extern void reserve_region_with_split(struct resource *root,
resource_size_t start, resource_size_t end,
const char *name);
diff --git a/kernel/resource.c b/kernel/resource.c
index 3669d1b..3d7cf0b 100644
--- a/kernel/resource.c
+++ b/kernel/resource.c
@@ -275,11 +275,35 @@ static void __release_child_resources(struct resource *r)
}
}
-void release_child_resources(struct resource *r)
+static bool __has_fixed_child_resources(struct resource *r)
{
+ struct resource *p;
+
+ p = r->child;
+ while (p) {
+ if (p->flags & IORESOURCE_PCI_FIXED)
+ return true;
+
+ if (__has_fixed_child_resources(p))
+ return true;
+
+ p = p->sibling;
+ }
+
+ return false;
+}
+
+bool release_child_resources(struct resource *r)
+{
+ bool fixed;
+
write_lock(&resource_lock);
- __release_child_resources(r);
+ fixed = __has_fixed_child_resources(r);
+ if (!fixed)
+ __release_child_resources(r);
write_unlock(&resource_lock);
+
+ return !fixed;
}
/**
--
1.8.4.5
Back to linux.kernel | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread
[PATCH v10 00/59] PCI: Resource allocation cleanup for v4.6 Yinghai Lu <yinghai@kernel.org> - 2016-02-25 03:40 +0100 [PATCH v10 16/59] PCI: Don't release fixed resource for realloc Yinghai Lu <yinghai@kernel.org> - 2016-02-25 03:40 +0100 [PATCH v10 12/59] PCI: Only treat non-pref mmio64 as pref if all bridges have MEM_64 Yinghai Lu <yinghai@kernel.org> - 2016-02-25 03:40 +0100 [PATCH v10 04/59] sparc/PCI: Add IORESOURCE_MEM_64 for 64-bit resource in OF parsing Yinghai Lu <yinghai@kernel.org> - 2016-02-25 03:40 +0100 [PATCH v10 14/59] PCI: Only treat non-pref mmio64 as pref if host bridge has mmio64 Yinghai Lu <yinghai@kernel.org> - 2016-02-25 03:40 +0100 [PATCH v10 41/59] PCI: Skip required+optional if there is no optional Yinghai Lu <yinghai@kernel.org> - 2016-02-25 03:40 +0100 [PATCH v10 01/59] PCI: Add pci_find_root_bus_resource() Yinghai Lu <yinghai@kernel.org> - 2016-02-25 03:40 +0100 [PATCH v10 07/59] PCI: Ignore BAR for ALi M1533 PCI-ISA bridge Yinghai Lu <yinghai@kernel.org> - 2016-02-25 03:40 +0100 [PATCH v10 13/59] PCI: Add has_mem64 for struct host_bridge Yinghai Lu <yinghai@kernel.org> - 2016-02-25 04:20 +0100 [PATCH v10 27/59] PCI: Optimize bus align/size calculation for optional during sizing Yinghai Lu <yinghai@kernel.org> - 2016-02-25 04:20 +0100 [PATCH v10 33/59] PCI: Add debug printout during releasing partial assigned resources Yinghai Lu <yinghai@kernel.org> - 2016-02-25 04:20 +0100 [PATCH v10 19/59] PCI: Separate realloc list checking after allocation Yinghai Lu <yinghai@kernel.org> - 2016-02-25 04:20 +0100 [PATCH v10 23/59] PCI: Cleanup res_to_dev_res() printout Yinghai Lu <yinghai@kernel.org> - 2016-02-25 04:20 +0100
csiph-web