* [PATCH v4 1/3] resource: Use list_head to link sibling resource
@ 2018-05-07 6:32 ` Baoquan He
0 siblings, 0 replies; 42+ messages in thread
From: Baoquan He @ 2018-05-07 6:32 UTC (permalink / raw)
To: linux-kernel, akpm, robh+dt, dan.j.williams, nicolas.pitre, josh,
fengguang.wu, bp
Cc: brijesh.singh, devicetree, airlied, linux-pci, richard.weiyang,
keith.busch, jcmvbkbc, baiyaowei, kys, frowand.list,
lorenzo.pieralisi, sthemmin, Baoquan He, linux-nvdimm,
patrik.r.jakobsson, linux-input, gustavo, dyoung, vgoyal,
thomas.lendacky, haiyangz, maarten.lankhorst, jglisse, seanpaul,
bhelgaas, tglx, yinghai, jonathan.derrick, chris, monstr,
linux-parisc, gregkh, dmitry.torokhov, kexec, ebiederm, devel,
davem
The struct resource uses singly linked list to link siblings, implemented
by pointer operation. Replace it with list_head for better code readability.
Based on this list_head replacement, it will be very easy to do reverse
iteration on iomem_resource's sibling list in later patch.
Besides, type of member variables of struct resource, sibling and child, are
changed from 'struct resource *' to 'struct list_head'. This brings two
pointers of size increase.
Suggested-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Baoquan He <bhe@redhat.com>
Cc: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
Cc: David Airlie <airlied@linux.ie>
Cc: "K. Y. Srinivasan" <kys@microsoft.com>
Cc: Haiyang Zhang <haiyangz@microsoft.com>
Cc: Stephen Hemminger <sthemmin@microsoft.com>
Cc: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Cc: Dan Williams <dan.j.williams@intel.com>
Cc: Rob Herring <robh+dt@kernel.org>
Cc: Frank Rowand <frowand.list@gmail.com>
Cc: Keith Busch <keith.busch@intel.com>
Cc: Jonathan Derrick <jonathan.derrick@intel.com>
Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Cc: Bjorn Helgaas <bhelgaas@google.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Brijesh Singh <brijesh.singh@amd.com>
Cc: "Jérôme Glisse" <jglisse@redhat.com>
Cc: Borislav Petkov <bp@suse.de>
Cc: Tom Lendacky <thomas.lendacky@amd.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Yaowei Bai <baiyaowei@cmss.chinamobile.com>
Cc: Wei Yang <richard.weiyang@gmail.com>
Cc: devel@linuxdriverproject.org
Cc: linux-input@vger.kernel.org
Cc: linux-nvdimm@lists.01.org
Cc: devicetree@vger.kernel.org
Cc: linux-pci@vger.kernel.org
---
v3->v4:
Fix several bugs test robot reported. And change patch log.
v2->v3:
Rename resource functions first_child() and sibling() to
resource_first_chils() and resource_sibling(). Dan suggested this.
Move resource_first_chils() and resource_sibling() to linux/ioport.h
and make them as inline function. Rob suggested this. Accordingly add
linux/list.h including in linux/ioport.h, please help review if this
bring efficiency degradation or code redundancy.
The change on struct resource {} bring two pointers of size increase,
mention this in git log to make it more specifically, Rob suggested
this.
arch/microblaze/pci/pci-common.c | 31 +++--
arch/sparc/kernel/ioport.c | 2 +-
arch/xtensa/include/asm/pci-bridge.h | 4 +-
drivers/eisa/eisa-bus.c | 2 +
drivers/gpu/drm/drm_memory.c | 3 +-
drivers/gpu/drm/gma500/gtt.c | 5 +-
drivers/hv/vmbus_drv.c | 52 ++++----
drivers/input/joystick/iforce/iforce-main.c | 4 +-
drivers/nvdimm/e820.c | 2 +-
drivers/nvdimm/namespace_devs.c | 6 +-
drivers/nvdimm/nd.h | 5 +-
drivers/of/address.c | 4 +-
drivers/parisc/lba_pci.c | 4 +-
drivers/pci/host/vmd.c | 8 +-
drivers/pci/probe.c | 2 +
drivers/pci/setup-bus.c | 2 +-
include/linux/ioport.h | 17 ++-
kernel/resource.c | 181 +++++++++++++---------------
18 files changed, 170 insertions(+), 164 deletions(-)
diff --git a/arch/microblaze/pci/pci-common.c b/arch/microblaze/pci/pci-common.c
index 161f9758c631..56d189cb4be4 100644
--- a/arch/microblaze/pci/pci-common.c
+++ b/arch/microblaze/pci/pci-common.c
@@ -533,7 +533,9 @@ void pci_process_bridge_OF_ranges(struct pci_controller *hose,
res->flags = range.flags;
res->start = range.cpu_addr;
res->end = range.cpu_addr + range.size - 1;
- res->parent = res->child = res->sibling = NULL;
+ res->parent = NULL;
+ INIT_LIST_HEAD(&res->child);
+ INIT_LIST_HEAD(&res->sibling);
}
}
@@ -625,28 +627,31 @@ EXPORT_SYMBOL(pcibios_add_device);
static int __init reparent_resources(struct resource *parent,
struct resource *res)
{
- struct resource *p, **pp;
- struct resource **firstpp = NULL;
+ struct resource *p, *first = NULL;
- for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) {
+ list_for_each_entry(p, &parent->child, sibling) {
if (p->end < res->start)
continue;
if (res->end < p->start)
break;
if (p->start < res->start || p->end > res->end)
return -1; /* not completely contained */
- if (firstpp == NULL)
- firstpp = pp;
+ if (first == NULL)
+ first = p;
}
- if (firstpp == NULL)
+ if (first == NULL)
return -1; /* didn't find any conflicting entries? */
res->parent = parent;
- res->child = *firstpp;
- res->sibling = *pp;
- *firstpp = res;
- *pp = NULL;
- for (p = res->child; p != NULL; p = p->sibling) {
- p->parent = res;
+ list_add(&res->sibling, &p->sibling.prev);
+ INIT_LIST_HEAD(&res->child);
+
+ /*
+ * From first to p's previous sibling, they all fall into
+ * res's region, change them as res's children.
+ */
+ list_cut_position(&res->child, first->sibling.prev, res->sibling.prev);
+ list_for_each_entry(p, &new->child, sibling) {
+ p->parent = new;
pr_debug("PCI: Reparented %s [%llx..%llx] under %s\n",
p->name,
(unsigned long long)p->start,
diff --git a/arch/sparc/kernel/ioport.c b/arch/sparc/kernel/ioport.c
index 3bcef9ce74df..4e91fbbbedcc 100644
--- a/arch/sparc/kernel/ioport.c
+++ b/arch/sparc/kernel/ioport.c
@@ -669,7 +669,7 @@ static int sparc_io_proc_show(struct seq_file *m, void *v)
struct resource *root = m->private, *r;
const char *nm;
- for (r = root->child; r != NULL; r = r->sibling) {
+ list_for_each_entry(r, &root->child, sibling) {
if ((nm = r->name) == NULL) nm = "???";
seq_printf(m, "%016llx-%016llx: %s\n",
(unsigned long long)r->start,
diff --git a/arch/xtensa/include/asm/pci-bridge.h b/arch/xtensa/include/asm/pci-bridge.h
index 0b68c76ec1e6..f487b06817df 100644
--- a/arch/xtensa/include/asm/pci-bridge.h
+++ b/arch/xtensa/include/asm/pci-bridge.h
@@ -71,8 +71,8 @@ static inline void pcibios_init_resource(struct resource *res,
res->flags = flags;
res->name = name;
res->parent = NULL;
- res->sibling = NULL;
- res->child = NULL;
+ INIT_LIST_HEAD(&res->child);
+ INIT_LIST_HEAD(&res->sibling);
}
diff --git a/drivers/eisa/eisa-bus.c b/drivers/eisa/eisa-bus.c
index 1e8062f6dbfc..dba78f75fd06 100644
--- a/drivers/eisa/eisa-bus.c
+++ b/drivers/eisa/eisa-bus.c
@@ -408,6 +408,8 @@ static struct resource eisa_root_res = {
.start = 0,
.end = 0xffffffff,
.flags = IORESOURCE_IO,
+ .sibling = LIST_HEAD_INIT(eisa_root_res.sibling),
+ .child = LIST_HEAD_INIT(eisa_root_res.child),
};
static int eisa_bus_count;
diff --git a/drivers/gpu/drm/drm_memory.c b/drivers/gpu/drm/drm_memory.c
index 3c54044214db..53e300a993dc 100644
--- a/drivers/gpu/drm/drm_memory.c
+++ b/drivers/gpu/drm/drm_memory.c
@@ -155,9 +155,8 @@ u64 drm_get_max_iomem(void)
struct resource *tmp;
resource_size_t max_iomem = 0;
- for (tmp = iomem_resource.child; tmp; tmp = tmp->sibling) {
+ list_for_each_entry(tmp, &iomem_resource.child, sibling)
max_iomem = max(max_iomem, tmp->end);
- }
return max_iomem;
}
diff --git a/drivers/gpu/drm/gma500/gtt.c b/drivers/gpu/drm/gma500/gtt.c
index 3949b0990916..addd3bc009af 100644
--- a/drivers/gpu/drm/gma500/gtt.c
+++ b/drivers/gpu/drm/gma500/gtt.c
@@ -565,7 +565,7 @@ int psb_gtt_init(struct drm_device *dev, int resume)
int psb_gtt_restore(struct drm_device *dev)
{
struct drm_psb_private *dev_priv = dev->dev_private;
- struct resource *r = dev_priv->gtt_mem->child;
+ struct resource *r;
struct gtt_range *range;
unsigned int restored = 0, total = 0, size = 0;
@@ -573,14 +573,13 @@ int psb_gtt_restore(struct drm_device *dev)
mutex_lock(&dev_priv->gtt_mutex);
psb_gtt_init(dev, 1);
- while (r != NULL) {
+ list_for_each_entry(r, &dev_priv->gtt_mem->child, sibling) {
range = container_of(r, struct gtt_range, resource);
if (range->pages) {
psb_gtt_insert(dev, range, 1);
size += range->resource.end - range->resource.start;
restored++;
}
- r = r->sibling;
total++;
}
mutex_unlock(&dev_priv->gtt_mutex);
diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c
index b10fe26c4891..d87ec5a1bc4c 100644
--- a/drivers/hv/vmbus_drv.c
+++ b/drivers/hv/vmbus_drv.c
@@ -1412,9 +1412,8 @@ static acpi_status vmbus_walk_resources(struct acpi_resource *res, void *ctx)
{
resource_size_t start = 0;
resource_size_t end = 0;
- struct resource *new_res;
+ struct resource *new_res, *tmp;
struct resource **old_res = &hyperv_mmio;
- struct resource **prev_res = NULL;
switch (res->type) {
@@ -1461,44 +1460,36 @@ static acpi_status vmbus_walk_resources(struct acpi_resource *res, void *ctx)
/*
* If two ranges are adjacent, merge them.
*/
- do {
- if (!*old_res) {
- *old_res = new_res;
- break;
- }
-
- if (((*old_res)->end + 1) == new_res->start) {
- (*old_res)->end = new_res->end;
+ if (!*old_res) {
+ *old_res = new_res;
+ return AE_OK;
+ }
+ tmp = *old_res;
+ list_for_each_entry_from(tmp, &tmp->parent->child, sibling) {
+ if ((tmp->end + 1) == new_res->start) {
+ tmp->end = new_res->end;
kfree(new_res);
break;
}
- if ((*old_res)->start == new_res->end + 1) {
- (*old_res)->start = new_res->start;
+ if (tmp->start == new_res->end + 1) {
+ tmp->start = new_res->start;
kfree(new_res);
break;
}
- if ((*old_res)->start > new_res->end) {
- new_res->sibling = *old_res;
- if (prev_res)
- (*prev_res)->sibling = new_res;
- *old_res = new_res;
+ if (tmp->start > new_res->end) {
+ list_add(&new_res->sibling, tmp->sibling.prev);
break;
}
-
- prev_res = old_res;
- old_res = &(*old_res)->sibling;
-
- } while (1);
+ }
return AE_OK;
}
static int vmbus_acpi_remove(struct acpi_device *device)
{
- struct resource *cur_res;
- struct resource *next_res;
+ struct resource *res;
if (hyperv_mmio) {
if (fb_mmio) {
@@ -1507,10 +1498,9 @@ static int vmbus_acpi_remove(struct acpi_device *device)
fb_mmio = NULL;
}
- for (cur_res = hyperv_mmio; cur_res; cur_res = next_res) {
- next_res = cur_res->sibling;
- kfree(cur_res);
- }
+ res = hyperv_mmio;
+ list_for_each_entry_from(res, &res->parent->child, sibling)
+ kfree(res);
}
return 0;
@@ -1596,7 +1586,8 @@ int vmbus_allocate_mmio(struct resource **new, struct hv_device *device_obj,
}
}
- for (iter = hyperv_mmio; iter; iter = iter->sibling) {
+ iter = hyperv_mmio;
+ list_for_each_entry_from(iter, &iter->parent->child, sibling) {
if ((iter->start >= max) || (iter->end <= min))
continue;
@@ -1639,7 +1630,8 @@ void vmbus_free_mmio(resource_size_t start, resource_size_t size)
struct resource *iter;
down(&hyperv_mmio_lock);
- for (iter = hyperv_mmio; iter; iter = iter->sibling) {
+ iter = hyperv_mmio;
+ list_for_each_entry_from(iter, &iter->parent->child, sibling) {
if ((iter->start >= start + size) || (iter->end <= start))
continue;
diff --git a/drivers/input/joystick/iforce/iforce-main.c b/drivers/input/joystick/iforce/iforce-main.c
index daeeb4c7e3b0..5c0be27b33ff 100644
--- a/drivers/input/joystick/iforce/iforce-main.c
+++ b/drivers/input/joystick/iforce/iforce-main.c
@@ -305,8 +305,8 @@ int iforce_init_device(struct iforce *iforce)
iforce->device_memory.end = 200;
iforce->device_memory.flags = IORESOURCE_MEM;
iforce->device_memory.parent = NULL;
- iforce->device_memory.child = NULL;
- iforce->device_memory.sibling = NULL;
+ INIT_LIST_HEAD(&iforce->device_memory.child);
+ INIT_LIST_HEAD(&iforce->device_memory.sibling);
/*
* Wait until device ready - until it sends its first response.
diff --git a/drivers/nvdimm/e820.c b/drivers/nvdimm/e820.c
index 6f9a6ffd7cde..513e661bb0d8 100644
--- a/drivers/nvdimm/e820.c
+++ b/drivers/nvdimm/e820.c
@@ -53,7 +53,7 @@ static int e820_pmem_probe(struct platform_device *pdev)
goto err;
platform_set_drvdata(pdev, nvdimm_bus);
- for (p = iomem_resource.child; p ; p = p->sibling) {
+ list_for_each_entry(p, &iomem_resource.child, sibling) {
struct nd_region_desc ndr_desc;
if (p->desc != IORES_DESC_PERSISTENT_MEMORY_LEGACY)
diff --git a/drivers/nvdimm/namespace_devs.c b/drivers/nvdimm/namespace_devs.c
index 28afdd668905..f53d410d9981 100644
--- a/drivers/nvdimm/namespace_devs.c
+++ b/drivers/nvdimm/namespace_devs.c
@@ -637,7 +637,7 @@ static resource_size_t scan_allocate(struct nd_region *nd_region,
retry:
first = 0;
for_each_dpa_resource(ndd, res) {
- struct resource *next = res->sibling, *new_res = NULL;
+ struct resource *next = resource_sibling(res), *new_res = NULL;
resource_size_t allocate, available = 0;
enum alloc_loc loc = ALLOC_ERR;
const char *action;
@@ -763,7 +763,7 @@ static resource_size_t scan_allocate(struct nd_region *nd_region,
* an initial "pmem-reserve pass". Only do an initial BLK allocation
* when none of the DPA space is reserved.
*/
- if ((is_pmem || !ndd->dpa.child) && n == to_allocate)
+ if ((is_pmem || list_empty(&ndd->dpa.child)) && n == to_allocate)
return init_dpa_allocation(label_id, nd_region, nd_mapping, n);
return n;
}
@@ -779,7 +779,7 @@ static int merge_dpa(struct nd_region *nd_region,
retry:
for_each_dpa_resource(ndd, res) {
int rc;
- struct resource *next = res->sibling;
+ struct resource *next = resource_sibling(res);
resource_size_t end = res->start + resource_size(res);
if (!next || strcmp(res->name, label_id->id) != 0
diff --git a/drivers/nvdimm/nd.h b/drivers/nvdimm/nd.h
index 32e0364b48b9..da7da15e03e7 100644
--- a/drivers/nvdimm/nd.h
+++ b/drivers/nvdimm/nd.h
@@ -102,11 +102,10 @@ unsigned sizeof_namespace_label(struct nvdimm_drvdata *ndd);
(unsigned long long) (res ? res->start : 0), ##arg)
#define for_each_dpa_resource(ndd, res) \
- for (res = (ndd)->dpa.child; res; res = res->sibling)
+ list_for_each_entry(res, &(ndd)->dpa.child, sibling)
#define for_each_dpa_resource_safe(ndd, res, next) \
- for (res = (ndd)->dpa.child, next = res ? res->sibling : NULL; \
- res; res = next, next = next ? next->sibling : NULL)
+ list_for_each_entry_safe(res, next, &(ndd)->dpa.child, sibling)
struct nd_percpu_lane {
int count;
diff --git a/drivers/of/address.c b/drivers/of/address.c
index 53349912ac75..e2e25719ab52 100644
--- a/drivers/of/address.c
+++ b/drivers/of/address.c
@@ -330,7 +330,9 @@ int of_pci_range_to_resource(struct of_pci_range *range,
{
int err;
res->flags = range->flags;
- res->parent = res->child = res->sibling = NULL;
+ res->parent = NULL;
+ INIT_LIST_HEAD(&res->child);
+ INIT_LIST_HEAD(&res->sibling);
res->name = np->full_name;
if (res->flags & IORESOURCE_IO) {
diff --git a/drivers/parisc/lba_pci.c b/drivers/parisc/lba_pci.c
index 69bd98421eb1..7482bdfd1959 100644
--- a/drivers/parisc/lba_pci.c
+++ b/drivers/parisc/lba_pci.c
@@ -170,8 +170,8 @@ lba_dump_res(struct resource *r, int d)
for (i = d; i ; --i) printk(" ");
printk(KERN_DEBUG "%p [%lx,%lx]/%lx\n", r,
(long)r->start, (long)r->end, r->flags);
- lba_dump_res(r->child, d+2);
- lba_dump_res(r->sibling, d);
+ lba_dump_res(resource_first_child(&r->child), d+2);
+ lba_dump_res(resource_sibling(r), d);
}
diff --git a/drivers/pci/host/vmd.c b/drivers/pci/host/vmd.c
index 930a8fa08bd6..c3000af903ea 100644
--- a/drivers/pci/host/vmd.c
+++ b/drivers/pci/host/vmd.c
@@ -520,14 +520,14 @@ static struct pci_ops vmd_ops = {
static void vmd_attach_resources(struct vmd_dev *vmd)
{
- vmd->dev->resource[VMD_MEMBAR1].child = &vmd->resources[1];
- vmd->dev->resource[VMD_MEMBAR2].child = &vmd->resources[2];
+ list_add(&vmd->resources[1].sibling, &vmd->dev->resource[VMD_MEMBAR1].child);
+ list_add(&vmd->resources[2].sibling, &vmd->dev->resource[VMD_MEMBAR2].child);
}
static void vmd_detach_resources(struct vmd_dev *vmd)
{
- vmd->dev->resource[VMD_MEMBAR1].child = NULL;
- vmd->dev->resource[VMD_MEMBAR2].child = NULL;
+ INIT_LIST_HEAD(&vmd->dev->resource[VMD_MEMBAR1].child);
+ INIT_LIST_HEAD(&vmd->dev->resource[VMD_MEMBAR2].child);
}
/*
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index ac91b6fd0bcd..d162c77bec29 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -59,6 +59,8 @@ static struct resource *get_pci_domain_busn_res(int domain_nr)
r->res.start = 0;
r->res.end = 0xff;
r->res.flags = IORESOURCE_BUS | IORESOURCE_PCI_FIXED;
+ INIT_LIST_HEAD(&r->res.child);
+ INIT_LIST_HEAD(&r->res.sibling);
list_add_tail(&r->list, &pci_domain_busn_res_list);
diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c
index 072784f55ea5..0d5e30004ca6 100644
--- a/drivers/pci/setup-bus.c
+++ b/drivers/pci/setup-bus.c
@@ -2107,7 +2107,7 @@ int pci_reassign_bridge_resources(struct pci_dev *bridge, unsigned long type)
continue;
/* Ignore BARs which are still in use */
- if (res->child)
+ if (!list_empty(&res->child))
continue;
ret = add_to_list(&saved, bridge, res, 0, 0);
diff --git a/include/linux/ioport.h b/include/linux/ioport.h
index da0ebaec25f0..225d13d3500a 100644
--- a/include/linux/ioport.h
+++ b/include/linux/ioport.h
@@ -12,6 +12,7 @@
#ifndef __ASSEMBLY__
#include <linux/compiler.h>
#include <linux/types.h>
+#include <linux/list.h>
/*
* Resources are tree-like, allowing
* nesting etc..
@@ -22,7 +23,8 @@ struct resource {
const char *name;
unsigned long flags;
unsigned long desc;
- struct resource *parent, *sibling, *child;
+ struct list_head child, sibling;
+ struct resource *parent;
};
/*
@@ -215,7 +217,6 @@ static inline bool resource_contains(struct resource *r1, struct resource *r2)
return r1->start <= r2->start && r1->end >= r2->end;
}
-
/* Convenience shorthand with allocation */
#define request_region(start,n,name) __request_region(&ioport_resource, (start), (n), (name), 0)
#define request_muxed_region(start,n,name) __request_region(&ioport_resource, (start), (n), (name), IORESOURCE_MUXED)
@@ -286,6 +287,18 @@ static inline bool resource_overlaps(struct resource *r1, struct resource *r2)
return (r1->start <= r2->end && r1->end >= r2->start);
}
+static inline struct resource *resource_sibling(struct resource *res)
+{
+ if (res->parent && !list_is_last(&res->sibling, &res->parent->child))
+ return list_next_entry(res, sibling);
+ return NULL;
+}
+
+static inline struct resource *resource_first_child(struct list_head *head)
+{
+ return list_first_entry_or_null(head, struct resource, sibling);
+}
+
#endif /* __ASSEMBLY__ */
#endif /* _LINUX_IOPORT_H */
diff --git a/kernel/resource.c b/kernel/resource.c
index 2af6c03858b9..4f560991c130 100644
--- a/kernel/resource.c
+++ b/kernel/resource.c
@@ -31,6 +31,8 @@ struct resource ioport_resource = {
.start = 0,
.end = IO_SPACE_LIMIT,
.flags = IORESOURCE_IO,
+ .sibling = LIST_HEAD_INIT(ioport_resource.sibling),
+ .child = LIST_HEAD_INIT(ioport_resource.child),
};
EXPORT_SYMBOL(ioport_resource);
@@ -39,6 +41,8 @@ struct resource iomem_resource = {
.start = 0,
.end = -1,
.flags = IORESOURCE_MEM,
+ .sibling = LIST_HEAD_INIT(iomem_resource.sibling),
+ .child = LIST_HEAD_INIT(iomem_resource.child),
};
EXPORT_SYMBOL(iomem_resource);
@@ -57,20 +61,20 @@ static DEFINE_RWLOCK(resource_lock);
* by boot mem after the system is up. So for reusing the resource entry
* we need to remember the resource.
*/
-static struct resource *bootmem_resource_free;
+static struct list_head bootmem_resource_free = LIST_HEAD_INIT(bootmem_resource_free);
static DEFINE_SPINLOCK(bootmem_resource_lock);
static struct resource *next_resource(struct resource *p, bool sibling_only)
{
/* Caller wants to traverse through siblings only */
if (sibling_only)
- return p->sibling;
+ return resource_sibling(p);
- if (p->child)
- return p->child;
- while (!p->sibling && p->parent)
+ if (!list_empty(&p->child))
+ return resource_first_child(&p->child);
+ while (!resource_sibling(p) && p->parent)
p = p->parent;
- return p->sibling;
+ return resource_sibling(p);
}
static void *r_next(struct seq_file *m, void *v, loff_t *pos)
@@ -90,7 +94,7 @@ static void *r_start(struct seq_file *m, loff_t *pos)
struct resource *p = m->private;
loff_t l = 0;
read_lock(&resource_lock);
- for (p = p->child; p && l < *pos; p = r_next(m, p, &l))
+ for (p = resource_first_child(&p->child); p && l < *pos; p = r_next(m, p, &l))
;
return p;
}
@@ -186,8 +190,7 @@ static void free_resource(struct resource *res)
if (!PageSlab(virt_to_head_page(res))) {
spin_lock(&bootmem_resource_lock);
- res->sibling = bootmem_resource_free;
- bootmem_resource_free = res;
+ list_add(&res->sibling, &bootmem_resource_free);
spin_unlock(&bootmem_resource_lock);
} else {
kfree(res);
@@ -199,10 +202,9 @@ static struct resource *alloc_resource(gfp_t flags)
struct resource *res = NULL;
spin_lock(&bootmem_resource_lock);
- if (bootmem_resource_free) {
- res = bootmem_resource_free;
- bootmem_resource_free = res->sibling;
- }
+ res = resource_first_child(&bootmem_resource_free);
+ if (res)
+ list_del(&res->sibling);
spin_unlock(&bootmem_resource_lock);
if (res)
@@ -210,6 +212,8 @@ static struct resource *alloc_resource(gfp_t flags)
else
res = kzalloc(sizeof(struct resource), flags);
+ INIT_LIST_HEAD(&res->child);
+ INIT_LIST_HEAD(&res->sibling);
return res;
}
@@ -218,7 +222,7 @@ static struct resource * __request_resource(struct resource *root, struct resour
{
resource_size_t start = new->start;
resource_size_t end = new->end;
- struct resource *tmp, **p;
+ struct resource *tmp;
if (end < start)
return root;
@@ -226,64 +230,62 @@ static struct resource * __request_resource(struct resource *root, struct resour
return root;
if (end > root->end)
return root;
- p = &root->child;
- for (;;) {
- tmp = *p;
- if (!tmp || tmp->start > end) {
- new->sibling = tmp;
- *p = new;
+
+ if (list_empty(&root->child)) {
+ list_add(&new->sibling, &root->child);
+ new->parent = root;
+ INIT_LIST_HEAD(&new->child);
+ return NULL;
+ }
+
+ list_for_each_entry(tmp, &root->child, sibling) {
+ if (tmp->start > end) {
+ list_add(&new->sibling, tmp->sibling.prev);
new->parent = root;
+ INIT_LIST_HEAD(&new->child);
return NULL;
}
- p = &tmp->sibling;
if (tmp->end < start)
continue;
return tmp;
}
+
+ list_add_tail(&new->sibling, &root->child);
+ new->parent = root;
+ INIT_LIST_HEAD(&new->child);
+ return NULL;
}
static int __release_resource(struct resource *old, bool release_child)
{
- struct resource *tmp, **p, *chd;
+ struct resource *tmp, *next, *chd;
- p = &old->parent->child;
- for (;;) {
- tmp = *p;
- if (!tmp)
- break;
+ list_for_each_entry_safe(tmp, next, &old->parent->child, sibling) {
if (tmp == old) {
- if (release_child || !(tmp->child)) {
- *p = tmp->sibling;
+ if (release_child || list_empty(&tmp->child)) {
+ list_del(&tmp->sibling);
} else {
- for (chd = tmp->child;; chd = chd->sibling) {
+ list_for_each_entry(chd, &tmp->child, sibling)
chd->parent = tmp->parent;
- if (!(chd->sibling))
- break;
- }
- *p = tmp->child;
- chd->sibling = tmp->sibling;
+ list_splice(&tmp->child, tmp->sibling.prev);
+ list_del(&tmp->sibling);
}
+
old->parent = NULL;
return 0;
}
- p = &tmp->sibling;
}
return -EINVAL;
}
static void __release_child_resources(struct resource *r)
{
- struct resource *tmp, *p;
+ struct resource *tmp, *next;
resource_size_t size;
- p = r->child;
- r->child = NULL;
- while (p) {
- tmp = p;
- p = p->sibling;
-
+ list_for_each_entry_safe(tmp, next, &r->child, sibling) {
tmp->parent = NULL;
- tmp->sibling = NULL;
+ INIT_LIST_HEAD(&tmp->sibling);
__release_child_resources(tmp);
printk(KERN_DEBUG "release child resource %pR\n", tmp);
@@ -292,6 +294,8 @@ static void __release_child_resources(struct resource *r)
tmp->start = 0;
tmp->end = size - 1;
}
+
+ INIT_LIST_HEAD(&tmp->child);
}
void release_child_resources(struct resource *r)
@@ -376,7 +380,8 @@ static int find_next_iomem_res(struct resource *res, unsigned long desc,
read_lock(&resource_lock);
- for (p = iomem_resource.child; p; p = next_resource(p, sibling_only)) {
+ for (p = resource_first_child(&iomem_resource.child); p;
+ p = next_resource(p, sibling_only)) {
if ((p->flags & res->flags) != res->flags)
continue;
if ((desc != IORES_DESC_NONE) && (desc != p->desc))
@@ -564,7 +569,7 @@ int region_intersects(resource_size_t start, size_t size, unsigned long flags,
struct resource *p;
read_lock(&resource_lock);
- for (p = iomem_resource.child; p ; p = p->sibling) {
+ list_for_each_entry(p, &iomem_resource.child, sibling) {
bool is_type = (((p->flags & flags) == flags) &&
((desc == IORES_DESC_NONE) ||
(desc == p->desc)));
@@ -618,7 +623,7 @@ static int __find_resource(struct resource *root, struct resource *old,
resource_size_t size,
struct resource_constraint *constraint)
{
- struct resource *this = root->child;
+ struct resource *this = resource_first_child(&root->child);
struct resource tmp = *new, avail, alloc;
tmp.start = root->start;
@@ -628,7 +633,7 @@ static int __find_resource(struct resource *root, struct resource *old,
*/
if (this && this->start == root->start) {
tmp.start = (this == old) ? old->start : this->end + 1;
- this = this->sibling;
+ this = resource_sibling(this);
}
for(;;) {
if (this)
@@ -664,7 +669,7 @@ next: if (!this || this->end == root->end)
if (this != old)
tmp.start = this->end + 1;
- this = this->sibling;
+ this = resource_sibling(this);
}
return -EBUSY;
}
@@ -708,7 +713,7 @@ static int reallocate_resource(struct resource *root, struct resource *old,
goto out;
}
- if (old->child) {
+ if (!list_empty(&old->child)) {
err = -EBUSY;
goto out;
}
@@ -789,7 +794,7 @@ struct resource *lookup_resource(struct resource *root, resource_size_t start)
struct resource *res;
read_lock(&resource_lock);
- for (res = root->child; res; res = res->sibling) {
+ list_for_each_entry(res, &root->child, sibling) {
if (res->start == start)
break;
}
@@ -822,32 +827,27 @@ static struct resource * __insert_resource(struct resource *parent, struct resou
break;
}
- for (next = first; ; next = next->sibling) {
+ for (next = first; ; next = resource_sibling(next)) {
/* Partial overlap? Bad, and unfixable */
if (next->start < new->start || next->end > new->end)
return next;
- if (!next->sibling)
+ if (!resource_sibling(next))
break;
- if (next->sibling->start > new->end)
+ if (resource_sibling(next)->start > new->end)
break;
}
-
new->parent = parent;
- new->sibling = next->sibling;
- new->child = first;
+ list_add(&new->sibling, &next->sibling);
+ INIT_LIST_HEAD(&new->child);
- next->sibling = NULL;
- for (next = first; next; next = next->sibling)
+ /*
+ * From first to next, they all fall into new's region, so change them
+ * as new's children.
+ */
+ list_cut_position(&new->child, first->sibling.prev, &next->sibling);
+ list_for_each_entry(next, &new->child, sibling)
next->parent = new;
- if (parent->child == first) {
- parent->child = new;
- } else {
- next = parent->child;
- while (next->sibling != first)
- next = next->sibling;
- next->sibling = new;
- }
return NULL;
}
@@ -969,19 +969,17 @@ static int __adjust_resource(struct resource *res, resource_size_t start,
if ((start < parent->start) || (end > parent->end))
goto out;
- if (res->sibling && (res->sibling->start <= end))
+ if (resource_sibling(res) && (resource_sibling(res)->start <= end))
goto out;
- tmp = parent->child;
- if (tmp != res) {
- while (tmp->sibling != res)
- tmp = tmp->sibling;
+ if (res->sibling.prev != &parent->child) {
+ tmp = list_prev_entry(res, sibling);
if (start <= tmp->end)
goto out;
}
skip:
- for (tmp = res->child; tmp; tmp = tmp->sibling)
+ list_for_each_entry(tmp, &res->child, sibling)
if ((tmp->start < start) || (tmp->end > end))
goto out;
@@ -1206,34 +1204,32 @@ EXPORT_SYMBOL(__request_region);
void __release_region(struct resource *parent, resource_size_t start,
resource_size_t n)
{
- struct resource **p;
+ struct resource *res;
resource_size_t end;
- p = &parent->child;
+ res = resource_first_child(&parent->child);
end = start + n - 1;
write_lock(&resource_lock);
for (;;) {
- struct resource *res = *p;
-
if (!res)
break;
if (res->start <= start && res->end >= end) {
if (!(res->flags & IORESOURCE_BUSY)) {
- p = &res->child;
+ res = resource_first_child(&res->child);
continue;
}
if (res->start != start || res->end != end)
break;
- *p = res->sibling;
+ list_del(&res->sibling);
write_unlock(&resource_lock);
if (res->flags & IORESOURCE_MUXED)
wake_up(&muxed_resource_wait);
free_resource(res);
return;
}
- p = &res->sibling;
+ res = resource_sibling(res);
}
write_unlock(&resource_lock);
@@ -1268,9 +1264,7 @@ EXPORT_SYMBOL(__release_region);
int release_mem_region_adjustable(struct resource *parent,
resource_size_t start, resource_size_t size)
{
- struct resource **p;
- struct resource *res;
- struct resource *new_res;
+ struct resource *res, *new_res;
resource_size_t end;
int ret = -EINVAL;
@@ -1281,16 +1275,16 @@ int release_mem_region_adjustable(struct resource *parent,
/* The alloc_resource() result gets checked later */
new_res = alloc_resource(GFP_KERNEL);
- p = &parent->child;
+ res = resource_first_child(&parent->child);
write_lock(&resource_lock);
- while ((res = *p)) {
+ while ((res)) {
if (res->start >= end)
break;
/* look for the next resource if it does not fit into */
if (res->start > start || res->end < end) {
- p = &res->sibling;
+ res = resource_sibling(res);
continue;
}
@@ -1298,14 +1292,14 @@ int release_mem_region_adjustable(struct resource *parent,
break;
if (!(res->flags & IORESOURCE_BUSY)) {
- p = &res->child;
+ res = resource_first_child(&res->child);
continue;
}
/* found the target resource; let's adjust accordingly */
if (res->start == start && res->end == end) {
/* free the whole entry */
- *p = res->sibling;
+ list_del(&res->sibling);
free_resource(res);
ret = 0;
} else if (res->start == start && res->end != end) {
@@ -1328,14 +1322,13 @@ int release_mem_region_adjustable(struct resource *parent,
new_res->flags = res->flags;
new_res->desc = res->desc;
new_res->parent = res->parent;
- new_res->sibling = res->sibling;
- new_res->child = NULL;
+ INIT_LIST_HEAD(&new_res->child);
ret = __adjust_resource(res, res->start,
start - res->start);
if (ret)
break;
- res->sibling = new_res;
+ list_add(&new_res->sibling, &res->sibling);
new_res = NULL;
}
@@ -1516,7 +1509,7 @@ static int __init reserve_setup(char *str)
res->end = io_start + io_num - 1;
res->flags |= IORESOURCE_BUSY;
res->desc = IORES_DESC_NONE;
- res->child = NULL;
+ INIT_LIST_HEAD(&res->child);
if (request_resource(parent, res) == 0)
reserved = x+1;
}
@@ -1536,7 +1529,7 @@ int iomem_map_sanity_check(resource_size_t addr, unsigned long size)
loff_t l;
read_lock(&resource_lock);
- for (p = p->child; p ; p = r_next(NULL, p, &l)) {
+ for (p = resource_first_child(&p->child); p; p = r_next(NULL, p, &l)) {
/*
* We can probably skip the resources without
* IORESOURCE_IO attribute?
@@ -1592,7 +1585,7 @@ bool iomem_is_exclusive(u64 addr)
addr = addr & PAGE_MASK;
read_lock(&resource_lock);
- for (p = p->child; p ; p = r_next(NULL, p, &l)) {
+ for (p = resource_first_child(&p->child); p; p = r_next(NULL, p, &l)) {
/*
* We can probably skip the resources without
* IORESOURCE_IO attribute?
--
2.13.6
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply related [flat|nested] 42+ messages in thread
* [PATCH v4 1/3] resource: Use list_head to link sibling resource
@ 2018-05-07 6:32 ` Baoquan He
0 siblings, 0 replies; 42+ messages in thread
From: Baoquan He @ 2018-05-07 6:32 UTC (permalink / raw)
To: linux-kernel, akpm, robh+dt, dan.j.williams, nicolas.pitre, josh,
fengguang.wu, bp
Cc: patrik.r.jakobsson, airlied, kys, haiyangz, sthemmin,
dmitry.torokhov, frowand.list, keith.busch, jonathan.derrick,
lorenzo.pieralisi, bhelgaas, tglx, brijesh.singh, jglisse,
thomas.lendacky, gregkh, baiyaowei, richard.weiyang, devel,
linux-input, linux-nvdimm, devicetree, linux-pci, ebiederm,
vgoyal, dyoung, yinghai, kexec, monstr, davem, chris, jcmvbkbc,
gustavo, maarten.lankhorst, seanpaul, linux-parisc, Baoquan He
The struct resource uses singly linked list to link siblings, implemented
by pointer operation. Replace it with list_head for better code readability.
Based on this list_head replacement, it will be very easy to do reverse
iteration on iomem_resource's sibling list in later patch.
Besides, type of member variables of struct resource, sibling and child, are
changed from 'struct resource *' to 'struct list_head'. This brings two
pointers of size increase.
Suggested-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Baoquan He <bhe@redhat.com>
Cc: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
Cc: David Airlie <airlied@linux.ie>
Cc: "K. Y. Srinivasan" <kys@microsoft.com>
Cc: Haiyang Zhang <haiyangz@microsoft.com>
Cc: Stephen Hemminger <sthemmin@microsoft.com>
Cc: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Cc: Dan Williams <dan.j.williams@intel.com>
Cc: Rob Herring <robh+dt@kernel.org>
Cc: Frank Rowand <frowand.list@gmail.com>
Cc: Keith Busch <keith.busch@intel.com>
Cc: Jonathan Derrick <jonathan.derrick@intel.com>
Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Cc: Bjorn Helgaas <bhelgaas@google.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Brijesh Singh <brijesh.singh@amd.com>
Cc: "Jérôme Glisse" <jglisse@redhat.com>
Cc: Borislav Petkov <bp@suse.de>
Cc: Tom Lendacky <thomas.lendacky@amd.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Yaowei Bai <baiyaowei@cmss.chinamobile.com>
Cc: Wei Yang <richard.weiyang@gmail.com>
Cc: devel@linuxdriverproject.org
Cc: linux-input@vger.kernel.org
Cc: linux-nvdimm@lists.01.org
Cc: devicetree@vger.kernel.org
Cc: linux-pci@vger.kernel.org
---
v3->v4:
Fix several bugs test robot reported. And change patch log.
v2->v3:
Rename resource functions first_child() and sibling() to
resource_first_chils() and resource_sibling(). Dan suggested this.
Move resource_first_chils() and resource_sibling() to linux/ioport.h
and make them as inline function. Rob suggested this. Accordingly add
linux/list.h including in linux/ioport.h, please help review if this
bring efficiency degradation or code redundancy.
The change on struct resource {} bring two pointers of size increase,
mention this in git log to make it more specifically, Rob suggested
this.
arch/microblaze/pci/pci-common.c | 31 +++--
arch/sparc/kernel/ioport.c | 2 +-
arch/xtensa/include/asm/pci-bridge.h | 4 +-
drivers/eisa/eisa-bus.c | 2 +
drivers/gpu/drm/drm_memory.c | 3 +-
drivers/gpu/drm/gma500/gtt.c | 5 +-
drivers/hv/vmbus_drv.c | 52 ++++----
drivers/input/joystick/iforce/iforce-main.c | 4 +-
drivers/nvdimm/e820.c | 2 +-
drivers/nvdimm/namespace_devs.c | 6 +-
drivers/nvdimm/nd.h | 5 +-
drivers/of/address.c | 4 +-
drivers/parisc/lba_pci.c | 4 +-
drivers/pci/host/vmd.c | 8 +-
drivers/pci/probe.c | 2 +
drivers/pci/setup-bus.c | 2 +-
include/linux/ioport.h | 17 ++-
kernel/resource.c | 181 +++++++++++++---------------
18 files changed, 170 insertions(+), 164 deletions(-)
diff --git a/arch/microblaze/pci/pci-common.c b/arch/microblaze/pci/pci-common.c
index 161f9758c631..56d189cb4be4 100644
--- a/arch/microblaze/pci/pci-common.c
+++ b/arch/microblaze/pci/pci-common.c
@@ -533,7 +533,9 @@ void pci_process_bridge_OF_ranges(struct pci_controller *hose,
res->flags = range.flags;
res->start = range.cpu_addr;
res->end = range.cpu_addr + range.size - 1;
- res->parent = res->child = res->sibling = NULL;
+ res->parent = NULL;
+ INIT_LIST_HEAD(&res->child);
+ INIT_LIST_HEAD(&res->sibling);
}
}
@@ -625,28 +627,31 @@ EXPORT_SYMBOL(pcibios_add_device);
static int __init reparent_resources(struct resource *parent,
struct resource *res)
{
- struct resource *p, **pp;
- struct resource **firstpp = NULL;
+ struct resource *p, *first = NULL;
- for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) {
+ list_for_each_entry(p, &parent->child, sibling) {
if (p->end < res->start)
continue;
if (res->end < p->start)
break;
if (p->start < res->start || p->end > res->end)
return -1; /* not completely contained */
- if (firstpp == NULL)
- firstpp = pp;
+ if (first == NULL)
+ first = p;
}
- if (firstpp == NULL)
+ if (first == NULL)
return -1; /* didn't find any conflicting entries? */
res->parent = parent;
- res->child = *firstpp;
- res->sibling = *pp;
- *firstpp = res;
- *pp = NULL;
- for (p = res->child; p != NULL; p = p->sibling) {
- p->parent = res;
+ list_add(&res->sibling, &p->sibling.prev);
+ INIT_LIST_HEAD(&res->child);
+
+ /*
+ * From first to p's previous sibling, they all fall into
+ * res's region, change them as res's children.
+ */
+ list_cut_position(&res->child, first->sibling.prev, res->sibling.prev);
+ list_for_each_entry(p, &new->child, sibling) {
+ p->parent = new;
pr_debug("PCI: Reparented %s [%llx..%llx] under %s\n",
p->name,
(unsigned long long)p->start,
diff --git a/arch/sparc/kernel/ioport.c b/arch/sparc/kernel/ioport.c
index 3bcef9ce74df..4e91fbbbedcc 100644
--- a/arch/sparc/kernel/ioport.c
+++ b/arch/sparc/kernel/ioport.c
@@ -669,7 +669,7 @@ static int sparc_io_proc_show(struct seq_file *m, void *v)
struct resource *root = m->private, *r;
const char *nm;
- for (r = root->child; r != NULL; r = r->sibling) {
+ list_for_each_entry(r, &root->child, sibling) {
if ((nm = r->name) == NULL) nm = "???";
seq_printf(m, "%016llx-%016llx: %s\n",
(unsigned long long)r->start,
diff --git a/arch/xtensa/include/asm/pci-bridge.h b/arch/xtensa/include/asm/pci-bridge.h
index 0b68c76ec1e6..f487b06817df 100644
--- a/arch/xtensa/include/asm/pci-bridge.h
+++ b/arch/xtensa/include/asm/pci-bridge.h
@@ -71,8 +71,8 @@ static inline void pcibios_init_resource(struct resource *res,
res->flags = flags;
res->name = name;
res->parent = NULL;
- res->sibling = NULL;
- res->child = NULL;
+ INIT_LIST_HEAD(&res->child);
+ INIT_LIST_HEAD(&res->sibling);
}
diff --git a/drivers/eisa/eisa-bus.c b/drivers/eisa/eisa-bus.c
index 1e8062f6dbfc..dba78f75fd06 100644
--- a/drivers/eisa/eisa-bus.c
+++ b/drivers/eisa/eisa-bus.c
@@ -408,6 +408,8 @@ static struct resource eisa_root_res = {
.start = 0,
.end = 0xffffffff,
.flags = IORESOURCE_IO,
+ .sibling = LIST_HEAD_INIT(eisa_root_res.sibling),
+ .child = LIST_HEAD_INIT(eisa_root_res.child),
};
static int eisa_bus_count;
diff --git a/drivers/gpu/drm/drm_memory.c b/drivers/gpu/drm/drm_memory.c
index 3c54044214db..53e300a993dc 100644
--- a/drivers/gpu/drm/drm_memory.c
+++ b/drivers/gpu/drm/drm_memory.c
@@ -155,9 +155,8 @@ u64 drm_get_max_iomem(void)
struct resource *tmp;
resource_size_t max_iomem = 0;
- for (tmp = iomem_resource.child; tmp; tmp = tmp->sibling) {
+ list_for_each_entry(tmp, &iomem_resource.child, sibling)
max_iomem = max(max_iomem, tmp->end);
- }
return max_iomem;
}
diff --git a/drivers/gpu/drm/gma500/gtt.c b/drivers/gpu/drm/gma500/gtt.c
index 3949b0990916..addd3bc009af 100644
--- a/drivers/gpu/drm/gma500/gtt.c
+++ b/drivers/gpu/drm/gma500/gtt.c
@@ -565,7 +565,7 @@ int psb_gtt_init(struct drm_device *dev, int resume)
int psb_gtt_restore(struct drm_device *dev)
{
struct drm_psb_private *dev_priv = dev->dev_private;
- struct resource *r = dev_priv->gtt_mem->child;
+ struct resource *r;
struct gtt_range *range;
unsigned int restored = 0, total = 0, size = 0;
@@ -573,14 +573,13 @@ int psb_gtt_restore(struct drm_device *dev)
mutex_lock(&dev_priv->gtt_mutex);
psb_gtt_init(dev, 1);
- while (r != NULL) {
+ list_for_each_entry(r, &dev_priv->gtt_mem->child, sibling) {
range = container_of(r, struct gtt_range, resource);
if (range->pages) {
psb_gtt_insert(dev, range, 1);
size += range->resource.end - range->resource.start;
restored++;
}
- r = r->sibling;
total++;
}
mutex_unlock(&dev_priv->gtt_mutex);
diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c
index b10fe26c4891..d87ec5a1bc4c 100644
--- a/drivers/hv/vmbus_drv.c
+++ b/drivers/hv/vmbus_drv.c
@@ -1412,9 +1412,8 @@ static acpi_status vmbus_walk_resources(struct acpi_resource *res, void *ctx)
{
resource_size_t start = 0;
resource_size_t end = 0;
- struct resource *new_res;
+ struct resource *new_res, *tmp;
struct resource **old_res = &hyperv_mmio;
- struct resource **prev_res = NULL;
switch (res->type) {
@@ -1461,44 +1460,36 @@ static acpi_status vmbus_walk_resources(struct acpi_resource *res, void *ctx)
/*
* If two ranges are adjacent, merge them.
*/
- do {
- if (!*old_res) {
- *old_res = new_res;
- break;
- }
-
- if (((*old_res)->end + 1) == new_res->start) {
- (*old_res)->end = new_res->end;
+ if (!*old_res) {
+ *old_res = new_res;
+ return AE_OK;
+ }
+ tmp = *old_res;
+ list_for_each_entry_from(tmp, &tmp->parent->child, sibling) {
+ if ((tmp->end + 1) == new_res->start) {
+ tmp->end = new_res->end;
kfree(new_res);
break;
}
- if ((*old_res)->start == new_res->end + 1) {
- (*old_res)->start = new_res->start;
+ if (tmp->start == new_res->end + 1) {
+ tmp->start = new_res->start;
kfree(new_res);
break;
}
- if ((*old_res)->start > new_res->end) {
- new_res->sibling = *old_res;
- if (prev_res)
- (*prev_res)->sibling = new_res;
- *old_res = new_res;
+ if (tmp->start > new_res->end) {
+ list_add(&new_res->sibling, tmp->sibling.prev);
break;
}
-
- prev_res = old_res;
- old_res = &(*old_res)->sibling;
-
- } while (1);
+ }
return AE_OK;
}
static int vmbus_acpi_remove(struct acpi_device *device)
{
- struct resource *cur_res;
- struct resource *next_res;
+ struct resource *res;
if (hyperv_mmio) {
if (fb_mmio) {
@@ -1507,10 +1498,9 @@ static int vmbus_acpi_remove(struct acpi_device *device)
fb_mmio = NULL;
}
- for (cur_res = hyperv_mmio; cur_res; cur_res = next_res) {
- next_res = cur_res->sibling;
- kfree(cur_res);
- }
+ res = hyperv_mmio;
+ list_for_each_entry_from(res, &res->parent->child, sibling)
+ kfree(res);
}
return 0;
@@ -1596,7 +1586,8 @@ int vmbus_allocate_mmio(struct resource **new, struct hv_device *device_obj,
}
}
- for (iter = hyperv_mmio; iter; iter = iter->sibling) {
+ iter = hyperv_mmio;
+ list_for_each_entry_from(iter, &iter->parent->child, sibling) {
if ((iter->start >= max) || (iter->end <= min))
continue;
@@ -1639,7 +1630,8 @@ void vmbus_free_mmio(resource_size_t start, resource_size_t size)
struct resource *iter;
down(&hyperv_mmio_lock);
- for (iter = hyperv_mmio; iter; iter = iter->sibling) {
+ iter = hyperv_mmio;
+ list_for_each_entry_from(iter, &iter->parent->child, sibling) {
if ((iter->start >= start + size) || (iter->end <= start))
continue;
diff --git a/drivers/input/joystick/iforce/iforce-main.c b/drivers/input/joystick/iforce/iforce-main.c
index daeeb4c7e3b0..5c0be27b33ff 100644
--- a/drivers/input/joystick/iforce/iforce-main.c
+++ b/drivers/input/joystick/iforce/iforce-main.c
@@ -305,8 +305,8 @@ int iforce_init_device(struct iforce *iforce)
iforce->device_memory.end = 200;
iforce->device_memory.flags = IORESOURCE_MEM;
iforce->device_memory.parent = NULL;
- iforce->device_memory.child = NULL;
- iforce->device_memory.sibling = NULL;
+ INIT_LIST_HEAD(&iforce->device_memory.child);
+ INIT_LIST_HEAD(&iforce->device_memory.sibling);
/*
* Wait until device ready - until it sends its first response.
diff --git a/drivers/nvdimm/e820.c b/drivers/nvdimm/e820.c
index 6f9a6ffd7cde..513e661bb0d8 100644
--- a/drivers/nvdimm/e820.c
+++ b/drivers/nvdimm/e820.c
@@ -53,7 +53,7 @@ static int e820_pmem_probe(struct platform_device *pdev)
goto err;
platform_set_drvdata(pdev, nvdimm_bus);
- for (p = iomem_resource.child; p ; p = p->sibling) {
+ list_for_each_entry(p, &iomem_resource.child, sibling) {
struct nd_region_desc ndr_desc;
if (p->desc != IORES_DESC_PERSISTENT_MEMORY_LEGACY)
diff --git a/drivers/nvdimm/namespace_devs.c b/drivers/nvdimm/namespace_devs.c
index 28afdd668905..f53d410d9981 100644
--- a/drivers/nvdimm/namespace_devs.c
+++ b/drivers/nvdimm/namespace_devs.c
@@ -637,7 +637,7 @@ static resource_size_t scan_allocate(struct nd_region *nd_region,
retry:
first = 0;
for_each_dpa_resource(ndd, res) {
- struct resource *next = res->sibling, *new_res = NULL;
+ struct resource *next = resource_sibling(res), *new_res = NULL;
resource_size_t allocate, available = 0;
enum alloc_loc loc = ALLOC_ERR;
const char *action;
@@ -763,7 +763,7 @@ static resource_size_t scan_allocate(struct nd_region *nd_region,
* an initial "pmem-reserve pass". Only do an initial BLK allocation
* when none of the DPA space is reserved.
*/
- if ((is_pmem || !ndd->dpa.child) && n == to_allocate)
+ if ((is_pmem || list_empty(&ndd->dpa.child)) && n == to_allocate)
return init_dpa_allocation(label_id, nd_region, nd_mapping, n);
return n;
}
@@ -779,7 +779,7 @@ static int merge_dpa(struct nd_region *nd_region,
retry:
for_each_dpa_resource(ndd, res) {
int rc;
- struct resource *next = res->sibling;
+ struct resource *next = resource_sibling(res);
resource_size_t end = res->start + resource_size(res);
if (!next || strcmp(res->name, label_id->id) != 0
diff --git a/drivers/nvdimm/nd.h b/drivers/nvdimm/nd.h
index 32e0364b48b9..da7da15e03e7 100644
--- a/drivers/nvdimm/nd.h
+++ b/drivers/nvdimm/nd.h
@@ -102,11 +102,10 @@ unsigned sizeof_namespace_label(struct nvdimm_drvdata *ndd);
(unsigned long long) (res ? res->start : 0), ##arg)
#define for_each_dpa_resource(ndd, res) \
- for (res = (ndd)->dpa.child; res; res = res->sibling)
+ list_for_each_entry(res, &(ndd)->dpa.child, sibling)
#define for_each_dpa_resource_safe(ndd, res, next) \
- for (res = (ndd)->dpa.child, next = res ? res->sibling : NULL; \
- res; res = next, next = next ? next->sibling : NULL)
+ list_for_each_entry_safe(res, next, &(ndd)->dpa.child, sibling)
struct nd_percpu_lane {
int count;
diff --git a/drivers/of/address.c b/drivers/of/address.c
index 53349912ac75..e2e25719ab52 100644
--- a/drivers/of/address.c
+++ b/drivers/of/address.c
@@ -330,7 +330,9 @@ int of_pci_range_to_resource(struct of_pci_range *range,
{
int err;
res->flags = range->flags;
- res->parent = res->child = res->sibling = NULL;
+ res->parent = NULL;
+ INIT_LIST_HEAD(&res->child);
+ INIT_LIST_HEAD(&res->sibling);
res->name = np->full_name;
if (res->flags & IORESOURCE_IO) {
diff --git a/drivers/parisc/lba_pci.c b/drivers/parisc/lba_pci.c
index 69bd98421eb1..7482bdfd1959 100644
--- a/drivers/parisc/lba_pci.c
+++ b/drivers/parisc/lba_pci.c
@@ -170,8 +170,8 @@ lba_dump_res(struct resource *r, int d)
for (i = d; i ; --i) printk(" ");
printk(KERN_DEBUG "%p [%lx,%lx]/%lx\n", r,
(long)r->start, (long)r->end, r->flags);
- lba_dump_res(r->child, d+2);
- lba_dump_res(r->sibling, d);
+ lba_dump_res(resource_first_child(&r->child), d+2);
+ lba_dump_res(resource_sibling(r), d);
}
diff --git a/drivers/pci/host/vmd.c b/drivers/pci/host/vmd.c
index 930a8fa08bd6..c3000af903ea 100644
--- a/drivers/pci/host/vmd.c
+++ b/drivers/pci/host/vmd.c
@@ -520,14 +520,14 @@ static struct pci_ops vmd_ops = {
static void vmd_attach_resources(struct vmd_dev *vmd)
{
- vmd->dev->resource[VMD_MEMBAR1].child = &vmd->resources[1];
- vmd->dev->resource[VMD_MEMBAR2].child = &vmd->resources[2];
+ list_add(&vmd->resources[1].sibling, &vmd->dev->resource[VMD_MEMBAR1].child);
+ list_add(&vmd->resources[2].sibling, &vmd->dev->resource[VMD_MEMBAR2].child);
}
static void vmd_detach_resources(struct vmd_dev *vmd)
{
- vmd->dev->resource[VMD_MEMBAR1].child = NULL;
- vmd->dev->resource[VMD_MEMBAR2].child = NULL;
+ INIT_LIST_HEAD(&vmd->dev->resource[VMD_MEMBAR1].child);
+ INIT_LIST_HEAD(&vmd->dev->resource[VMD_MEMBAR2].child);
}
/*
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index ac91b6fd0bcd..d162c77bec29 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -59,6 +59,8 @@ static struct resource *get_pci_domain_busn_res(int domain_nr)
r->res.start = 0;
r->res.end = 0xff;
r->res.flags = IORESOURCE_BUS | IORESOURCE_PCI_FIXED;
+ INIT_LIST_HEAD(&r->res.child);
+ INIT_LIST_HEAD(&r->res.sibling);
list_add_tail(&r->list, &pci_domain_busn_res_list);
diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c
index 072784f55ea5..0d5e30004ca6 100644
--- a/drivers/pci/setup-bus.c
+++ b/drivers/pci/setup-bus.c
@@ -2107,7 +2107,7 @@ int pci_reassign_bridge_resources(struct pci_dev *bridge, unsigned long type)
continue;
/* Ignore BARs which are still in use */
- if (res->child)
+ if (!list_empty(&res->child))
continue;
ret = add_to_list(&saved, bridge, res, 0, 0);
diff --git a/include/linux/ioport.h b/include/linux/ioport.h
index da0ebaec25f0..225d13d3500a 100644
--- a/include/linux/ioport.h
+++ b/include/linux/ioport.h
@@ -12,6 +12,7 @@
#ifndef __ASSEMBLY__
#include <linux/compiler.h>
#include <linux/types.h>
+#include <linux/list.h>
/*
* Resources are tree-like, allowing
* nesting etc..
@@ -22,7 +23,8 @@ struct resource {
const char *name;
unsigned long flags;
unsigned long desc;
- struct resource *parent, *sibling, *child;
+ struct list_head child, sibling;
+ struct resource *parent;
};
/*
@@ -215,7 +217,6 @@ static inline bool resource_contains(struct resource *r1, struct resource *r2)
return r1->start <= r2->start && r1->end >= r2->end;
}
-
/* Convenience shorthand with allocation */
#define request_region(start,n,name) __request_region(&ioport_resource, (start), (n), (name), 0)
#define request_muxed_region(start,n,name) __request_region(&ioport_resource, (start), (n), (name), IORESOURCE_MUXED)
@@ -286,6 +287,18 @@ static inline bool resource_overlaps(struct resource *r1, struct resource *r2)
return (r1->start <= r2->end && r1->end >= r2->start);
}
+static inline struct resource *resource_sibling(struct resource *res)
+{
+ if (res->parent && !list_is_last(&res->sibling, &res->parent->child))
+ return list_next_entry(res, sibling);
+ return NULL;
+}
+
+static inline struct resource *resource_first_child(struct list_head *head)
+{
+ return list_first_entry_or_null(head, struct resource, sibling);
+}
+
#endif /* __ASSEMBLY__ */
#endif /* _LINUX_IOPORT_H */
diff --git a/kernel/resource.c b/kernel/resource.c
index 2af6c03858b9..4f560991c130 100644
--- a/kernel/resource.c
+++ b/kernel/resource.c
@@ -31,6 +31,8 @@ struct resource ioport_resource = {
.start = 0,
.end = IO_SPACE_LIMIT,
.flags = IORESOURCE_IO,
+ .sibling = LIST_HEAD_INIT(ioport_resource.sibling),
+ .child = LIST_HEAD_INIT(ioport_resource.child),
};
EXPORT_SYMBOL(ioport_resource);
@@ -39,6 +41,8 @@ struct resource iomem_resource = {
.start = 0,
.end = -1,
.flags = IORESOURCE_MEM,
+ .sibling = LIST_HEAD_INIT(iomem_resource.sibling),
+ .child = LIST_HEAD_INIT(iomem_resource.child),
};
EXPORT_SYMBOL(iomem_resource);
@@ -57,20 +61,20 @@ static DEFINE_RWLOCK(resource_lock);
* by boot mem after the system is up. So for reusing the resource entry
* we need to remember the resource.
*/
-static struct resource *bootmem_resource_free;
+static struct list_head bootmem_resource_free = LIST_HEAD_INIT(bootmem_resource_free);
static DEFINE_SPINLOCK(bootmem_resource_lock);
static struct resource *next_resource(struct resource *p, bool sibling_only)
{
/* Caller wants to traverse through siblings only */
if (sibling_only)
- return p->sibling;
+ return resource_sibling(p);
- if (p->child)
- return p->child;
- while (!p->sibling && p->parent)
+ if (!list_empty(&p->child))
+ return resource_first_child(&p->child);
+ while (!resource_sibling(p) && p->parent)
p = p->parent;
- return p->sibling;
+ return resource_sibling(p);
}
static void *r_next(struct seq_file *m, void *v, loff_t *pos)
@@ -90,7 +94,7 @@ static void *r_start(struct seq_file *m, loff_t *pos)
struct resource *p = m->private;
loff_t l = 0;
read_lock(&resource_lock);
- for (p = p->child; p && l < *pos; p = r_next(m, p, &l))
+ for (p = resource_first_child(&p->child); p && l < *pos; p = r_next(m, p, &l))
;
return p;
}
@@ -186,8 +190,7 @@ static void free_resource(struct resource *res)
if (!PageSlab(virt_to_head_page(res))) {
spin_lock(&bootmem_resource_lock);
- res->sibling = bootmem_resource_free;
- bootmem_resource_free = res;
+ list_add(&res->sibling, &bootmem_resource_free);
spin_unlock(&bootmem_resource_lock);
} else {
kfree(res);
@@ -199,10 +202,9 @@ static struct resource *alloc_resource(gfp_t flags)
struct resource *res = NULL;
spin_lock(&bootmem_resource_lock);
- if (bootmem_resource_free) {
- res = bootmem_resource_free;
- bootmem_resource_free = res->sibling;
- }
+ res = resource_first_child(&bootmem_resource_free);
+ if (res)
+ list_del(&res->sibling);
spin_unlock(&bootmem_resource_lock);
if (res)
@@ -210,6 +212,8 @@ static struct resource *alloc_resource(gfp_t flags)
else
res = kzalloc(sizeof(struct resource), flags);
+ INIT_LIST_HEAD(&res->child);
+ INIT_LIST_HEAD(&res->sibling);
return res;
}
@@ -218,7 +222,7 @@ static struct resource * __request_resource(struct resource *root, struct resour
{
resource_size_t start = new->start;
resource_size_t end = new->end;
- struct resource *tmp, **p;
+ struct resource *tmp;
if (end < start)
return root;
@@ -226,64 +230,62 @@ static struct resource * __request_resource(struct resource *root, struct resour
return root;
if (end > root->end)
return root;
- p = &root->child;
- for (;;) {
- tmp = *p;
- if (!tmp || tmp->start > end) {
- new->sibling = tmp;
- *p = new;
+
+ if (list_empty(&root->child)) {
+ list_add(&new->sibling, &root->child);
+ new->parent = root;
+ INIT_LIST_HEAD(&new->child);
+ return NULL;
+ }
+
+ list_for_each_entry(tmp, &root->child, sibling) {
+ if (tmp->start > end) {
+ list_add(&new->sibling, tmp->sibling.prev);
new->parent = root;
+ INIT_LIST_HEAD(&new->child);
return NULL;
}
- p = &tmp->sibling;
if (tmp->end < start)
continue;
return tmp;
}
+
+ list_add_tail(&new->sibling, &root->child);
+ new->parent = root;
+ INIT_LIST_HEAD(&new->child);
+ return NULL;
}
static int __release_resource(struct resource *old, bool release_child)
{
- struct resource *tmp, **p, *chd;
+ struct resource *tmp, *next, *chd;
- p = &old->parent->child;
- for (;;) {
- tmp = *p;
- if (!tmp)
- break;
+ list_for_each_entry_safe(tmp, next, &old->parent->child, sibling) {
if (tmp == old) {
- if (release_child || !(tmp->child)) {
- *p = tmp->sibling;
+ if (release_child || list_empty(&tmp->child)) {
+ list_del(&tmp->sibling);
} else {
- for (chd = tmp->child;; chd = chd->sibling) {
+ list_for_each_entry(chd, &tmp->child, sibling)
chd->parent = tmp->parent;
- if (!(chd->sibling))
- break;
- }
- *p = tmp->child;
- chd->sibling = tmp->sibling;
+ list_splice(&tmp->child, tmp->sibling.prev);
+ list_del(&tmp->sibling);
}
+
old->parent = NULL;
return 0;
}
- p = &tmp->sibling;
}
return -EINVAL;
}
static void __release_child_resources(struct resource *r)
{
- struct resource *tmp, *p;
+ struct resource *tmp, *next;
resource_size_t size;
- p = r->child;
- r->child = NULL;
- while (p) {
- tmp = p;
- p = p->sibling;
-
+ list_for_each_entry_safe(tmp, next, &r->child, sibling) {
tmp->parent = NULL;
- tmp->sibling = NULL;
+ INIT_LIST_HEAD(&tmp->sibling);
__release_child_resources(tmp);
printk(KERN_DEBUG "release child resource %pR\n", tmp);
@@ -292,6 +294,8 @@ static void __release_child_resources(struct resource *r)
tmp->start = 0;
tmp->end = size - 1;
}
+
+ INIT_LIST_HEAD(&tmp->child);
}
void release_child_resources(struct resource *r)
@@ -376,7 +380,8 @@ static int find_next_iomem_res(struct resource *res, unsigned long desc,
read_lock(&resource_lock);
- for (p = iomem_resource.child; p; p = next_resource(p, sibling_only)) {
+ for (p = resource_first_child(&iomem_resource.child); p;
+ p = next_resource(p, sibling_only)) {
if ((p->flags & res->flags) != res->flags)
continue;
if ((desc != IORES_DESC_NONE) && (desc != p->desc))
@@ -564,7 +569,7 @@ int region_intersects(resource_size_t start, size_t size, unsigned long flags,
struct resource *p;
read_lock(&resource_lock);
- for (p = iomem_resource.child; p ; p = p->sibling) {
+ list_for_each_entry(p, &iomem_resource.child, sibling) {
bool is_type = (((p->flags & flags) == flags) &&
((desc == IORES_DESC_NONE) ||
(desc == p->desc)));
@@ -618,7 +623,7 @@ static int __find_resource(struct resource *root, struct resource *old,
resource_size_t size,
struct resource_constraint *constraint)
{
- struct resource *this = root->child;
+ struct resource *this = resource_first_child(&root->child);
struct resource tmp = *new, avail, alloc;
tmp.start = root->start;
@@ -628,7 +633,7 @@ static int __find_resource(struct resource *root, struct resource *old,
*/
if (this && this->start == root->start) {
tmp.start = (this == old) ? old->start : this->end + 1;
- this = this->sibling;
+ this = resource_sibling(this);
}
for(;;) {
if (this)
@@ -664,7 +669,7 @@ next: if (!this || this->end == root->end)
if (this != old)
tmp.start = this->end + 1;
- this = this->sibling;
+ this = resource_sibling(this);
}
return -EBUSY;
}
@@ -708,7 +713,7 @@ static int reallocate_resource(struct resource *root, struct resource *old,
goto out;
}
- if (old->child) {
+ if (!list_empty(&old->child)) {
err = -EBUSY;
goto out;
}
@@ -789,7 +794,7 @@ struct resource *lookup_resource(struct resource *root, resource_size_t start)
struct resource *res;
read_lock(&resource_lock);
- for (res = root->child; res; res = res->sibling) {
+ list_for_each_entry(res, &root->child, sibling) {
if (res->start == start)
break;
}
@@ -822,32 +827,27 @@ static struct resource * __insert_resource(struct resource *parent, struct resou
break;
}
- for (next = first; ; next = next->sibling) {
+ for (next = first; ; next = resource_sibling(next)) {
/* Partial overlap? Bad, and unfixable */
if (next->start < new->start || next->end > new->end)
return next;
- if (!next->sibling)
+ if (!resource_sibling(next))
break;
- if (next->sibling->start > new->end)
+ if (resource_sibling(next)->start > new->end)
break;
}
-
new->parent = parent;
- new->sibling = next->sibling;
- new->child = first;
+ list_add(&new->sibling, &next->sibling);
+ INIT_LIST_HEAD(&new->child);
- next->sibling = NULL;
- for (next = first; next; next = next->sibling)
+ /*
+ * From first to next, they all fall into new's region, so change them
+ * as new's children.
+ */
+ list_cut_position(&new->child, first->sibling.prev, &next->sibling);
+ list_for_each_entry(next, &new->child, sibling)
next->parent = new;
- if (parent->child == first) {
- parent->child = new;
- } else {
- next = parent->child;
- while (next->sibling != first)
- next = next->sibling;
- next->sibling = new;
- }
return NULL;
}
@@ -969,19 +969,17 @@ static int __adjust_resource(struct resource *res, resource_size_t start,
if ((start < parent->start) || (end > parent->end))
goto out;
- if (res->sibling && (res->sibling->start <= end))
+ if (resource_sibling(res) && (resource_sibling(res)->start <= end))
goto out;
- tmp = parent->child;
- if (tmp != res) {
- while (tmp->sibling != res)
- tmp = tmp->sibling;
+ if (res->sibling.prev != &parent->child) {
+ tmp = list_prev_entry(res, sibling);
if (start <= tmp->end)
goto out;
}
skip:
- for (tmp = res->child; tmp; tmp = tmp->sibling)
+ list_for_each_entry(tmp, &res->child, sibling)
if ((tmp->start < start) || (tmp->end > end))
goto out;
@@ -1206,34 +1204,32 @@ EXPORT_SYMBOL(__request_region);
void __release_region(struct resource *parent, resource_size_t start,
resource_size_t n)
{
- struct resource **p;
+ struct resource *res;
resource_size_t end;
- p = &parent->child;
+ res = resource_first_child(&parent->child);
end = start + n - 1;
write_lock(&resource_lock);
for (;;) {
- struct resource *res = *p;
-
if (!res)
break;
if (res->start <= start && res->end >= end) {
if (!(res->flags & IORESOURCE_BUSY)) {
- p = &res->child;
+ res = resource_first_child(&res->child);
continue;
}
if (res->start != start || res->end != end)
break;
- *p = res->sibling;
+ list_del(&res->sibling);
write_unlock(&resource_lock);
if (res->flags & IORESOURCE_MUXED)
wake_up(&muxed_resource_wait);
free_resource(res);
return;
}
- p = &res->sibling;
+ res = resource_sibling(res);
}
write_unlock(&resource_lock);
@@ -1268,9 +1264,7 @@ EXPORT_SYMBOL(__release_region);
int release_mem_region_adjustable(struct resource *parent,
resource_size_t start, resource_size_t size)
{
- struct resource **p;
- struct resource *res;
- struct resource *new_res;
+ struct resource *res, *new_res;
resource_size_t end;
int ret = -EINVAL;
@@ -1281,16 +1275,16 @@ int release_mem_region_adjustable(struct resource *parent,
/* The alloc_resource() result gets checked later */
new_res = alloc_resource(GFP_KERNEL);
- p = &parent->child;
+ res = resource_first_child(&parent->child);
write_lock(&resource_lock);
- while ((res = *p)) {
+ while ((res)) {
if (res->start >= end)
break;
/* look for the next resource if it does not fit into */
if (res->start > start || res->end < end) {
- p = &res->sibling;
+ res = resource_sibling(res);
continue;
}
@@ -1298,14 +1292,14 @@ int release_mem_region_adjustable(struct resource *parent,
break;
if (!(res->flags & IORESOURCE_BUSY)) {
- p = &res->child;
+ res = resource_first_child(&res->child);
continue;
}
/* found the target resource; let's adjust accordingly */
if (res->start == start && res->end == end) {
/* free the whole entry */
- *p = res->sibling;
+ list_del(&res->sibling);
free_resource(res);
ret = 0;
} else if (res->start == start && res->end != end) {
@@ -1328,14 +1322,13 @@ int release_mem_region_adjustable(struct resource *parent,
new_res->flags = res->flags;
new_res->desc = res->desc;
new_res->parent = res->parent;
- new_res->sibling = res->sibling;
- new_res->child = NULL;
+ INIT_LIST_HEAD(&new_res->child);
ret = __adjust_resource(res, res->start,
start - res->start);
if (ret)
break;
- res->sibling = new_res;
+ list_add(&new_res->sibling, &res->sibling);
new_res = NULL;
}
@@ -1516,7 +1509,7 @@ static int __init reserve_setup(char *str)
res->end = io_start + io_num - 1;
res->flags |= IORESOURCE_BUSY;
res->desc = IORES_DESC_NONE;
- res->child = NULL;
+ INIT_LIST_HEAD(&res->child);
if (request_resource(parent, res) == 0)
reserved = x+1;
}
@@ -1536,7 +1529,7 @@ int iomem_map_sanity_check(resource_size_t addr, unsigned long size)
loff_t l;
read_lock(&resource_lock);
- for (p = p->child; p ; p = r_next(NULL, p, &l)) {
+ for (p = resource_first_child(&p->child); p; p = r_next(NULL, p, &l)) {
/*
* We can probably skip the resources without
* IORESOURCE_IO attribute?
@@ -1592,7 +1585,7 @@ bool iomem_is_exclusive(u64 addr)
addr = addr & PAGE_MASK;
read_lock(&resource_lock);
- for (p = p->child; p ; p = r_next(NULL, p, &l)) {
+ for (p = resource_first_child(&p->child); p; p = r_next(NULL, p, &l)) {
/*
* We can probably skip the resources without
* IORESOURCE_IO attribute?
--
2.13.6
^ permalink raw reply related [flat|nested] 42+ messages in thread
* [PATCH v4 1/3] resource: Use list_head to link sibling resource
@ 2018-05-07 6:32 ` Baoquan He
0 siblings, 0 replies; 42+ messages in thread
From: Baoquan He @ 2018-05-07 6:32 UTC (permalink / raw)
To: linux-kernel-u79uwXL29TY76Z2rM5mHXA,
akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b,
robh+dt-DgEjT+Ai2ygdnm+yROfE0A,
dan.j.williams-ral2JQCrhuEAvxtiuMwx3w,
nicolas.pitre-QSEj5FYQhm4dnm+yROfE0A,
josh-iaAMLnmF4UmaiuxdJuQwMA, fengguang.wu-ral2JQCrhuEAvxtiuMwx3w,
bp-l3A5Bk7waGM
Cc: brijesh.singh-5C7GfCeVMHo, devicetree-u79uwXL29TY76Z2rM5mHXA,
airlied-cv59FeDIM0c, linux-pci-u79uwXL29TY76Z2rM5mHXA,
richard.weiyang-Re5JQEeQqe8AvxtiuMwx3w,
keith.busch-ral2JQCrhuEAvxtiuMwx3w,
jcmvbkbc-Re5JQEeQqe8AvxtiuMwx3w,
baiyaowei-0p4V/sDNsUmm0O/7XYngnFaTQe2KTcn/,
kys-0li6OtcxBFHby3iVrkZq2A, frowand.list-Re5JQEeQqe8AvxtiuMwx3w,
lorenzo.pieralisi-5wv7dgnIgG8, sthemmin-0li6OtcxBFHby3iVrkZq2A,
Baoquan He, linux-nvdimm-hn68Rpc1hR1g9hUCZPvPmw,
patrik.r.jakobsson-Re5JQEeQqe8AvxtiuMwx3w,
linux-input-u79uwXL29TY76Z2rM5mHXA,
gustavo-THi1TnShQwVAfugRpC6u6w, dyoung-H+wXaHxf7aLQT0dZR+AlfA,
thomas.lendacky-5C7GfCeVMHo, haiyangz-0li6OtcxBFHby3iVrkZq2A,
maarten.lankhorst-VuQAYsv1563Yd54FQh9/CA,
jglisse-H+wXaHxf7aLQT0dZR+AlfA, seanpaul-F7+t8E8rja9g9hUCZPvPmw,
bhelgaas-hpIqsD4AKlfQT0dZR+AlfA, tglx-hfZtesqFncYOwBW4kG4KsQ,
yinghai-DgEjT+Ai2ygdnm+yROfE0A,
jonathan.derrick-ral2JQCrhuEAvxtiuMwx3w,
chris-YvXeqwSYzG2sTnJN9+BGXg, monstr-pSz03upnqPeHXe+LvDLADg,
linux-parisc-u79uwXL29TY76Z2rM5mHXA,
gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r,
dmitry.torokhov-Re5JQEeQqe8AvxtiuMwx3w,
kexec-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
ebiederm-aS9lmoZGLiVWk0Htik3J/w,
devel-tBiZLqfeLfOHmIFyCCdPziST3g8Odh+X,
davem-fT/PcQaiUtIeIZ0/mPfg9Q
The struct resource uses singly linked list to link siblings, implemented
by pointer operation. Replace it with list_head for better code readability.
Based on this list_head replacement, it will be very easy to do reverse
iteration on iomem_resource's sibling list in later patch.
Besides, type of member variables of struct resource, sibling and child, are
changed from 'struct resource *' to 'struct list_head'. This brings two
pointers of size increase.
Suggested-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Baoquan He <bhe@redhat.com>
Cc: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
Cc: David Airlie <airlied@linux.ie>
Cc: "K. Y. Srinivasan" <kys@microsoft.com>
Cc: Haiyang Zhang <haiyangz@microsoft.com>
Cc: Stephen Hemminger <sthemmin@microsoft.com>
Cc: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Cc: Dan Williams <dan.j.williams@intel.com>
Cc: Rob Herring <robh+dt@kernel.org>
Cc: Frank Rowand <frowand.list@gmail.com>
Cc: Keith Busch <keith.busch@intel.com>
Cc: Jonathan Derrick <jonathan.derrick@intel.com>
Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Cc: Bjorn Helgaas <bhelgaas@google.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Brijesh Singh <brijesh.singh@amd.com>
Cc: "Jérôme Glisse" <jglisse@redhat.com>
Cc: Borislav Petkov <bp@suse.de>
Cc: Tom Lendacky <thomas.lendacky@amd.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Yaowei Bai <baiyaowei@cmss.chinamobile.com>
Cc: Wei Yang <richard.weiyang@gmail.com>
Cc: devel@linuxdriverproject.org
Cc: linux-input@vger.kernel.org
Cc: linux-nvdimm@lists.01.org
Cc: devicetree@vger.kernel.org
Cc: linux-pci@vger.kernel.org
---
v3->v4:
Fix several bugs test robot reported. And change patch log.
v2->v3:
Rename resource functions first_child() and sibling() to
resource_first_chils() and resource_sibling(). Dan suggested this.
Move resource_first_chils() and resource_sibling() to linux/ioport.h
and make them as inline function. Rob suggested this. Accordingly add
linux/list.h including in linux/ioport.h, please help review if this
bring efficiency degradation or code redundancy.
The change on struct resource {} bring two pointers of size increase,
mention this in git log to make it more specifically, Rob suggested
this.
arch/microblaze/pci/pci-common.c | 31 +++--
arch/sparc/kernel/ioport.c | 2 +-
arch/xtensa/include/asm/pci-bridge.h | 4 +-
drivers/eisa/eisa-bus.c | 2 +
drivers/gpu/drm/drm_memory.c | 3 +-
drivers/gpu/drm/gma500/gtt.c | 5 +-
drivers/hv/vmbus_drv.c | 52 ++++----
drivers/input/joystick/iforce/iforce-main.c | 4 +-
drivers/nvdimm/e820.c | 2 +-
drivers/nvdimm/namespace_devs.c | 6 +-
drivers/nvdimm/nd.h | 5 +-
drivers/of/address.c | 4 +-
drivers/parisc/lba_pci.c | 4 +-
drivers/pci/host/vmd.c | 8 +-
drivers/pci/probe.c | 2 +
drivers/pci/setup-bus.c | 2 +-
include/linux/ioport.h | 17 ++-
kernel/resource.c | 181 +++++++++++++---------------
18 files changed, 170 insertions(+), 164 deletions(-)
diff --git a/arch/microblaze/pci/pci-common.c b/arch/microblaze/pci/pci-common.c
index 161f9758c631..56d189cb4be4 100644
--- a/arch/microblaze/pci/pci-common.c
+++ b/arch/microblaze/pci/pci-common.c
@@ -533,7 +533,9 @@ void pci_process_bridge_OF_ranges(struct pci_controller *hose,
res->flags = range.flags;
res->start = range.cpu_addr;
res->end = range.cpu_addr + range.size - 1;
- res->parent = res->child = res->sibling = NULL;
+ res->parent = NULL;
+ INIT_LIST_HEAD(&res->child);
+ INIT_LIST_HEAD(&res->sibling);
}
}
@@ -625,28 +627,31 @@ EXPORT_SYMBOL(pcibios_add_device);
static int __init reparent_resources(struct resource *parent,
struct resource *res)
{
- struct resource *p, **pp;
- struct resource **firstpp = NULL;
+ struct resource *p, *first = NULL;
- for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) {
+ list_for_each_entry(p, &parent->child, sibling) {
if (p->end < res->start)
continue;
if (res->end < p->start)
break;
if (p->start < res->start || p->end > res->end)
return -1; /* not completely contained */
- if (firstpp == NULL)
- firstpp = pp;
+ if (first == NULL)
+ first = p;
}
- if (firstpp == NULL)
+ if (first == NULL)
return -1; /* didn't find any conflicting entries? */
res->parent = parent;
- res->child = *firstpp;
- res->sibling = *pp;
- *firstpp = res;
- *pp = NULL;
- for (p = res->child; p != NULL; p = p->sibling) {
- p->parent = res;
+ list_add(&res->sibling, &p->sibling.prev);
+ INIT_LIST_HEAD(&res->child);
+
+ /*
+ * From first to p's previous sibling, they all fall into
+ * res's region, change them as res's children.
+ */
+ list_cut_position(&res->child, first->sibling.prev, res->sibling.prev);
+ list_for_each_entry(p, &new->child, sibling) {
+ p->parent = new;
pr_debug("PCI: Reparented %s [%llx..%llx] under %s\n",
p->name,
(unsigned long long)p->start,
diff --git a/arch/sparc/kernel/ioport.c b/arch/sparc/kernel/ioport.c
index 3bcef9ce74df..4e91fbbbedcc 100644
--- a/arch/sparc/kernel/ioport.c
+++ b/arch/sparc/kernel/ioport.c
@@ -669,7 +669,7 @@ static int sparc_io_proc_show(struct seq_file *m, void *v)
struct resource *root = m->private, *r;
const char *nm;
- for (r = root->child; r != NULL; r = r->sibling) {
+ list_for_each_entry(r, &root->child, sibling) {
if ((nm = r->name) == NULL) nm = "???";
seq_printf(m, "%016llx-%016llx: %s\n",
(unsigned long long)r->start,
diff --git a/arch/xtensa/include/asm/pci-bridge.h b/arch/xtensa/include/asm/pci-bridge.h
index 0b68c76ec1e6..f487b06817df 100644
--- a/arch/xtensa/include/asm/pci-bridge.h
+++ b/arch/xtensa/include/asm/pci-bridge.h
@@ -71,8 +71,8 @@ static inline void pcibios_init_resource(struct resource *res,
res->flags = flags;
res->name = name;
res->parent = NULL;
- res->sibling = NULL;
- res->child = NULL;
+ INIT_LIST_HEAD(&res->child);
+ INIT_LIST_HEAD(&res->sibling);
}
diff --git a/drivers/eisa/eisa-bus.c b/drivers/eisa/eisa-bus.c
index 1e8062f6dbfc..dba78f75fd06 100644
--- a/drivers/eisa/eisa-bus.c
+++ b/drivers/eisa/eisa-bus.c
@@ -408,6 +408,8 @@ static struct resource eisa_root_res = {
.start = 0,
.end = 0xffffffff,
.flags = IORESOURCE_IO,
+ .sibling = LIST_HEAD_INIT(eisa_root_res.sibling),
+ .child = LIST_HEAD_INIT(eisa_root_res.child),
};
static int eisa_bus_count;
diff --git a/drivers/gpu/drm/drm_memory.c b/drivers/gpu/drm/drm_memory.c
index 3c54044214db..53e300a993dc 100644
--- a/drivers/gpu/drm/drm_memory.c
+++ b/drivers/gpu/drm/drm_memory.c
@@ -155,9 +155,8 @@ u64 drm_get_max_iomem(void)
struct resource *tmp;
resource_size_t max_iomem = 0;
- for (tmp = iomem_resource.child; tmp; tmp = tmp->sibling) {
+ list_for_each_entry(tmp, &iomem_resource.child, sibling)
max_iomem = max(max_iomem, tmp->end);
- }
return max_iomem;
}
diff --git a/drivers/gpu/drm/gma500/gtt.c b/drivers/gpu/drm/gma500/gtt.c
index 3949b0990916..addd3bc009af 100644
--- a/drivers/gpu/drm/gma500/gtt.c
+++ b/drivers/gpu/drm/gma500/gtt.c
@@ -565,7 +565,7 @@ int psb_gtt_init(struct drm_device *dev, int resume)
int psb_gtt_restore(struct drm_device *dev)
{
struct drm_psb_private *dev_priv = dev->dev_private;
- struct resource *r = dev_priv->gtt_mem->child;
+ struct resource *r;
struct gtt_range *range;
unsigned int restored = 0, total = 0, size = 0;
@@ -573,14 +573,13 @@ int psb_gtt_restore(struct drm_device *dev)
mutex_lock(&dev_priv->gtt_mutex);
psb_gtt_init(dev, 1);
- while (r != NULL) {
+ list_for_each_entry(r, &dev_priv->gtt_mem->child, sibling) {
range = container_of(r, struct gtt_range, resource);
if (range->pages) {
psb_gtt_insert(dev, range, 1);
size += range->resource.end - range->resource.start;
restored++;
}
- r = r->sibling;
total++;
}
mutex_unlock(&dev_priv->gtt_mutex);
diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c
index b10fe26c4891..d87ec5a1bc4c 100644
--- a/drivers/hv/vmbus_drv.c
+++ b/drivers/hv/vmbus_drv.c
@@ -1412,9 +1412,8 @@ static acpi_status vmbus_walk_resources(struct acpi_resource *res, void *ctx)
{
resource_size_t start = 0;
resource_size_t end = 0;
- struct resource *new_res;
+ struct resource *new_res, *tmp;
struct resource **old_res = &hyperv_mmio;
- struct resource **prev_res = NULL;
switch (res->type) {
@@ -1461,44 +1460,36 @@ static acpi_status vmbus_walk_resources(struct acpi_resource *res, void *ctx)
/*
* If two ranges are adjacent, merge them.
*/
- do {
- if (!*old_res) {
- *old_res = new_res;
- break;
- }
-
- if (((*old_res)->end + 1) == new_res->start) {
- (*old_res)->end = new_res->end;
+ if (!*old_res) {
+ *old_res = new_res;
+ return AE_OK;
+ }
+ tmp = *old_res;
+ list_for_each_entry_from(tmp, &tmp->parent->child, sibling) {
+ if ((tmp->end + 1) == new_res->start) {
+ tmp->end = new_res->end;
kfree(new_res);
break;
}
- if ((*old_res)->start == new_res->end + 1) {
- (*old_res)->start = new_res->start;
+ if (tmp->start == new_res->end + 1) {
+ tmp->start = new_res->start;
kfree(new_res);
break;
}
- if ((*old_res)->start > new_res->end) {
- new_res->sibling = *old_res;
- if (prev_res)
- (*prev_res)->sibling = new_res;
- *old_res = new_res;
+ if (tmp->start > new_res->end) {
+ list_add(&new_res->sibling, tmp->sibling.prev);
break;
}
-
- prev_res = old_res;
- old_res = &(*old_res)->sibling;
-
- } while (1);
+ }
return AE_OK;
}
static int vmbus_acpi_remove(struct acpi_device *device)
{
- struct resource *cur_res;
- struct resource *next_res;
+ struct resource *res;
if (hyperv_mmio) {
if (fb_mmio) {
@@ -1507,10 +1498,9 @@ static int vmbus_acpi_remove(struct acpi_device *device)
fb_mmio = NULL;
}
- for (cur_res = hyperv_mmio; cur_res; cur_res = next_res) {
- next_res = cur_res->sibling;
- kfree(cur_res);
- }
+ res = hyperv_mmio;
+ list_for_each_entry_from(res, &res->parent->child, sibling)
+ kfree(res);
}
return 0;
@@ -1596,7 +1586,8 @@ int vmbus_allocate_mmio(struct resource **new, struct hv_device *device_obj,
}
}
- for (iter = hyperv_mmio; iter; iter = iter->sibling) {
+ iter = hyperv_mmio;
+ list_for_each_entry_from(iter, &iter->parent->child, sibling) {
if ((iter->start >= max) || (iter->end <= min))
continue;
@@ -1639,7 +1630,8 @@ void vmbus_free_mmio(resource_size_t start, resource_size_t size)
struct resource *iter;
down(&hyperv_mmio_lock);
- for (iter = hyperv_mmio; iter; iter = iter->sibling) {
+ iter = hyperv_mmio;
+ list_for_each_entry_from(iter, &iter->parent->child, sibling) {
if ((iter->start >= start + size) || (iter->end <= start))
continue;
diff --git a/drivers/input/joystick/iforce/iforce-main.c b/drivers/input/joystick/iforce/iforce-main.c
index daeeb4c7e3b0..5c0be27b33ff 100644
--- a/drivers/input/joystick/iforce/iforce-main.c
+++ b/drivers/input/joystick/iforce/iforce-main.c
@@ -305,8 +305,8 @@ int iforce_init_device(struct iforce *iforce)
iforce->device_memory.end = 200;
iforce->device_memory.flags = IORESOURCE_MEM;
iforce->device_memory.parent = NULL;
- iforce->device_memory.child = NULL;
- iforce->device_memory.sibling = NULL;
+ INIT_LIST_HEAD(&iforce->device_memory.child);
+ INIT_LIST_HEAD(&iforce->device_memory.sibling);
/*
* Wait until device ready - until it sends its first response.
diff --git a/drivers/nvdimm/e820.c b/drivers/nvdimm/e820.c
index 6f9a6ffd7cde..513e661bb0d8 100644
--- a/drivers/nvdimm/e820.c
+++ b/drivers/nvdimm/e820.c
@@ -53,7 +53,7 @@ static int e820_pmem_probe(struct platform_device *pdev)
goto err;
platform_set_drvdata(pdev, nvdimm_bus);
- for (p = iomem_resource.child; p ; p = p->sibling) {
+ list_for_each_entry(p, &iomem_resource.child, sibling) {
struct nd_region_desc ndr_desc;
if (p->desc != IORES_DESC_PERSISTENT_MEMORY_LEGACY)
diff --git a/drivers/nvdimm/namespace_devs.c b/drivers/nvdimm/namespace_devs.c
index 28afdd668905..f53d410d9981 100644
--- a/drivers/nvdimm/namespace_devs.c
+++ b/drivers/nvdimm/namespace_devs.c
@@ -637,7 +637,7 @@ static resource_size_t scan_allocate(struct nd_region *nd_region,
retry:
first = 0;
for_each_dpa_resource(ndd, res) {
- struct resource *next = res->sibling, *new_res = NULL;
+ struct resource *next = resource_sibling(res), *new_res = NULL;
resource_size_t allocate, available = 0;
enum alloc_loc loc = ALLOC_ERR;
const char *action;
@@ -763,7 +763,7 @@ static resource_size_t scan_allocate(struct nd_region *nd_region,
* an initial "pmem-reserve pass". Only do an initial BLK allocation
* when none of the DPA space is reserved.
*/
- if ((is_pmem || !ndd->dpa.child) && n == to_allocate)
+ if ((is_pmem || list_empty(&ndd->dpa.child)) && n == to_allocate)
return init_dpa_allocation(label_id, nd_region, nd_mapping, n);
return n;
}
@@ -779,7 +779,7 @@ static int merge_dpa(struct nd_region *nd_region,
retry:
for_each_dpa_resource(ndd, res) {
int rc;
- struct resource *next = res->sibling;
+ struct resource *next = resource_sibling(res);
resource_size_t end = res->start + resource_size(res);
if (!next || strcmp(res->name, label_id->id) != 0
diff --git a/drivers/nvdimm/nd.h b/drivers/nvdimm/nd.h
index 32e0364b48b9..da7da15e03e7 100644
--- a/drivers/nvdimm/nd.h
+++ b/drivers/nvdimm/nd.h
@@ -102,11 +102,10 @@ unsigned sizeof_namespace_label(struct nvdimm_drvdata *ndd);
(unsigned long long) (res ? res->start : 0), ##arg)
#define for_each_dpa_resource(ndd, res) \
- for (res = (ndd)->dpa.child; res; res = res->sibling)
+ list_for_each_entry(res, &(ndd)->dpa.child, sibling)
#define for_each_dpa_resource_safe(ndd, res, next) \
- for (res = (ndd)->dpa.child, next = res ? res->sibling : NULL; \
- res; res = next, next = next ? next->sibling : NULL)
+ list_for_each_entry_safe(res, next, &(ndd)->dpa.child, sibling)
struct nd_percpu_lane {
int count;
diff --git a/drivers/of/address.c b/drivers/of/address.c
index 53349912ac75..e2e25719ab52 100644
--- a/drivers/of/address.c
+++ b/drivers/of/address.c
@@ -330,7 +330,9 @@ int of_pci_range_to_resource(struct of_pci_range *range,
{
int err;
res->flags = range->flags;
- res->parent = res->child = res->sibling = NULL;
+ res->parent = NULL;
+ INIT_LIST_HEAD(&res->child);
+ INIT_LIST_HEAD(&res->sibling);
res->name = np->full_name;
if (res->flags & IORESOURCE_IO) {
diff --git a/drivers/parisc/lba_pci.c b/drivers/parisc/lba_pci.c
index 69bd98421eb1..7482bdfd1959 100644
--- a/drivers/parisc/lba_pci.c
+++ b/drivers/parisc/lba_pci.c
@@ -170,8 +170,8 @@ lba_dump_res(struct resource *r, int d)
for (i = d; i ; --i) printk(" ");
printk(KERN_DEBUG "%p [%lx,%lx]/%lx\n", r,
(long)r->start, (long)r->end, r->flags);
- lba_dump_res(r->child, d+2);
- lba_dump_res(r->sibling, d);
+ lba_dump_res(resource_first_child(&r->child), d+2);
+ lba_dump_res(resource_sibling(r), d);
}
diff --git a/drivers/pci/host/vmd.c b/drivers/pci/host/vmd.c
index 930a8fa08bd6..c3000af903ea 100644
--- a/drivers/pci/host/vmd.c
+++ b/drivers/pci/host/vmd.c
@@ -520,14 +520,14 @@ static struct pci_ops vmd_ops = {
static void vmd_attach_resources(struct vmd_dev *vmd)
{
- vmd->dev->resource[VMD_MEMBAR1].child = &vmd->resources[1];
- vmd->dev->resource[VMD_MEMBAR2].child = &vmd->resources[2];
+ list_add(&vmd->resources[1].sibling, &vmd->dev->resource[VMD_MEMBAR1].child);
+ list_add(&vmd->resources[2].sibling, &vmd->dev->resource[VMD_MEMBAR2].child);
}
static void vmd_detach_resources(struct vmd_dev *vmd)
{
- vmd->dev->resource[VMD_MEMBAR1].child = NULL;
- vmd->dev->resource[VMD_MEMBAR2].child = NULL;
+ INIT_LIST_HEAD(&vmd->dev->resource[VMD_MEMBAR1].child);
+ INIT_LIST_HEAD(&vmd->dev->resource[VMD_MEMBAR2].child);
}
/*
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index ac91b6fd0bcd..d162c77bec29 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -59,6 +59,8 @@ static struct resource *get_pci_domain_busn_res(int domain_nr)
r->res.start = 0;
r->res.end = 0xff;
r->res.flags = IORESOURCE_BUS | IORESOURCE_PCI_FIXED;
+ INIT_LIST_HEAD(&r->res.child);
+ INIT_LIST_HEAD(&r->res.sibling);
list_add_tail(&r->list, &pci_domain_busn_res_list);
diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c
index 072784f55ea5..0d5e30004ca6 100644
--- a/drivers/pci/setup-bus.c
+++ b/drivers/pci/setup-bus.c
@@ -2107,7 +2107,7 @@ int pci_reassign_bridge_resources(struct pci_dev *bridge, unsigned long type)
continue;
/* Ignore BARs which are still in use */
- if (res->child)
+ if (!list_empty(&res->child))
continue;
ret = add_to_list(&saved, bridge, res, 0, 0);
diff --git a/include/linux/ioport.h b/include/linux/ioport.h
index da0ebaec25f0..225d13d3500a 100644
--- a/include/linux/ioport.h
+++ b/include/linux/ioport.h
@@ -12,6 +12,7 @@
#ifndef __ASSEMBLY__
#include <linux/compiler.h>
#include <linux/types.h>
+#include <linux/list.h>
/*
* Resources are tree-like, allowing
* nesting etc..
@@ -22,7 +23,8 @@ struct resource {
const char *name;
unsigned long flags;
unsigned long desc;
- struct resource *parent, *sibling, *child;
+ struct list_head child, sibling;
+ struct resource *parent;
};
/*
@@ -215,7 +217,6 @@ static inline bool resource_contains(struct resource *r1, struct resource *r2)
return r1->start <= r2->start && r1->end >= r2->end;
}
-
/* Convenience shorthand with allocation */
#define request_region(start,n,name) __request_region(&ioport_resource, (start), (n), (name), 0)
#define request_muxed_region(start,n,name) __request_region(&ioport_resource, (start), (n), (name), IORESOURCE_MUXED)
@@ -286,6 +287,18 @@ static inline bool resource_overlaps(struct resource *r1, struct resource *r2)
return (r1->start <= r2->end && r1->end >= r2->start);
}
+static inline struct resource *resource_sibling(struct resource *res)
+{
+ if (res->parent && !list_is_last(&res->sibling, &res->parent->child))
+ return list_next_entry(res, sibling);
+ return NULL;
+}
+
+static inline struct resource *resource_first_child(struct list_head *head)
+{
+ return list_first_entry_or_null(head, struct resource, sibling);
+}
+
#endif /* __ASSEMBLY__ */
#endif /* _LINUX_IOPORT_H */
diff --git a/kernel/resource.c b/kernel/resource.c
index 2af6c03858b9..4f560991c130 100644
--- a/kernel/resource.c
+++ b/kernel/resource.c
@@ -31,6 +31,8 @@ struct resource ioport_resource = {
.start = 0,
.end = IO_SPACE_LIMIT,
.flags = IORESOURCE_IO,
+ .sibling = LIST_HEAD_INIT(ioport_resource.sibling),
+ .child = LIST_HEAD_INIT(ioport_resource.child),
};
EXPORT_SYMBOL(ioport_resource);
@@ -39,6 +41,8 @@ struct resource iomem_resource = {
.start = 0,
.end = -1,
.flags = IORESOURCE_MEM,
+ .sibling = LIST_HEAD_INIT(iomem_resource.sibling),
+ .child = LIST_HEAD_INIT(iomem_resource.child),
};
EXPORT_SYMBOL(iomem_resource);
@@ -57,20 +61,20 @@ static DEFINE_RWLOCK(resource_lock);
* by boot mem after the system is up. So for reusing the resource entry
* we need to remember the resource.
*/
-static struct resource *bootmem_resource_free;
+static struct list_head bootmem_resource_free = LIST_HEAD_INIT(bootmem_resource_free);
static DEFINE_SPINLOCK(bootmem_resource_lock);
static struct resource *next_resource(struct resource *p, bool sibling_only)
{
/* Caller wants to traverse through siblings only */
if (sibling_only)
- return p->sibling;
+ return resource_sibling(p);
- if (p->child)
- return p->child;
- while (!p->sibling && p->parent)
+ if (!list_empty(&p->child))
+ return resource_first_child(&p->child);
+ while (!resource_sibling(p) && p->parent)
p = p->parent;
- return p->sibling;
+ return resource_sibling(p);
}
static void *r_next(struct seq_file *m, void *v, loff_t *pos)
@@ -90,7 +94,7 @@ static void *r_start(struct seq_file *m, loff_t *pos)
struct resource *p = m->private;
loff_t l = 0;
read_lock(&resource_lock);
- for (p = p->child; p && l < *pos; p = r_next(m, p, &l))
+ for (p = resource_first_child(&p->child); p && l < *pos; p = r_next(m, p, &l))
;
return p;
}
@@ -186,8 +190,7 @@ static void free_resource(struct resource *res)
if (!PageSlab(virt_to_head_page(res))) {
spin_lock(&bootmem_resource_lock);
- res->sibling = bootmem_resource_free;
- bootmem_resource_free = res;
+ list_add(&res->sibling, &bootmem_resource_free);
spin_unlock(&bootmem_resource_lock);
} else {
kfree(res);
@@ -199,10 +202,9 @@ static struct resource *alloc_resource(gfp_t flags)
struct resource *res = NULL;
spin_lock(&bootmem_resource_lock);
- if (bootmem_resource_free) {
- res = bootmem_resource_free;
- bootmem_resource_free = res->sibling;
- }
+ res = resource_first_child(&bootmem_resource_free);
+ if (res)
+ list_del(&res->sibling);
spin_unlock(&bootmem_resource_lock);
if (res)
@@ -210,6 +212,8 @@ static struct resource *alloc_resource(gfp_t flags)
else
res = kzalloc(sizeof(struct resource), flags);
+ INIT_LIST_HEAD(&res->child);
+ INIT_LIST_HEAD(&res->sibling);
return res;
}
@@ -218,7 +222,7 @@ static struct resource * __request_resource(struct resource *root, struct resour
{
resource_size_t start = new->start;
resource_size_t end = new->end;
- struct resource *tmp, **p;
+ struct resource *tmp;
if (end < start)
return root;
@@ -226,64 +230,62 @@ static struct resource * __request_resource(struct resource *root, struct resour
return root;
if (end > root->end)
return root;
- p = &root->child;
- for (;;) {
- tmp = *p;
- if (!tmp || tmp->start > end) {
- new->sibling = tmp;
- *p = new;
+
+ if (list_empty(&root->child)) {
+ list_add(&new->sibling, &root->child);
+ new->parent = root;
+ INIT_LIST_HEAD(&new->child);
+ return NULL;
+ }
+
+ list_for_each_entry(tmp, &root->child, sibling) {
+ if (tmp->start > end) {
+ list_add(&new->sibling, tmp->sibling.prev);
new->parent = root;
+ INIT_LIST_HEAD(&new->child);
return NULL;
}
- p = &tmp->sibling;
if (tmp->end < start)
continue;
return tmp;
}
+
+ list_add_tail(&new->sibling, &root->child);
+ new->parent = root;
+ INIT_LIST_HEAD(&new->child);
+ return NULL;
}
static int __release_resource(struct resource *old, bool release_child)
{
- struct resource *tmp, **p, *chd;
+ struct resource *tmp, *next, *chd;
- p = &old->parent->child;
- for (;;) {
- tmp = *p;
- if (!tmp)
- break;
+ list_for_each_entry_safe(tmp, next, &old->parent->child, sibling) {
if (tmp == old) {
- if (release_child || !(tmp->child)) {
- *p = tmp->sibling;
+ if (release_child || list_empty(&tmp->child)) {
+ list_del(&tmp->sibling);
} else {
- for (chd = tmp->child;; chd = chd->sibling) {
+ list_for_each_entry(chd, &tmp->child, sibling)
chd->parent = tmp->parent;
- if (!(chd->sibling))
- break;
- }
- *p = tmp->child;
- chd->sibling = tmp->sibling;
+ list_splice(&tmp->child, tmp->sibling.prev);
+ list_del(&tmp->sibling);
}
+
old->parent = NULL;
return 0;
}
- p = &tmp->sibling;
}
return -EINVAL;
}
static void __release_child_resources(struct resource *r)
{
- struct resource *tmp, *p;
+ struct resource *tmp, *next;
resource_size_t size;
- p = r->child;
- r->child = NULL;
- while (p) {
- tmp = p;
- p = p->sibling;
-
+ list_for_each_entry_safe(tmp, next, &r->child, sibling) {
tmp->parent = NULL;
- tmp->sibling = NULL;
+ INIT_LIST_HEAD(&tmp->sibling);
__release_child_resources(tmp);
printk(KERN_DEBUG "release child resource %pR\n", tmp);
@@ -292,6 +294,8 @@ static void __release_child_resources(struct resource *r)
tmp->start = 0;
tmp->end = size - 1;
}
+
+ INIT_LIST_HEAD(&tmp->child);
}
void release_child_resources(struct resource *r)
@@ -376,7 +380,8 @@ static int find_next_iomem_res(struct resource *res, unsigned long desc,
read_lock(&resource_lock);
- for (p = iomem_resource.child; p; p = next_resource(p, sibling_only)) {
+ for (p = resource_first_child(&iomem_resource.child); p;
+ p = next_resource(p, sibling_only)) {
if ((p->flags & res->flags) != res->flags)
continue;
if ((desc != IORES_DESC_NONE) && (desc != p->desc))
@@ -564,7 +569,7 @@ int region_intersects(resource_size_t start, size_t size, unsigned long flags,
struct resource *p;
read_lock(&resource_lock);
- for (p = iomem_resource.child; p ; p = p->sibling) {
+ list_for_each_entry(p, &iomem_resource.child, sibling) {
bool is_type = (((p->flags & flags) == flags) &&
((desc == IORES_DESC_NONE) ||
(desc == p->desc)));
@@ -618,7 +623,7 @@ static int __find_resource(struct resource *root, struct resource *old,
resource_size_t size,
struct resource_constraint *constraint)
{
- struct resource *this = root->child;
+ struct resource *this = resource_first_child(&root->child);
struct resource tmp = *new, avail, alloc;
tmp.start = root->start;
@@ -628,7 +633,7 @@ static int __find_resource(struct resource *root, struct resource *old,
*/
if (this && this->start == root->start) {
tmp.start = (this == old) ? old->start : this->end + 1;
- this = this->sibling;
+ this = resource_sibling(this);
}
for(;;) {
if (this)
@@ -664,7 +669,7 @@ next: if (!this || this->end == root->end)
if (this != old)
tmp.start = this->end + 1;
- this = this->sibling;
+ this = resource_sibling(this);
}
return -EBUSY;
}
@@ -708,7 +713,7 @@ static int reallocate_resource(struct resource *root, struct resource *old,
goto out;
}
- if (old->child) {
+ if (!list_empty(&old->child)) {
err = -EBUSY;
goto out;
}
@@ -789,7 +794,7 @@ struct resource *lookup_resource(struct resource *root, resource_size_t start)
struct resource *res;
read_lock(&resource_lock);
- for (res = root->child; res; res = res->sibling) {
+ list_for_each_entry(res, &root->child, sibling) {
if (res->start == start)
break;
}
@@ -822,32 +827,27 @@ static struct resource * __insert_resource(struct resource *parent, struct resou
break;
}
- for (next = first; ; next = next->sibling) {
+ for (next = first; ; next = resource_sibling(next)) {
/* Partial overlap? Bad, and unfixable */
if (next->start < new->start || next->end > new->end)
return next;
- if (!next->sibling)
+ if (!resource_sibling(next))
break;
- if (next->sibling->start > new->end)
+ if (resource_sibling(next)->start > new->end)
break;
}
-
new->parent = parent;
- new->sibling = next->sibling;
- new->child = first;
+ list_add(&new->sibling, &next->sibling);
+ INIT_LIST_HEAD(&new->child);
- next->sibling = NULL;
- for (next = first; next; next = next->sibling)
+ /*
+ * From first to next, they all fall into new's region, so change them
+ * as new's children.
+ */
+ list_cut_position(&new->child, first->sibling.prev, &next->sibling);
+ list_for_each_entry(next, &new->child, sibling)
next->parent = new;
- if (parent->child == first) {
- parent->child = new;
- } else {
- next = parent->child;
- while (next->sibling != first)
- next = next->sibling;
- next->sibling = new;
- }
return NULL;
}
@@ -969,19 +969,17 @@ static int __adjust_resource(struct resource *res, resource_size_t start,
if ((start < parent->start) || (end > parent->end))
goto out;
- if (res->sibling && (res->sibling->start <= end))
+ if (resource_sibling(res) && (resource_sibling(res)->start <= end))
goto out;
- tmp = parent->child;
- if (tmp != res) {
- while (tmp->sibling != res)
- tmp = tmp->sibling;
+ if (res->sibling.prev != &parent->child) {
+ tmp = list_prev_entry(res, sibling);
if (start <= tmp->end)
goto out;
}
skip:
- for (tmp = res->child; tmp; tmp = tmp->sibling)
+ list_for_each_entry(tmp, &res->child, sibling)
if ((tmp->start < start) || (tmp->end > end))
goto out;
@@ -1206,34 +1204,32 @@ EXPORT_SYMBOL(__request_region);
void __release_region(struct resource *parent, resource_size_t start,
resource_size_t n)
{
- struct resource **p;
+ struct resource *res;
resource_size_t end;
- p = &parent->child;
+ res = resource_first_child(&parent->child);
end = start + n - 1;
write_lock(&resource_lock);
for (;;) {
- struct resource *res = *p;
-
if (!res)
break;
if (res->start <= start && res->end >= end) {
if (!(res->flags & IORESOURCE_BUSY)) {
- p = &res->child;
+ res = resource_first_child(&res->child);
continue;
}
if (res->start != start || res->end != end)
break;
- *p = res->sibling;
+ list_del(&res->sibling);
write_unlock(&resource_lock);
if (res->flags & IORESOURCE_MUXED)
wake_up(&muxed_resource_wait);
free_resource(res);
return;
}
- p = &res->sibling;
+ res = resource_sibling(res);
}
write_unlock(&resource_lock);
@@ -1268,9 +1264,7 @@ EXPORT_SYMBOL(__release_region);
int release_mem_region_adjustable(struct resource *parent,
resource_size_t start, resource_size_t size)
{
- struct resource **p;
- struct resource *res;
- struct resource *new_res;
+ struct resource *res, *new_res;
resource_size_t end;
int ret = -EINVAL;
@@ -1281,16 +1275,16 @@ int release_mem_region_adjustable(struct resource *parent,
/* The alloc_resource() result gets checked later */
new_res = alloc_resource(GFP_KERNEL);
- p = &parent->child;
+ res = resource_first_child(&parent->child);
write_lock(&resource_lock);
- while ((res = *p)) {
+ while ((res)) {
if (res->start >= end)
break;
/* look for the next resource if it does not fit into */
if (res->start > start || res->end < end) {
- p = &res->sibling;
+ res = resource_sibling(res);
continue;
}
@@ -1298,14 +1292,14 @@ int release_mem_region_adjustable(struct resource *parent,
break;
if (!(res->flags & IORESOURCE_BUSY)) {
- p = &res->child;
+ res = resource_first_child(&res->child);
continue;
}
/* found the target resource; let's adjust accordingly */
if (res->start == start && res->end == end) {
/* free the whole entry */
- *p = res->sibling;
+ list_del(&res->sibling);
free_resource(res);
ret = 0;
} else if (res->start == start && res->end != end) {
@@ -1328,14 +1322,13 @@ int release_mem_region_adjustable(struct resource *parent,
new_res->flags = res->flags;
new_res->desc = res->desc;
new_res->parent = res->parent;
- new_res->sibling = res->sibling;
- new_res->child = NULL;
+ INIT_LIST_HEAD(&new_res->child);
ret = __adjust_resource(res, res->start,
start - res->start);
if (ret)
break;
- res->sibling = new_res;
+ list_add(&new_res->sibling, &res->sibling);
new_res = NULL;
}
@@ -1516,7 +1509,7 @@ static int __init reserve_setup(char *str)
res->end = io_start + io_num - 1;
res->flags |= IORESOURCE_BUSY;
res->desc = IORES_DESC_NONE;
- res->child = NULL;
+ INIT_LIST_HEAD(&res->child);
if (request_resource(parent, res) == 0)
reserved = x+1;
}
@@ -1536,7 +1529,7 @@ int iomem_map_sanity_check(resource_size_t addr, unsigned long size)
loff_t l;
read_lock(&resource_lock);
- for (p = p->child; p ; p = r_next(NULL, p, &l)) {
+ for (p = resource_first_child(&p->child); p; p = r_next(NULL, p, &l)) {
/*
* We can probably skip the resources without
* IORESOURCE_IO attribute?
@@ -1592,7 +1585,7 @@ bool iomem_is_exclusive(u64 addr)
addr = addr & PAGE_MASK;
read_lock(&resource_lock);
- for (p = p->child; p ; p = r_next(NULL, p, &l)) {
+ for (p = resource_first_child(&p->child); p; p = r_next(NULL, p, &l)) {
/*
* We can probably skip the resources without
* IORESOURCE_IO attribute?
--
2.13.6
_______________________________________________
Linux-nvdimm mailing list
Linux-nvdimm@lists.01.org
https://lists.01.org/mailman/listinfo/linux-nvdimm
^ permalink raw reply related [flat|nested] 42+ messages in thread
* [PATCH v4 1/3] resource: Use list_head to link sibling resource
@ 2018-05-07 6:32 ` Baoquan He
0 siblings, 0 replies; 42+ messages in thread
From: Baoquan He @ 2018-05-07 6:32 UTC (permalink / raw)
To: linux-kernel, akpm, robh+dt, dan.j.williams, nicolas.pitre, josh,
fengguang.wu, bp
Cc: brijesh.singh, devicetree, airlied, linux-pci, richard.weiyang,
keith.busch, jcmvbkbc, baiyaowei, frowand.list,
lorenzo.pieralisi, sthemmin, Baoquan He, linux-nvdimm,
patrik.r.jakobsson, linux-input, gustavo, dyoung, vgoyal,
thomas.lendacky, haiyangz, maarten.lankhorst, jglisse, seanpaul,
bhelgaas, tglx, yinghai, jonathan.derrick, chris, monstr,
linux-parisc, gregkh, dmitry.torokhov, kexec, ebiederm, devel,
davem
The struct resource uses singly linked list to link siblings, implemented
by pointer operation. Replace it with list_head for better code readability.
Based on this list_head replacement, it will be very easy to do reverse
iteration on iomem_resource's sibling list in later patch.
Besides, type of member variables of struct resource, sibling and child, are
changed from 'struct resource *' to 'struct list_head'. This brings two
pointers of size increase.
Suggested-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Baoquan He <bhe@redhat.com>
Cc: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
Cc: David Airlie <airlied@linux.ie>
Cc: "K. Y. Srinivasan" <kys@microsoft.com>
Cc: Haiyang Zhang <haiyangz@microsoft.com>
Cc: Stephen Hemminger <sthemmin@microsoft.com>
Cc: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Cc: Dan Williams <dan.j.williams@intel.com>
Cc: Rob Herring <robh+dt@kernel.org>
Cc: Frank Rowand <frowand.list@gmail.com>
Cc: Keith Busch <keith.busch@intel.com>
Cc: Jonathan Derrick <jonathan.derrick@intel.com>
Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Cc: Bjorn Helgaas <bhelgaas@google.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Brijesh Singh <brijesh.singh@amd.com>
Cc: "Jérôme Glisse" <jglisse@redhat.com>
Cc: Borislav Petkov <bp@suse.de>
Cc: Tom Lendacky <thomas.lendacky@amd.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Yaowei Bai <baiyaowei@cmss.chinamobile.com>
Cc: Wei Yang <richard.weiyang@gmail.com>
Cc: devel@linuxdriverproject.org
Cc: linux-input@vger.kernel.org
Cc: linux-nvdimm@lists.01.org
Cc: devicetree@vger.kernel.org
Cc: linux-pci@vger.kernel.org
---
v3->v4:
Fix several bugs test robot reported. And change patch log.
v2->v3:
Rename resource functions first_child() and sibling() to
resource_first_chils() and resource_sibling(). Dan suggested this.
Move resource_first_chils() and resource_sibling() to linux/ioport.h
and make them as inline function. Rob suggested this. Accordingly add
linux/list.h including in linux/ioport.h, please help review if this
bring efficiency degradation or code redundancy.
The change on struct resource {} bring two pointers of size increase,
mention this in git log to make it more specifically, Rob suggested
this.
arch/microblaze/pci/pci-common.c | 31 +++--
arch/sparc/kernel/ioport.c | 2 +-
arch/xtensa/include/asm/pci-bridge.h | 4 +-
drivers/eisa/eisa-bus.c | 2 +
drivers/gpu/drm/drm_memory.c | 3 +-
drivers/gpu/drm/gma500/gtt.c | 5 +-
drivers/hv/vmbus_drv.c | 52 ++++----
drivers/input/joystick/iforce/iforce-main.c | 4 +-
drivers/nvdimm/e820.c | 2 +-
drivers/nvdimm/namespace_devs.c | 6 +-
drivers/nvdimm/nd.h | 5 +-
drivers/of/address.c | 4 +-
drivers/parisc/lba_pci.c | 4 +-
drivers/pci/host/vmd.c | 8 +-
drivers/pci/probe.c | 2 +
drivers/pci/setup-bus.c | 2 +-
include/linux/ioport.h | 17 ++-
kernel/resource.c | 181 +++++++++++++---------------
18 files changed, 170 insertions(+), 164 deletions(-)
diff --git a/arch/microblaze/pci/pci-common.c b/arch/microblaze/pci/pci-common.c
index 161f9758c631..56d189cb4be4 100644
--- a/arch/microblaze/pci/pci-common.c
+++ b/arch/microblaze/pci/pci-common.c
@@ -533,7 +533,9 @@ void pci_process_bridge_OF_ranges(struct pci_controller *hose,
res->flags = range.flags;
res->start = range.cpu_addr;
res->end = range.cpu_addr + range.size - 1;
- res->parent = res->child = res->sibling = NULL;
+ res->parent = NULL;
+ INIT_LIST_HEAD(&res->child);
+ INIT_LIST_HEAD(&res->sibling);
}
}
@@ -625,28 +627,31 @@ EXPORT_SYMBOL(pcibios_add_device);
static int __init reparent_resources(struct resource *parent,
struct resource *res)
{
- struct resource *p, **pp;
- struct resource **firstpp = NULL;
+ struct resource *p, *first = NULL;
- for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) {
+ list_for_each_entry(p, &parent->child, sibling) {
if (p->end < res->start)
continue;
if (res->end < p->start)
break;
if (p->start < res->start || p->end > res->end)
return -1; /* not completely contained */
- if (firstpp == NULL)
- firstpp = pp;
+ if (first == NULL)
+ first = p;
}
- if (firstpp == NULL)
+ if (first == NULL)
return -1; /* didn't find any conflicting entries? */
res->parent = parent;
- res->child = *firstpp;
- res->sibling = *pp;
- *firstpp = res;
- *pp = NULL;
- for (p = res->child; p != NULL; p = p->sibling) {
- p->parent = res;
+ list_add(&res->sibling, &p->sibling.prev);
+ INIT_LIST_HEAD(&res->child);
+
+ /*
+ * From first to p's previous sibling, they all fall into
+ * res's region, change them as res's children.
+ */
+ list_cut_position(&res->child, first->sibling.prev, res->sibling.prev);
+ list_for_each_entry(p, &new->child, sibling) {
+ p->parent = new;
pr_debug("PCI: Reparented %s [%llx..%llx] under %s\n",
p->name,
(unsigned long long)p->start,
diff --git a/arch/sparc/kernel/ioport.c b/arch/sparc/kernel/ioport.c
index 3bcef9ce74df..4e91fbbbedcc 100644
--- a/arch/sparc/kernel/ioport.c
+++ b/arch/sparc/kernel/ioport.c
@@ -669,7 +669,7 @@ static int sparc_io_proc_show(struct seq_file *m, void *v)
struct resource *root = m->private, *r;
const char *nm;
- for (r = root->child; r != NULL; r = r->sibling) {
+ list_for_each_entry(r, &root->child, sibling) {
if ((nm = r->name) == NULL) nm = "???";
seq_printf(m, "%016llx-%016llx: %s\n",
(unsigned long long)r->start,
diff --git a/arch/xtensa/include/asm/pci-bridge.h b/arch/xtensa/include/asm/pci-bridge.h
index 0b68c76ec1e6..f487b06817df 100644
--- a/arch/xtensa/include/asm/pci-bridge.h
+++ b/arch/xtensa/include/asm/pci-bridge.h
@@ -71,8 +71,8 @@ static inline void pcibios_init_resource(struct resource *res,
res->flags = flags;
res->name = name;
res->parent = NULL;
- res->sibling = NULL;
- res->child = NULL;
+ INIT_LIST_HEAD(&res->child);
+ INIT_LIST_HEAD(&res->sibling);
}
diff --git a/drivers/eisa/eisa-bus.c b/drivers/eisa/eisa-bus.c
index 1e8062f6dbfc..dba78f75fd06 100644
--- a/drivers/eisa/eisa-bus.c
+++ b/drivers/eisa/eisa-bus.c
@@ -408,6 +408,8 @@ static struct resource eisa_root_res = {
.start = 0,
.end = 0xffffffff,
.flags = IORESOURCE_IO,
+ .sibling = LIST_HEAD_INIT(eisa_root_res.sibling),
+ .child = LIST_HEAD_INIT(eisa_root_res.child),
};
static int eisa_bus_count;
diff --git a/drivers/gpu/drm/drm_memory.c b/drivers/gpu/drm/drm_memory.c
index 3c54044214db..53e300a993dc 100644
--- a/drivers/gpu/drm/drm_memory.c
+++ b/drivers/gpu/drm/drm_memory.c
@@ -155,9 +155,8 @@ u64 drm_get_max_iomem(void)
struct resource *tmp;
resource_size_t max_iomem = 0;
- for (tmp = iomem_resource.child; tmp; tmp = tmp->sibling) {
+ list_for_each_entry(tmp, &iomem_resource.child, sibling)
max_iomem = max(max_iomem, tmp->end);
- }
return max_iomem;
}
diff --git a/drivers/gpu/drm/gma500/gtt.c b/drivers/gpu/drm/gma500/gtt.c
index 3949b0990916..addd3bc009af 100644
--- a/drivers/gpu/drm/gma500/gtt.c
+++ b/drivers/gpu/drm/gma500/gtt.c
@@ -565,7 +565,7 @@ int psb_gtt_init(struct drm_device *dev, int resume)
int psb_gtt_restore(struct drm_device *dev)
{
struct drm_psb_private *dev_priv = dev->dev_private;
- struct resource *r = dev_priv->gtt_mem->child;
+ struct resource *r;
struct gtt_range *range;
unsigned int restored = 0, total = 0, size = 0;
@@ -573,14 +573,13 @@ int psb_gtt_restore(struct drm_device *dev)
mutex_lock(&dev_priv->gtt_mutex);
psb_gtt_init(dev, 1);
- while (r != NULL) {
+ list_for_each_entry(r, &dev_priv->gtt_mem->child, sibling) {
range = container_of(r, struct gtt_range, resource);
if (range->pages) {
psb_gtt_insert(dev, range, 1);
size += range->resource.end - range->resource.start;
restored++;
}
- r = r->sibling;
total++;
}
mutex_unlock(&dev_priv->gtt_mutex);
diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c
index b10fe26c4891..d87ec5a1bc4c 100644
--- a/drivers/hv/vmbus_drv.c
+++ b/drivers/hv/vmbus_drv.c
@@ -1412,9 +1412,8 @@ static acpi_status vmbus_walk_resources(struct acpi_resource *res, void *ctx)
{
resource_size_t start = 0;
resource_size_t end = 0;
- struct resource *new_res;
+ struct resource *new_res, *tmp;
struct resource **old_res = &hyperv_mmio;
- struct resource **prev_res = NULL;
switch (res->type) {
@@ -1461,44 +1460,36 @@ static acpi_status vmbus_walk_resources(struct acpi_resource *res, void *ctx)
/*
* If two ranges are adjacent, merge them.
*/
- do {
- if (!*old_res) {
- *old_res = new_res;
- break;
- }
-
- if (((*old_res)->end + 1) == new_res->start) {
- (*old_res)->end = new_res->end;
+ if (!*old_res) {
+ *old_res = new_res;
+ return AE_OK;
+ }
+ tmp = *old_res;
+ list_for_each_entry_from(tmp, &tmp->parent->child, sibling) {
+ if ((tmp->end + 1) == new_res->start) {
+ tmp->end = new_res->end;
kfree(new_res);
break;
}
- if ((*old_res)->start == new_res->end + 1) {
- (*old_res)->start = new_res->start;
+ if (tmp->start == new_res->end + 1) {
+ tmp->start = new_res->start;
kfree(new_res);
break;
}
- if ((*old_res)->start > new_res->end) {
- new_res->sibling = *old_res;
- if (prev_res)
- (*prev_res)->sibling = new_res;
- *old_res = new_res;
+ if (tmp->start > new_res->end) {
+ list_add(&new_res->sibling, tmp->sibling.prev);
break;
}
-
- prev_res = old_res;
- old_res = &(*old_res)->sibling;
-
- } while (1);
+ }
return AE_OK;
}
static int vmbus_acpi_remove(struct acpi_device *device)
{
- struct resource *cur_res;
- struct resource *next_res;
+ struct resource *res;
if (hyperv_mmio) {
if (fb_mmio) {
@@ -1507,10 +1498,9 @@ static int vmbus_acpi_remove(struct acpi_device *device)
fb_mmio = NULL;
}
- for (cur_res = hyperv_mmio; cur_res; cur_res = next_res) {
- next_res = cur_res->sibling;
- kfree(cur_res);
- }
+ res = hyperv_mmio;
+ list_for_each_entry_from(res, &res->parent->child, sibling)
+ kfree(res);
}
return 0;
@@ -1596,7 +1586,8 @@ int vmbus_allocate_mmio(struct resource **new, struct hv_device *device_obj,
}
}
- for (iter = hyperv_mmio; iter; iter = iter->sibling) {
+ iter = hyperv_mmio;
+ list_for_each_entry_from(iter, &iter->parent->child, sibling) {
if ((iter->start >= max) || (iter->end <= min))
continue;
@@ -1639,7 +1630,8 @@ void vmbus_free_mmio(resource_size_t start, resource_size_t size)
struct resource *iter;
down(&hyperv_mmio_lock);
- for (iter = hyperv_mmio; iter; iter = iter->sibling) {
+ iter = hyperv_mmio;
+ list_for_each_entry_from(iter, &iter->parent->child, sibling) {
if ((iter->start >= start + size) || (iter->end <= start))
continue;
diff --git a/drivers/input/joystick/iforce/iforce-main.c b/drivers/input/joystick/iforce/iforce-main.c
index daeeb4c7e3b0..5c0be27b33ff 100644
--- a/drivers/input/joystick/iforce/iforce-main.c
+++ b/drivers/input/joystick/iforce/iforce-main.c
@@ -305,8 +305,8 @@ int iforce_init_device(struct iforce *iforce)
iforce->device_memory.end = 200;
iforce->device_memory.flags = IORESOURCE_MEM;
iforce->device_memory.parent = NULL;
- iforce->device_memory.child = NULL;
- iforce->device_memory.sibling = NULL;
+ INIT_LIST_HEAD(&iforce->device_memory.child);
+ INIT_LIST_HEAD(&iforce->device_memory.sibling);
/*
* Wait until device ready - until it sends its first response.
diff --git a/drivers/nvdimm/e820.c b/drivers/nvdimm/e820.c
index 6f9a6ffd7cde..513e661bb0d8 100644
--- a/drivers/nvdimm/e820.c
+++ b/drivers/nvdimm/e820.c
@@ -53,7 +53,7 @@ static int e820_pmem_probe(struct platform_device *pdev)
goto err;
platform_set_drvdata(pdev, nvdimm_bus);
- for (p = iomem_resource.child; p ; p = p->sibling) {
+ list_for_each_entry(p, &iomem_resource.child, sibling) {
struct nd_region_desc ndr_desc;
if (p->desc != IORES_DESC_PERSISTENT_MEMORY_LEGACY)
diff --git a/drivers/nvdimm/namespace_devs.c b/drivers/nvdimm/namespace_devs.c
index 28afdd668905..f53d410d9981 100644
--- a/drivers/nvdimm/namespace_devs.c
+++ b/drivers/nvdimm/namespace_devs.c
@@ -637,7 +637,7 @@ static resource_size_t scan_allocate(struct nd_region *nd_region,
retry:
first = 0;
for_each_dpa_resource(ndd, res) {
- struct resource *next = res->sibling, *new_res = NULL;
+ struct resource *next = resource_sibling(res), *new_res = NULL;
resource_size_t allocate, available = 0;
enum alloc_loc loc = ALLOC_ERR;
const char *action;
@@ -763,7 +763,7 @@ static resource_size_t scan_allocate(struct nd_region *nd_region,
* an initial "pmem-reserve pass". Only do an initial BLK allocation
* when none of the DPA space is reserved.
*/
- if ((is_pmem || !ndd->dpa.child) && n == to_allocate)
+ if ((is_pmem || list_empty(&ndd->dpa.child)) && n == to_allocate)
return init_dpa_allocation(label_id, nd_region, nd_mapping, n);
return n;
}
@@ -779,7 +779,7 @@ static int merge_dpa(struct nd_region *nd_region,
retry:
for_each_dpa_resource(ndd, res) {
int rc;
- struct resource *next = res->sibling;
+ struct resource *next = resource_sibling(res);
resource_size_t end = res->start + resource_size(res);
if (!next || strcmp(res->name, label_id->id) != 0
diff --git a/drivers/nvdimm/nd.h b/drivers/nvdimm/nd.h
index 32e0364b48b9..da7da15e03e7 100644
--- a/drivers/nvdimm/nd.h
+++ b/drivers/nvdimm/nd.h
@@ -102,11 +102,10 @@ unsigned sizeof_namespace_label(struct nvdimm_drvdata *ndd);
(unsigned long long) (res ? res->start : 0), ##arg)
#define for_each_dpa_resource(ndd, res) \
- for (res = (ndd)->dpa.child; res; res = res->sibling)
+ list_for_each_entry(res, &(ndd)->dpa.child, sibling)
#define for_each_dpa_resource_safe(ndd, res, next) \
- for (res = (ndd)->dpa.child, next = res ? res->sibling : NULL; \
- res; res = next, next = next ? next->sibling : NULL)
+ list_for_each_entry_safe(res, next, &(ndd)->dpa.child, sibling)
struct nd_percpu_lane {
int count;
diff --git a/drivers/of/address.c b/drivers/of/address.c
index 53349912ac75..e2e25719ab52 100644
--- a/drivers/of/address.c
+++ b/drivers/of/address.c
@@ -330,7 +330,9 @@ int of_pci_range_to_resource(struct of_pci_range *range,
{
int err;
res->flags = range->flags;
- res->parent = res->child = res->sibling = NULL;
+ res->parent = NULL;
+ INIT_LIST_HEAD(&res->child);
+ INIT_LIST_HEAD(&res->sibling);
res->name = np->full_name;
if (res->flags & IORESOURCE_IO) {
diff --git a/drivers/parisc/lba_pci.c b/drivers/parisc/lba_pci.c
index 69bd98421eb1..7482bdfd1959 100644
--- a/drivers/parisc/lba_pci.c
+++ b/drivers/parisc/lba_pci.c
@@ -170,8 +170,8 @@ lba_dump_res(struct resource *r, int d)
for (i = d; i ; --i) printk(" ");
printk(KERN_DEBUG "%p [%lx,%lx]/%lx\n", r,
(long)r->start, (long)r->end, r->flags);
- lba_dump_res(r->child, d+2);
- lba_dump_res(r->sibling, d);
+ lba_dump_res(resource_first_child(&r->child), d+2);
+ lba_dump_res(resource_sibling(r), d);
}
diff --git a/drivers/pci/host/vmd.c b/drivers/pci/host/vmd.c
index 930a8fa08bd6..c3000af903ea 100644
--- a/drivers/pci/host/vmd.c
+++ b/drivers/pci/host/vmd.c
@@ -520,14 +520,14 @@ static struct pci_ops vmd_ops = {
static void vmd_attach_resources(struct vmd_dev *vmd)
{
- vmd->dev->resource[VMD_MEMBAR1].child = &vmd->resources[1];
- vmd->dev->resource[VMD_MEMBAR2].child = &vmd->resources[2];
+ list_add(&vmd->resources[1].sibling, &vmd->dev->resource[VMD_MEMBAR1].child);
+ list_add(&vmd->resources[2].sibling, &vmd->dev->resource[VMD_MEMBAR2].child);
}
static void vmd_detach_resources(struct vmd_dev *vmd)
{
- vmd->dev->resource[VMD_MEMBAR1].child = NULL;
- vmd->dev->resource[VMD_MEMBAR2].child = NULL;
+ INIT_LIST_HEAD(&vmd->dev->resource[VMD_MEMBAR1].child);
+ INIT_LIST_HEAD(&vmd->dev->resource[VMD_MEMBAR2].child);
}
/*
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index ac91b6fd0bcd..d162c77bec29 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -59,6 +59,8 @@ static struct resource *get_pci_domain_busn_res(int domain_nr)
r->res.start = 0;
r->res.end = 0xff;
r->res.flags = IORESOURCE_BUS | IORESOURCE_PCI_FIXED;
+ INIT_LIST_HEAD(&r->res.child);
+ INIT_LIST_HEAD(&r->res.sibling);
list_add_tail(&r->list, &pci_domain_busn_res_list);
diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c
index 072784f55ea5..0d5e30004ca6 100644
--- a/drivers/pci/setup-bus.c
+++ b/drivers/pci/setup-bus.c
@@ -2107,7 +2107,7 @@ int pci_reassign_bridge_resources(struct pci_dev *bridge, unsigned long type)
continue;
/* Ignore BARs which are still in use */
- if (res->child)
+ if (!list_empty(&res->child))
continue;
ret = add_to_list(&saved, bridge, res, 0, 0);
diff --git a/include/linux/ioport.h b/include/linux/ioport.h
index da0ebaec25f0..225d13d3500a 100644
--- a/include/linux/ioport.h
+++ b/include/linux/ioport.h
@@ -12,6 +12,7 @@
#ifndef __ASSEMBLY__
#include <linux/compiler.h>
#include <linux/types.h>
+#include <linux/list.h>
/*
* Resources are tree-like, allowing
* nesting etc..
@@ -22,7 +23,8 @@ struct resource {
const char *name;
unsigned long flags;
unsigned long desc;
- struct resource *parent, *sibling, *child;
+ struct list_head child, sibling;
+ struct resource *parent;
};
/*
@@ -215,7 +217,6 @@ static inline bool resource_contains(struct resource *r1, struct resource *r2)
return r1->start <= r2->start && r1->end >= r2->end;
}
-
/* Convenience shorthand with allocation */
#define request_region(start,n,name) __request_region(&ioport_resource, (start), (n), (name), 0)
#define request_muxed_region(start,n,name) __request_region(&ioport_resource, (start), (n), (name), IORESOURCE_MUXED)
@@ -286,6 +287,18 @@ static inline bool resource_overlaps(struct resource *r1, struct resource *r2)
return (r1->start <= r2->end && r1->end >= r2->start);
}
+static inline struct resource *resource_sibling(struct resource *res)
+{
+ if (res->parent && !list_is_last(&res->sibling, &res->parent->child))
+ return list_next_entry(res, sibling);
+ return NULL;
+}
+
+static inline struct resource *resource_first_child(struct list_head *head)
+{
+ return list_first_entry_or_null(head, struct resource, sibling);
+}
+
#endif /* __ASSEMBLY__ */
#endif /* _LINUX_IOPORT_H */
diff --git a/kernel/resource.c b/kernel/resource.c
index 2af6c03858b9..4f560991c130 100644
--- a/kernel/resource.c
+++ b/kernel/resource.c
@@ -31,6 +31,8 @@ struct resource ioport_resource = {
.start = 0,
.end = IO_SPACE_LIMIT,
.flags = IORESOURCE_IO,
+ .sibling = LIST_HEAD_INIT(ioport_resource.sibling),
+ .child = LIST_HEAD_INIT(ioport_resource.child),
};
EXPORT_SYMBOL(ioport_resource);
@@ -39,6 +41,8 @@ struct resource iomem_resource = {
.start = 0,
.end = -1,
.flags = IORESOURCE_MEM,
+ .sibling = LIST_HEAD_INIT(iomem_resource.sibling),
+ .child = LIST_HEAD_INIT(iomem_resource.child),
};
EXPORT_SYMBOL(iomem_resource);
@@ -57,20 +61,20 @@ static DEFINE_RWLOCK(resource_lock);
* by boot mem after the system is up. So for reusing the resource entry
* we need to remember the resource.
*/
-static struct resource *bootmem_resource_free;
+static struct list_head bootmem_resource_free = LIST_HEAD_INIT(bootmem_resource_free);
static DEFINE_SPINLOCK(bootmem_resource_lock);
static struct resource *next_resource(struct resource *p, bool sibling_only)
{
/* Caller wants to traverse through siblings only */
if (sibling_only)
- return p->sibling;
+ return resource_sibling(p);
- if (p->child)
- return p->child;
- while (!p->sibling && p->parent)
+ if (!list_empty(&p->child))
+ return resource_first_child(&p->child);
+ while (!resource_sibling(p) && p->parent)
p = p->parent;
- return p->sibling;
+ return resource_sibling(p);
}
static void *r_next(struct seq_file *m, void *v, loff_t *pos)
@@ -90,7 +94,7 @@ static void *r_start(struct seq_file *m, loff_t *pos)
struct resource *p = m->private;
loff_t l = 0;
read_lock(&resource_lock);
- for (p = p->child; p && l < *pos; p = r_next(m, p, &l))
+ for (p = resource_first_child(&p->child); p && l < *pos; p = r_next(m, p, &l))
;
return p;
}
@@ -186,8 +190,7 @@ static void free_resource(struct resource *res)
if (!PageSlab(virt_to_head_page(res))) {
spin_lock(&bootmem_resource_lock);
- res->sibling = bootmem_resource_free;
- bootmem_resource_free = res;
+ list_add(&res->sibling, &bootmem_resource_free);
spin_unlock(&bootmem_resource_lock);
} else {
kfree(res);
@@ -199,10 +202,9 @@ static struct resource *alloc_resource(gfp_t flags)
struct resource *res = NULL;
spin_lock(&bootmem_resource_lock);
- if (bootmem_resource_free) {
- res = bootmem_resource_free;
- bootmem_resource_free = res->sibling;
- }
+ res = resource_first_child(&bootmem_resource_free);
+ if (res)
+ list_del(&res->sibling);
spin_unlock(&bootmem_resource_lock);
if (res)
@@ -210,6 +212,8 @@ static struct resource *alloc_resource(gfp_t flags)
else
res = kzalloc(sizeof(struct resource), flags);
+ INIT_LIST_HEAD(&res->child);
+ INIT_LIST_HEAD(&res->sibling);
return res;
}
@@ -218,7 +222,7 @@ static struct resource * __request_resource(struct resource *root, struct resour
{
resource_size_t start = new->start;
resource_size_t end = new->end;
- struct resource *tmp, **p;
+ struct resource *tmp;
if (end < start)
return root;
@@ -226,64 +230,62 @@ static struct resource * __request_resource(struct resource *root, struct resour
return root;
if (end > root->end)
return root;
- p = &root->child;
- for (;;) {
- tmp = *p;
- if (!tmp || tmp->start > end) {
- new->sibling = tmp;
- *p = new;
+
+ if (list_empty(&root->child)) {
+ list_add(&new->sibling, &root->child);
+ new->parent = root;
+ INIT_LIST_HEAD(&new->child);
+ return NULL;
+ }
+
+ list_for_each_entry(tmp, &root->child, sibling) {
+ if (tmp->start > end) {
+ list_add(&new->sibling, tmp->sibling.prev);
new->parent = root;
+ INIT_LIST_HEAD(&new->child);
return NULL;
}
- p = &tmp->sibling;
if (tmp->end < start)
continue;
return tmp;
}
+
+ list_add_tail(&new->sibling, &root->child);
+ new->parent = root;
+ INIT_LIST_HEAD(&new->child);
+ return NULL;
}
static int __release_resource(struct resource *old, bool release_child)
{
- struct resource *tmp, **p, *chd;
+ struct resource *tmp, *next, *chd;
- p = &old->parent->child;
- for (;;) {
- tmp = *p;
- if (!tmp)
- break;
+ list_for_each_entry_safe(tmp, next, &old->parent->child, sibling) {
if (tmp == old) {
- if (release_child || !(tmp->child)) {
- *p = tmp->sibling;
+ if (release_child || list_empty(&tmp->child)) {
+ list_del(&tmp->sibling);
} else {
- for (chd = tmp->child;; chd = chd->sibling) {
+ list_for_each_entry(chd, &tmp->child, sibling)
chd->parent = tmp->parent;
- if (!(chd->sibling))
- break;
- }
- *p = tmp->child;
- chd->sibling = tmp->sibling;
+ list_splice(&tmp->child, tmp->sibling.prev);
+ list_del(&tmp->sibling);
}
+
old->parent = NULL;
return 0;
}
- p = &tmp->sibling;
}
return -EINVAL;
}
static void __release_child_resources(struct resource *r)
{
- struct resource *tmp, *p;
+ struct resource *tmp, *next;
resource_size_t size;
- p = r->child;
- r->child = NULL;
- while (p) {
- tmp = p;
- p = p->sibling;
-
+ list_for_each_entry_safe(tmp, next, &r->child, sibling) {
tmp->parent = NULL;
- tmp->sibling = NULL;
+ INIT_LIST_HEAD(&tmp->sibling);
__release_child_resources(tmp);
printk(KERN_DEBUG "release child resource %pR\n", tmp);
@@ -292,6 +294,8 @@ static void __release_child_resources(struct resource *r)
tmp->start = 0;
tmp->end = size - 1;
}
+
+ INIT_LIST_HEAD(&tmp->child);
}
void release_child_resources(struct resource *r)
@@ -376,7 +380,8 @@ static int find_next_iomem_res(struct resource *res, unsigned long desc,
read_lock(&resource_lock);
- for (p = iomem_resource.child; p; p = next_resource(p, sibling_only)) {
+ for (p = resource_first_child(&iomem_resource.child); p;
+ p = next_resource(p, sibling_only)) {
if ((p->flags & res->flags) != res->flags)
continue;
if ((desc != IORES_DESC_NONE) && (desc != p->desc))
@@ -564,7 +569,7 @@ int region_intersects(resource_size_t start, size_t size, unsigned long flags,
struct resource *p;
read_lock(&resource_lock);
- for (p = iomem_resource.child; p ; p = p->sibling) {
+ list_for_each_entry(p, &iomem_resource.child, sibling) {
bool is_type = (((p->flags & flags) == flags) &&
((desc == IORES_DESC_NONE) ||
(desc == p->desc)));
@@ -618,7 +623,7 @@ static int __find_resource(struct resource *root, struct resource *old,
resource_size_t size,
struct resource_constraint *constraint)
{
- struct resource *this = root->child;
+ struct resource *this = resource_first_child(&root->child);
struct resource tmp = *new, avail, alloc;
tmp.start = root->start;
@@ -628,7 +633,7 @@ static int __find_resource(struct resource *root, struct resource *old,
*/
if (this && this->start == root->start) {
tmp.start = (this == old) ? old->start : this->end + 1;
- this = this->sibling;
+ this = resource_sibling(this);
}
for(;;) {
if (this)
@@ -664,7 +669,7 @@ next: if (!this || this->end == root->end)
if (this != old)
tmp.start = this->end + 1;
- this = this->sibling;
+ this = resource_sibling(this);
}
return -EBUSY;
}
@@ -708,7 +713,7 @@ static int reallocate_resource(struct resource *root, struct resource *old,
goto out;
}
- if (old->child) {
+ if (!list_empty(&old->child)) {
err = -EBUSY;
goto out;
}
@@ -789,7 +794,7 @@ struct resource *lookup_resource(struct resource *root, resource_size_t start)
struct resource *res;
read_lock(&resource_lock);
- for (res = root->child; res; res = res->sibling) {
+ list_for_each_entry(res, &root->child, sibling) {
if (res->start == start)
break;
}
@@ -822,32 +827,27 @@ static struct resource * __insert_resource(struct resource *parent, struct resou
break;
}
- for (next = first; ; next = next->sibling) {
+ for (next = first; ; next = resource_sibling(next)) {
/* Partial overlap? Bad, and unfixable */
if (next->start < new->start || next->end > new->end)
return next;
- if (!next->sibling)
+ if (!resource_sibling(next))
break;
- if (next->sibling->start > new->end)
+ if (resource_sibling(next)->start > new->end)
break;
}
-
new->parent = parent;
- new->sibling = next->sibling;
- new->child = first;
+ list_add(&new->sibling, &next->sibling);
+ INIT_LIST_HEAD(&new->child);
- next->sibling = NULL;
- for (next = first; next; next = next->sibling)
+ /*
+ * From first to next, they all fall into new's region, so change them
+ * as new's children.
+ */
+ list_cut_position(&new->child, first->sibling.prev, &next->sibling);
+ list_for_each_entry(next, &new->child, sibling)
next->parent = new;
- if (parent->child == first) {
- parent->child = new;
- } else {
- next = parent->child;
- while (next->sibling != first)
- next = next->sibling;
- next->sibling = new;
- }
return NULL;
}
@@ -969,19 +969,17 @@ static int __adjust_resource(struct resource *res, resource_size_t start,
if ((start < parent->start) || (end > parent->end))
goto out;
- if (res->sibling && (res->sibling->start <= end))
+ if (resource_sibling(res) && (resource_sibling(res)->start <= end))
goto out;
- tmp = parent->child;
- if (tmp != res) {
- while (tmp->sibling != res)
- tmp = tmp->sibling;
+ if (res->sibling.prev != &parent->child) {
+ tmp = list_prev_entry(res, sibling);
if (start <= tmp->end)
goto out;
}
skip:
- for (tmp = res->child; tmp; tmp = tmp->sibling)
+ list_for_each_entry(tmp, &res->child, sibling)
if ((tmp->start < start) || (tmp->end > end))
goto out;
@@ -1206,34 +1204,32 @@ EXPORT_SYMBOL(__request_region);
void __release_region(struct resource *parent, resource_size_t start,
resource_size_t n)
{
- struct resource **p;
+ struct resource *res;
resource_size_t end;
- p = &parent->child;
+ res = resource_first_child(&parent->child);
end = start + n - 1;
write_lock(&resource_lock);
for (;;) {
- struct resource *res = *p;
-
if (!res)
break;
if (res->start <= start && res->end >= end) {
if (!(res->flags & IORESOURCE_BUSY)) {
- p = &res->child;
+ res = resource_first_child(&res->child);
continue;
}
if (res->start != start || res->end != end)
break;
- *p = res->sibling;
+ list_del(&res->sibling);
write_unlock(&resource_lock);
if (res->flags & IORESOURCE_MUXED)
wake_up(&muxed_resource_wait);
free_resource(res);
return;
}
- p = &res->sibling;
+ res = resource_sibling(res);
}
write_unlock(&resource_lock);
@@ -1268,9 +1264,7 @@ EXPORT_SYMBOL(__release_region);
int release_mem_region_adjustable(struct resource *parent,
resource_size_t start, resource_size_t size)
{
- struct resource **p;
- struct resource *res;
- struct resource *new_res;
+ struct resource *res, *new_res;
resource_size_t end;
int ret = -EINVAL;
@@ -1281,16 +1275,16 @@ int release_mem_region_adjustable(struct resource *parent,
/* The alloc_resource() result gets checked later */
new_res = alloc_resource(GFP_KERNEL);
- p = &parent->child;
+ res = resource_first_child(&parent->child);
write_lock(&resource_lock);
- while ((res = *p)) {
+ while ((res)) {
if (res->start >= end)
break;
/* look for the next resource if it does not fit into */
if (res->start > start || res->end < end) {
- p = &res->sibling;
+ res = resource_sibling(res);
continue;
}
@@ -1298,14 +1292,14 @@ int release_mem_region_adjustable(struct resource *parent,
break;
if (!(res->flags & IORESOURCE_BUSY)) {
- p = &res->child;
+ res = resource_first_child(&res->child);
continue;
}
/* found the target resource; let's adjust accordingly */
if (res->start == start && res->end == end) {
/* free the whole entry */
- *p = res->sibling;
+ list_del(&res->sibling);
free_resource(res);
ret = 0;
} else if (res->start == start && res->end != end) {
@@ -1328,14 +1322,13 @@ int release_mem_region_adjustable(struct resource *parent,
new_res->flags = res->flags;
new_res->desc = res->desc;
new_res->parent = res->parent;
- new_res->sibling = res->sibling;
- new_res->child = NULL;
+ INIT_LIST_HEAD(&new_res->child);
ret = __adjust_resource(res, res->start,
start - res->start);
if (ret)
break;
- res->sibling = new_res;
+ list_add(&new_res->sibling, &res->sibling);
new_res = NULL;
}
@@ -1516,7 +1509,7 @@ static int __init reserve_setup(char *str)
res->end = io_start + io_num - 1;
res->flags |= IORESOURCE_BUSY;
res->desc = IORES_DESC_NONE;
- res->child = NULL;
+ INIT_LIST_HEAD(&res->child);
if (request_resource(parent, res) == 0)
reserved = x+1;
}
@@ -1536,7 +1529,7 @@ int iomem_map_sanity_check(resource_size_t addr, unsigned long size)
loff_t l;
read_lock(&resource_lock);
- for (p = p->child; p ; p = r_next(NULL, p, &l)) {
+ for (p = resource_first_child(&p->child); p; p = r_next(NULL, p, &l)) {
/*
* We can probably skip the resources without
* IORESOURCE_IO attribute?
@@ -1592,7 +1585,7 @@ bool iomem_is_exclusive(u64 addr)
addr = addr & PAGE_MASK;
read_lock(&resource_lock);
- for (p = p->child; p ; p = r_next(NULL, p, &l)) {
+ for (p = resource_first_child(&p->child); p; p = r_next(NULL, p, &l)) {
/*
* We can probably skip the resources without
* IORESOURCE_IO attribute?
--
2.13.6
_______________________________________________
devel mailing list
devel@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
^ permalink raw reply related [flat|nested] 42+ messages in thread
* [PATCH v4 1/3] resource: Use list_head to link sibling resource
@ 2018-05-07 6:32 ` Baoquan He
0 siblings, 0 replies; 42+ messages in thread
From: Baoquan He @ 2018-05-07 6:32 UTC (permalink / raw)
To: linux-kernel-u79uwXL29TY76Z2rM5mHXA,
akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b,
robh+dt-DgEjT+Ai2ygdnm+yROfE0A,
dan.j.williams-ral2JQCrhuEAvxtiuMwx3w,
nicolas.pitre-QSEj5FYQhm4dnm+yROfE0A,
josh-iaAMLnmF4UmaiuxdJuQwMA, fengguang.wu-ral2JQCrhuEAvxtiuMwx3w,
bp-l3A5Bk7waGM
Cc: brijesh.singh-5C7GfCeVMHo, devicetree-u79uwXL29TY76Z2rM5mHXA,
airlied-cv59FeDIM0c, linux-pci-u79uwXL29TY76Z2rM5mHXA,
richard.weiyang-Re5JQEeQqe8AvxtiuMwx3w,
keith.busch-ral2JQCrhuEAvxtiuMwx3w,
jcmvbkbc-Re5JQEeQqe8AvxtiuMwx3w,
baiyaowei-0p4V/sDNsUmm0O/7XYngnFaTQe2KTcn/,
kys-0li6OtcxBFHby3iVrkZq2A, frowand.list-Re5JQEeQqe8AvxtiuMwx3w,
lorenzo.pieralisi-5wv7dgnIgG8, sthemmin-0li6OtcxBFHby3iVrkZq2A,
Baoquan He, linux-nvdimm-hn68Rpc1hR1g9hUCZPvPmw,
patrik.r.jakobsson-Re5JQEeQqe8AvxtiuMwx3w,
linux-input-u79uwXL29TY76Z2rM5mHXA,
gustavo-THi1TnShQwVAfugRpC6u6w, dyoung-H+wXaHxf7aLQT0dZR+AlfA,
thomas.lendacky-5C7GfCeVMHo, haiyangz-0li6OtcxBFHby3iVrkZq2A,
maarten.lankhorst-VuQAYsv1563Yd54FQh9/CA,
jglisse-H+wXaHxf7aLQT0dZR+AlfA, seanpaul-F7+t8E8rja9g9hUCZPvPmw,
bhelgaas-hpIqsD4AKlfQT0dZR+AlfA, tglx-hfZtesqFncYOwBW4kG4KsQ,
yinghai-DgEjT+Ai2ygdnm+yROfE0A,
jonathan.derrick-ral2JQCrhuEAvxtiuMwx3w,
chris-YvXeqwSYzG2sTnJN9+BGXg, monstr-pSz03upnqPeHXe+LvDLADg,
linux-parisc-u79uwXL29TY76Z2rM5mHXA,
gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r,
dmitry.torokhov-Re5JQEeQqe8AvxtiuMwx3w,
kexec-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
ebiederm-aS9lmoZGLiVWk0Htik3J/w,
devel-tBiZLqfeLfOHmIFyCCdPziST3g8Odh+X,
davem-fT/PcQaiUtIeIZ0/mPfg9Q
VGhlIHN0cnVjdCByZXNvdXJjZSB1c2VzIHNpbmdseSBsaW5rZWQgbGlzdCB0byBsaW5rIHNpYmxp
bmdzLCBpbXBsZW1lbnRlZApieSBwb2ludGVyIG9wZXJhdGlvbi4gUmVwbGFjZSBpdCB3aXRoIGxp
c3RfaGVhZCBmb3IgYmV0dGVyIGNvZGUgcmVhZGFiaWxpdHkuCgpCYXNlZCBvbiB0aGlzIGxpc3Rf
aGVhZCByZXBsYWNlbWVudCwgaXQgd2lsbCBiZSB2ZXJ5IGVhc3kgdG8gZG8gcmV2ZXJzZQppdGVy
YXRpb24gb24gaW9tZW1fcmVzb3VyY2UncyBzaWJsaW5nIGxpc3QgaW4gbGF0ZXIgcGF0Y2guCgpC
ZXNpZGVzLCB0eXBlIG9mIG1lbWJlciB2YXJpYWJsZXMgb2Ygc3RydWN0IHJlc291cmNlLCBzaWJs
aW5nIGFuZCBjaGlsZCwgYXJlCmNoYW5nZWQgZnJvbSAnc3RydWN0IHJlc291cmNlIConIHRvICdz
dHJ1Y3QgbGlzdF9oZWFkJy4gVGhpcyBicmluZ3MgdHdvCnBvaW50ZXJzIG9mIHNpemUgaW5jcmVh
c2UuCgpTdWdnZXN0ZWQtYnk6IEFuZHJldyBNb3J0b24gPGFrcG1AbGludXgtZm91bmRhdGlvbi5v
cmc+ClNpZ25lZC1vZmYtYnk6IEJhb3F1YW4gSGUgPGJoZUByZWRoYXQuY29tPgpDYzogUGF0cmlr
IEpha29ic3NvbiA8cGF0cmlrLnIuamFrb2Jzc29uQGdtYWlsLmNvbT4KQ2M6IERhdmlkIEFpcmxp
ZSA8YWlybGllZEBsaW51eC5pZT4KQ2M6ICJLLiBZLiBTcmluaXZhc2FuIiA8a3lzQG1pY3Jvc29m
dC5jb20+CkNjOiBIYWl5YW5nIFpoYW5nIDxoYWl5YW5nekBtaWNyb3NvZnQuY29tPgpDYzogU3Rl
cGhlbiBIZW1taW5nZXIgPHN0aGVtbWluQG1pY3Jvc29mdC5jb20+CkNjOiBEbWl0cnkgVG9yb2to
b3YgPGRtaXRyeS50b3Jva2hvdkBnbWFpbC5jb20+CkNjOiBEYW4gV2lsbGlhbXMgPGRhbi5qLndp
bGxpYW1zQGludGVsLmNvbT4KQ2M6IFJvYiBIZXJyaW5nIDxyb2JoK2R0QGtlcm5lbC5vcmc+CkNj
OiBGcmFuayBSb3dhbmQgPGZyb3dhbmQubGlzdEBnbWFpbC5jb20+CkNjOiBLZWl0aCBCdXNjaCA8
a2VpdGguYnVzY2hAaW50ZWwuY29tPgpDYzogSm9uYXRoYW4gRGVycmljayA8am9uYXRoYW4uZGVy
cmlja0BpbnRlbC5jb20+CkNjOiBMb3JlbnpvIFBpZXJhbGlzaSA8bG9yZW56by5waWVyYWxpc2lA
YXJtLmNvbT4KQ2M6IEJqb3JuIEhlbGdhYXMgPGJoZWxnYWFzQGdvb2dsZS5jb20+CkNjOiBUaG9t
YXMgR2xlaXhuZXIgPHRnbHhAbGludXRyb25peC5kZT4KQ2M6IEJyaWplc2ggU2luZ2ggPGJyaWpl
c2guc2luZ2hAYW1kLmNvbT4KQ2M6ICJKw6lyw7RtZSBHbGlzc2UiIDxqZ2xpc3NlQHJlZGhhdC5j
b20+CkNjOiBCb3Jpc2xhdiBQZXRrb3YgPGJwQHN1c2UuZGU+CkNjOiBUb20gTGVuZGFja3kgPHRo
b21hcy5sZW5kYWNreUBhbWQuY29tPgpDYzogR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVna2hAbGlu
dXhmb3VuZGF0aW9uLm9yZz4KQ2M6IFlhb3dlaSBCYWkgPGJhaXlhb3dlaUBjbXNzLmNoaW5hbW9i
aWxlLmNvbT4KQ2M6IFdlaSBZYW5nIDxyaWNoYXJkLndlaXlhbmdAZ21haWwuY29tPgpDYzogZGV2
ZWxAbGludXhkcml2ZXJwcm9qZWN0Lm9yZwpDYzogbGludXgtaW5wdXRAdmdlci5rZXJuZWwub3Jn
CkNjOiBsaW51eC1udmRpbW1AbGlzdHMuMDEub3JnCkNjOiBkZXZpY2V0cmVlQHZnZXIua2VybmVs
Lm9yZwpDYzogbGludXgtcGNpQHZnZXIua2VybmVsLm9yZwotLS0KdjMtPnY0OgogIEZpeCBzZXZl
cmFsIGJ1Z3MgdGVzdCByb2JvdCByZXBvcnRlZC4gQW5kIGNoYW5nZSBwYXRjaCBsb2cuCgp2Mi0+
djM6CiAgUmVuYW1lIHJlc291cmNlIGZ1bmN0aW9ucyBmaXJzdF9jaGlsZCgpIGFuZCBzaWJsaW5n
KCkgdG8KICByZXNvdXJjZV9maXJzdF9jaGlscygpIGFuZCByZXNvdXJjZV9zaWJsaW5nKCkuIERh
biBzdWdnZXN0ZWQgdGhpcy4KCiAgTW92ZSByZXNvdXJjZV9maXJzdF9jaGlscygpIGFuZCByZXNv
dXJjZV9zaWJsaW5nKCkgdG8gbGludXgvaW9wb3J0LmgKICBhbmQgbWFrZSB0aGVtIGFzIGlubGlu
ZSBmdW5jdGlvbi4gUm9iIHN1Z2dlc3RlZCB0aGlzLiBBY2NvcmRpbmdseSBhZGQKICBsaW51eC9s
aXN0LmggaW5jbHVkaW5nIGluIGxpbnV4L2lvcG9ydC5oLCBwbGVhc2UgaGVscCByZXZpZXcgaWYg
dGhpcwogIGJyaW5nIGVmZmljaWVuY3kgZGVncmFkYXRpb24gb3IgY29kZSByZWR1bmRhbmN5LgoK
ICBUaGUgY2hhbmdlIG9uIHN0cnVjdCByZXNvdXJjZSB7fSBicmluZyB0d28gcG9pbnRlcnMgb2Yg
c2l6ZSBpbmNyZWFzZSwKICBtZW50aW9uIHRoaXMgaW4gZ2l0IGxvZyB0byBtYWtlIGl0IG1vcmUg
c3BlY2lmaWNhbGx5LCBSb2Igc3VnZ2VzdGVkCiAgdGhpcy4KCiBhcmNoL21pY3JvYmxhemUvcGNp
L3BjaS1jb21tb24uYyAgICAgICAgICAgIHwgIDMxICsrKy0tCiBhcmNoL3NwYXJjL2tlcm5lbC9p
b3BvcnQuYyAgICAgICAgICAgICAgICAgIHwgICAyICstCiBhcmNoL3h0ZW5zYS9pbmNsdWRlL2Fz
bS9wY2ktYnJpZGdlLmggICAgICAgIHwgICA0ICstCiBkcml2ZXJzL2Vpc2EvZWlzYS1idXMuYyAg
ICAgICAgICAgICAgICAgICAgIHwgICAyICsKIGRyaXZlcnMvZ3B1L2RybS9kcm1fbWVtb3J5LmMg
ICAgICAgICAgICAgICAgfCAgIDMgKy0KIGRyaXZlcnMvZ3B1L2RybS9nbWE1MDAvZ3R0LmMgICAg
ICAgICAgICAgICAgfCAgIDUgKy0KIGRyaXZlcnMvaHYvdm1idXNfZHJ2LmMgICAgICAgICAgICAg
ICAgICAgICAgfCAgNTIgKysrKy0tLS0KIGRyaXZlcnMvaW5wdXQvam95c3RpY2svaWZvcmNlL2lm
b3JjZS1tYWluLmMgfCAgIDQgKy0KIGRyaXZlcnMvbnZkaW1tL2U4MjAuYyAgICAgICAgICAgICAg
ICAgICAgICAgfCAgIDIgKy0KIGRyaXZlcnMvbnZkaW1tL25hbWVzcGFjZV9kZXZzLmMgICAgICAg
ICAgICAgfCAgIDYgKy0KIGRyaXZlcnMvbnZkaW1tL25kLmggICAgICAgICAgICAgICAgICAgICAg
ICAgfCAgIDUgKy0KIGRyaXZlcnMvb2YvYWRkcmVzcy5jICAgICAgICAgICAgICAgICAgICAgICAg
fCAgIDQgKy0KIGRyaXZlcnMvcGFyaXNjL2xiYV9wY2kuYyAgICAgICAgICAgICAgICAgICAgfCAg
IDQgKy0KIGRyaXZlcnMvcGNpL2hvc3Qvdm1kLmMgICAgICAgICAgICAgICAgICAgICAgfCAgIDgg
Ky0KIGRyaXZlcnMvcGNpL3Byb2JlLmMgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDIgKwog
ZHJpdmVycy9wY2kvc2V0dXAtYnVzLmMgICAgICAgICAgICAgICAgICAgICB8ICAgMiArLQogaW5j
bHVkZS9saW51eC9pb3BvcnQuaCAgICAgICAgICAgICAgICAgICAgICB8ICAxNyArKy0KIGtlcm5l
bC9yZXNvdXJjZS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxODEgKysrKysrKysrKysr
Ky0tLS0tLS0tLS0tLS0tLQogMTggZmlsZXMgY2hhbmdlZCwgMTcwIGluc2VydGlvbnMoKyksIDE2
NCBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUvcGNpL3BjaS1jb21t
b24uYyBiL2FyY2gvbWljcm9ibGF6ZS9wY2kvcGNpLWNvbW1vbi5jCmluZGV4IDE2MWY5NzU4YzYz
MS4uNTZkMTg5Y2I0YmU0IDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUvcGNpL3BjaS1jb21t
b24uYworKysgYi9hcmNoL21pY3JvYmxhemUvcGNpL3BjaS1jb21tb24uYwpAQCAtNTMzLDcgKzUz
Myw5IEBAIHZvaWQgcGNpX3Byb2Nlc3NfYnJpZGdlX09GX3JhbmdlcyhzdHJ1Y3QgcGNpX2NvbnRy
b2xsZXIgKmhvc2UsCiAJCQlyZXMtPmZsYWdzID0gcmFuZ2UuZmxhZ3M7CiAJCQlyZXMtPnN0YXJ0
ID0gcmFuZ2UuY3B1X2FkZHI7CiAJCQlyZXMtPmVuZCA9IHJhbmdlLmNwdV9hZGRyICsgcmFuZ2Uu
c2l6ZSAtIDE7Ci0JCQlyZXMtPnBhcmVudCA9IHJlcy0+Y2hpbGQgPSByZXMtPnNpYmxpbmcgPSBO
VUxMOworCQkJcmVzLT5wYXJlbnQgPSBOVUxMOworCQkJSU5JVF9MSVNUX0hFQUQoJnJlcy0+Y2hp
bGQpOworCQkJSU5JVF9MSVNUX0hFQUQoJnJlcy0+c2libGluZyk7CiAJCX0KIAl9CiAKQEAgLTYy
NSwyOCArNjI3LDMxIEBAIEVYUE9SVF9TWU1CT0wocGNpYmlvc19hZGRfZGV2aWNlKTsKIHN0YXRp
YyBpbnQgX19pbml0IHJlcGFyZW50X3Jlc291cmNlcyhzdHJ1Y3QgcmVzb3VyY2UgKnBhcmVudCwK
IAkJCQkgICAgIHN0cnVjdCByZXNvdXJjZSAqcmVzKQogewotCXN0cnVjdCByZXNvdXJjZSAqcCwg
KipwcDsKLQlzdHJ1Y3QgcmVzb3VyY2UgKipmaXJzdHBwID0gTlVMTDsKKwlzdHJ1Y3QgcmVzb3Vy
Y2UgKnAsICpmaXJzdCA9IE5VTEw7CiAKLQlmb3IgKHBwID0gJnBhcmVudC0+Y2hpbGQ7IChwID0g
KnBwKSAhPSBOVUxMOyBwcCA9ICZwLT5zaWJsaW5nKSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShw
LCAmcGFyZW50LT5jaGlsZCwgc2libGluZykgewogCQlpZiAocC0+ZW5kIDwgcmVzLT5zdGFydCkK
IAkJCWNvbnRpbnVlOwogCQlpZiAocmVzLT5lbmQgPCBwLT5zdGFydCkKIAkJCWJyZWFrOwogCQlp
ZiAocC0+c3RhcnQgPCByZXMtPnN0YXJ0IHx8IHAtPmVuZCA+IHJlcy0+ZW5kKQogCQkJcmV0dXJu
IC0xOwkvKiBub3QgY29tcGxldGVseSBjb250YWluZWQgKi8KLQkJaWYgKGZpcnN0cHAgPT0gTlVM
TCkKLQkJCWZpcnN0cHAgPSBwcDsKKwkJaWYgKGZpcnN0ID09IE5VTEwpCisJCQlmaXJzdCA9IHA7
CiAJfQotCWlmIChmaXJzdHBwID09IE5VTEwpCisJaWYgKGZpcnN0ID09IE5VTEwpCiAJCXJldHVy
biAtMTsJLyogZGlkbid0IGZpbmQgYW55IGNvbmZsaWN0aW5nIGVudHJpZXM/ICovCiAJcmVzLT5w
YXJlbnQgPSBwYXJlbnQ7Ci0JcmVzLT5jaGlsZCA9ICpmaXJzdHBwOwotCXJlcy0+c2libGluZyA9
ICpwcDsKLQkqZmlyc3RwcCA9IHJlczsKLQkqcHAgPSBOVUxMOwotCWZvciAocCA9IHJlcy0+Y2hp
bGQ7IHAgIT0gTlVMTDsgcCA9IHAtPnNpYmxpbmcpIHsKLQkJcC0+cGFyZW50ID0gcmVzOworCWxp
c3RfYWRkKCZyZXMtPnNpYmxpbmcsICZwLT5zaWJsaW5nLnByZXYpOworCUlOSVRfTElTVF9IRUFE
KCZyZXMtPmNoaWxkKTsKKworCS8qCisJICogRnJvbSBmaXJzdCB0byBwJ3MgcHJldmlvdXMgc2li
bGluZywgdGhleSBhbGwgZmFsbCBpbnRvCisJICogcmVzJ3MgcmVnaW9uLCBjaGFuZ2UgdGhlbSBh
cyByZXMncyBjaGlsZHJlbi4KKwkgKi8KKwlsaXN0X2N1dF9wb3NpdGlvbigmcmVzLT5jaGlsZCwg
Zmlyc3QtPnNpYmxpbmcucHJldiwgcmVzLT5zaWJsaW5nLnByZXYpOworCWxpc3RfZm9yX2VhY2hf
ZW50cnkocCwgJm5ldy0+Y2hpbGQsIHNpYmxpbmcpIHsKKyAgICAgICAgICAgICAgICBwLT5wYXJl
bnQgPSBuZXc7CiAJCXByX2RlYnVnKCJQQ0k6IFJlcGFyZW50ZWQgJXMgWyVsbHguLiVsbHhdIHVu
ZGVyICVzXG4iLAogCQkJIHAtPm5hbWUsCiAJCQkgKHVuc2lnbmVkIGxvbmcgbG9uZylwLT5zdGFy
dCwKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL2lvcG9ydC5jIGIvYXJjaC9zcGFyYy9r
ZXJuZWwvaW9wb3J0LmMKaW5kZXggM2JjZWY5Y2U3NGRmLi40ZTkxZmJiYmVkY2MgMTAwNjQ0Ci0t
LSBhL2FyY2gvc3BhcmMva2VybmVsL2lvcG9ydC5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL2lv
cG9ydC5jCkBAIC02NjksNyArNjY5LDcgQEAgc3RhdGljIGludCBzcGFyY19pb19wcm9jX3Nob3co
c3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQogCXN0cnVjdCByZXNvdXJjZSAqcm9vdCA9IG0t
PnByaXZhdGUsICpyOwogCWNvbnN0IGNoYXIgKm5tOwogCi0JZm9yIChyID0gcm9vdC0+Y2hpbGQ7
IHIgIT0gTlVMTDsgciA9IHItPnNpYmxpbmcpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHIsICZy
b290LT5jaGlsZCwgc2libGluZykgewogCQlpZiAoKG5tID0gci0+bmFtZSkgPT0gTlVMTCkgbm0g
PSAiPz8/IjsKIAkJc2VxX3ByaW50ZihtLCAiJTAxNmxseC0lMDE2bGx4OiAlc1xuIiwKIAkJCQko
dW5zaWduZWQgbG9uZyBsb25nKXItPnN0YXJ0LApkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvaW5j
bHVkZS9hc20vcGNpLWJyaWRnZS5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vcGNpLWJyaWRn
ZS5oCmluZGV4IDBiNjhjNzZlYzFlNi4uZjQ4N2IwNjgxN2RmIDEwMDY0NAotLS0gYS9hcmNoL3h0
ZW5zYS9pbmNsdWRlL2FzbS9wY2ktYnJpZGdlLmgKKysrIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9h
c20vcGNpLWJyaWRnZS5oCkBAIC03MSw4ICs3MSw4IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBwY2li
aW9zX2luaXRfcmVzb3VyY2Uoc3RydWN0IHJlc291cmNlICpyZXMsCiAJcmVzLT5mbGFncyA9IGZs
YWdzOwogCXJlcy0+bmFtZSA9IG5hbWU7CiAJcmVzLT5wYXJlbnQgPSBOVUxMOwotCXJlcy0+c2li
bGluZyA9IE5VTEw7Ci0JcmVzLT5jaGlsZCA9IE5VTEw7CisJSU5JVF9MSVNUX0hFQUQoJnJlcy0+
Y2hpbGQpOworCUlOSVRfTElTVF9IRUFEKCZyZXMtPnNpYmxpbmcpOwogfQogCiAKZGlmZiAtLWdp
dCBhL2RyaXZlcnMvZWlzYS9laXNhLWJ1cy5jIGIvZHJpdmVycy9laXNhL2Vpc2EtYnVzLmMKaW5k
ZXggMWU4MDYyZjZkYmZjLi5kYmE3OGY3NWZkMDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWlzYS9l
aXNhLWJ1cy5jCisrKyBiL2RyaXZlcnMvZWlzYS9laXNhLWJ1cy5jCkBAIC00MDgsNiArNDA4LDgg
QEAgc3RhdGljIHN0cnVjdCByZXNvdXJjZSBlaXNhX3Jvb3RfcmVzID0gewogCS5zdGFydCA9IDAs
CiAJLmVuZCAgID0gMHhmZmZmZmZmZiwKIAkuZmxhZ3MgPSBJT1JFU09VUkNFX0lPLAorCS5zaWJs
aW5nID0gTElTVF9IRUFEX0lOSVQoZWlzYV9yb290X3Jlcy5zaWJsaW5nKSwKKwkuY2hpbGQgID0g
TElTVF9IRUFEX0lOSVQoZWlzYV9yb290X3Jlcy5jaGlsZCksCiB9OwogCiBzdGF0aWMgaW50IGVp
c2FfYnVzX2NvdW50OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9tZW1vcnkuYyBi
L2RyaXZlcnMvZ3B1L2RybS9kcm1fbWVtb3J5LmMKaW5kZXggM2M1NDA0NDIxNGRiLi41M2UzMDBh
OTkzZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fbWVtb3J5LmMKKysrIGIvZHJp
dmVycy9ncHUvZHJtL2RybV9tZW1vcnkuYwpAQCAtMTU1LDkgKzE1NSw4IEBAIHU2NCBkcm1fZ2V0
X21heF9pb21lbSh2b2lkKQogCXN0cnVjdCByZXNvdXJjZSAqdG1wOwogCXJlc291cmNlX3NpemVf
dCBtYXhfaW9tZW0gPSAwOwogCi0JZm9yICh0bXAgPSBpb21lbV9yZXNvdXJjZS5jaGlsZDsgdG1w
OyB0bXAgPSB0bXAtPnNpYmxpbmcpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRtcCwgJmlvbWVt
X3Jlc291cmNlLmNoaWxkLCBzaWJsaW5nKQogCQltYXhfaW9tZW0gPSBtYXgobWF4X2lvbWVtLCAg
dG1wLT5lbmQpOwotCX0KIAogCXJldHVybiBtYXhfaW9tZW07CiB9CmRpZmYgLS1naXQgYS9kcml2
ZXJzL2dwdS9kcm0vZ21hNTAwL2d0dC5jIGIvZHJpdmVycy9ncHUvZHJtL2dtYTUwMC9ndHQuYwpp
bmRleCAzOTQ5YjA5OTA5MTYuLmFkZGQzYmMwMDlhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUv
ZHJtL2dtYTUwMC9ndHQuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZ21hNTAwL2d0dC5jCkBAIC01
NjUsNyArNTY1LDcgQEAgaW50IHBzYl9ndHRfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBp
bnQgcmVzdW1lKQogaW50IHBzYl9ndHRfcmVzdG9yZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQog
ewogCXN0cnVjdCBkcm1fcHNiX3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsK
LQlzdHJ1Y3QgcmVzb3VyY2UgKnIgPSBkZXZfcHJpdi0+Z3R0X21lbS0+Y2hpbGQ7CisJc3RydWN0
IHJlc291cmNlICpyOwogCXN0cnVjdCBndHRfcmFuZ2UgKnJhbmdlOwogCXVuc2lnbmVkIGludCBy
ZXN0b3JlZCA9IDAsIHRvdGFsID0gMCwgc2l6ZSA9IDA7CiAKQEAgLTU3MywxNCArNTczLDEzIEBA
IGludCBwc2JfZ3R0X3Jlc3RvcmUoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIAltdXRleF9sb2Nr
KCZkZXZfcHJpdi0+Z3R0X211dGV4KTsKIAlwc2JfZ3R0X2luaXQoZGV2LCAxKTsKIAotCXdoaWxl
IChyICE9IE5VTEwpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHIsICZkZXZfcHJpdi0+Z3R0X21l
bS0+Y2hpbGQsIHNpYmxpbmcpIHsKIAkJcmFuZ2UgPSBjb250YWluZXJfb2Yociwgc3RydWN0IGd0
dF9yYW5nZSwgcmVzb3VyY2UpOwogCQlpZiAocmFuZ2UtPnBhZ2VzKSB7CiAJCQlwc2JfZ3R0X2lu
c2VydChkZXYsIHJhbmdlLCAxKTsKIAkJCXNpemUgKz0gcmFuZ2UtPnJlc291cmNlLmVuZCAtIHJh
bmdlLT5yZXNvdXJjZS5zdGFydDsKIAkJCXJlc3RvcmVkKys7CiAJCX0KLQkJciA9IHItPnNpYmxp
bmc7CiAJCXRvdGFsKys7CiAJfQogCW11dGV4X3VubG9jaygmZGV2X3ByaXYtPmd0dF9tdXRleCk7
CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h2L3ZtYnVzX2Rydi5jIGIvZHJpdmVycy9odi92bWJ1c19k
cnYuYwppbmRleCBiMTBmZTI2YzQ4OTEuLmQ4N2VjNWExYmM0YyAxMDA2NDQKLS0tIGEvZHJpdmVy
cy9odi92bWJ1c19kcnYuYworKysgYi9kcml2ZXJzL2h2L3ZtYnVzX2Rydi5jCkBAIC0xNDEyLDkg
KzE0MTIsOCBAQCBzdGF0aWMgYWNwaV9zdGF0dXMgdm1idXNfd2Fsa19yZXNvdXJjZXMoc3RydWN0
IGFjcGlfcmVzb3VyY2UgKnJlcywgdm9pZCAqY3R4KQogewogCXJlc291cmNlX3NpemVfdCBzdGFy
dCA9IDA7CiAJcmVzb3VyY2Vfc2l6ZV90IGVuZCA9IDA7Ci0Jc3RydWN0IHJlc291cmNlICpuZXdf
cmVzOworCXN0cnVjdCByZXNvdXJjZSAqbmV3X3JlcywgKnRtcDsKIAlzdHJ1Y3QgcmVzb3VyY2Ug
KipvbGRfcmVzID0gJmh5cGVydl9tbWlvOwotCXN0cnVjdCByZXNvdXJjZSAqKnByZXZfcmVzID0g
TlVMTDsKIAogCXN3aXRjaCAocmVzLT50eXBlKSB7CiAKQEAgLTE0NjEsNDQgKzE0NjAsMzYgQEAg
c3RhdGljIGFjcGlfc3RhdHVzIHZtYnVzX3dhbGtfcmVzb3VyY2VzKHN0cnVjdCBhY3BpX3Jlc291
cmNlICpyZXMsIHZvaWQgKmN0eCkKIAkvKgogCSAqIElmIHR3byByYW5nZXMgYXJlIGFkamFjZW50
LCBtZXJnZSB0aGVtLgogCSAqLwotCWRvIHsKLQkJaWYgKCEqb2xkX3JlcykgewotCQkJKm9sZF9y
ZXMgPSBuZXdfcmVzOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoKCgqb2xkX3JlcyktPmVuZCAr
IDEpID09IG5ld19yZXMtPnN0YXJ0KSB7Ci0JCQkoKm9sZF9yZXMpLT5lbmQgPSBuZXdfcmVzLT5l
bmQ7CisJaWYgKCEqb2xkX3JlcykgeworCQkqb2xkX3JlcyA9IG5ld19yZXM7CisJCXJldHVybiBB
RV9PSzsKKwl9CisJdG1wID0gKm9sZF9yZXM7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9mcm9tKHRt
cCwgJnRtcC0+cGFyZW50LT5jaGlsZCwgc2libGluZykgeworCQlpZiAoKHRtcC0+ZW5kICsgMSkg
PT0gbmV3X3Jlcy0+c3RhcnQpIHsKKwkJCXRtcC0+ZW5kID0gbmV3X3Jlcy0+ZW5kOwogCQkJa2Zy
ZWUobmV3X3Jlcyk7CiAJCQlicmVhazsKIAkJfQogCi0JCWlmICgoKm9sZF9yZXMpLT5zdGFydCA9
PSBuZXdfcmVzLT5lbmQgKyAxKSB7Ci0JCQkoKm9sZF9yZXMpLT5zdGFydCA9IG5ld19yZXMtPnN0
YXJ0OworCQlpZiAodG1wLT5zdGFydCA9PSBuZXdfcmVzLT5lbmQgKyAxKSB7CisJCQl0bXAtPnN0
YXJ0ID0gbmV3X3Jlcy0+c3RhcnQ7CiAJCQlrZnJlZShuZXdfcmVzKTsKIAkJCWJyZWFrOwogCQl9
CiAKLQkJaWYgKCgqb2xkX3JlcyktPnN0YXJ0ID4gbmV3X3Jlcy0+ZW5kKSB7Ci0JCQluZXdfcmVz
LT5zaWJsaW5nID0gKm9sZF9yZXM7Ci0JCQlpZiAocHJldl9yZXMpCi0JCQkJKCpwcmV2X3Jlcykt
PnNpYmxpbmcgPSBuZXdfcmVzOwotCQkJKm9sZF9yZXMgPSBuZXdfcmVzOworCQlpZiAodG1wLT5z
dGFydCA+IG5ld19yZXMtPmVuZCkgeworCQkJbGlzdF9hZGQoJm5ld19yZXMtPnNpYmxpbmcsIHRt
cC0+c2libGluZy5wcmV2KTsKIAkJCWJyZWFrOwogCQl9Ci0KLQkJcHJldl9yZXMgPSBvbGRfcmVz
OwotCQlvbGRfcmVzID0gJigqb2xkX3JlcyktPnNpYmxpbmc7Ci0KLQl9IHdoaWxlICgxKTsKKwl9
CiAKIAlyZXR1cm4gQUVfT0s7CiB9CiAKIHN0YXRpYyBpbnQgdm1idXNfYWNwaV9yZW1vdmUoc3Ry
dWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7Ci0Jc3RydWN0IHJlc291cmNlICpjdXJfcmVzOwot
CXN0cnVjdCByZXNvdXJjZSAqbmV4dF9yZXM7CisJc3RydWN0IHJlc291cmNlICpyZXM7CiAKIAlp
ZiAoaHlwZXJ2X21taW8pIHsKIAkJaWYgKGZiX21taW8pIHsKQEAgLTE1MDcsMTAgKzE0OTgsOSBA
QCBzdGF0aWMgaW50IHZtYnVzX2FjcGlfcmVtb3ZlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNl
KQogCQkJZmJfbW1pbyA9IE5VTEw7CiAJCX0KIAotCQlmb3IgKGN1cl9yZXMgPSBoeXBlcnZfbW1p
bzsgY3VyX3JlczsgY3VyX3JlcyA9IG5leHRfcmVzKSB7Ci0JCQluZXh0X3JlcyA9IGN1cl9yZXMt
PnNpYmxpbmc7Ci0JCQlrZnJlZShjdXJfcmVzKTsKLQkJfQorCQlyZXMgPSBoeXBlcnZfbW1pbzsK
KwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9mcm9tKHJlcywgJnJlcy0+cGFyZW50LT5jaGlsZCwgc2li
bGluZykKKwkJCWtmcmVlKHJlcyk7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0xNTk2LDcgKzE1ODYs
OCBAQCBpbnQgdm1idXNfYWxsb2NhdGVfbW1pbyhzdHJ1Y3QgcmVzb3VyY2UgKipuZXcsIHN0cnVj
dCBodl9kZXZpY2UgKmRldmljZV9vYmosCiAJCX0KIAl9CiAKLQlmb3IgKGl0ZXIgPSBoeXBlcnZf
bW1pbzsgaXRlcjsgaXRlciA9IGl0ZXItPnNpYmxpbmcpIHsKKwlpdGVyID0gaHlwZXJ2X21taW87
CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9mcm9tKGl0ZXIsICZpdGVyLT5wYXJlbnQtPmNoaWxkLCBz
aWJsaW5nKSB7CiAJCWlmICgoaXRlci0+c3RhcnQgPj0gbWF4KSB8fCAoaXRlci0+ZW5kIDw9IG1p
bikpCiAJCQljb250aW51ZTsKIApAQCAtMTYzOSw3ICsxNjMwLDggQEAgdm9pZCB2bWJ1c19mcmVl
X21taW8ocmVzb3VyY2Vfc2l6ZV90IHN0YXJ0LCByZXNvdXJjZV9zaXplX3Qgc2l6ZSkKIAlzdHJ1
Y3QgcmVzb3VyY2UgKml0ZXI7CiAKIAlkb3duKCZoeXBlcnZfbW1pb19sb2NrKTsKLQlmb3IgKGl0
ZXIgPSBoeXBlcnZfbW1pbzsgaXRlcjsgaXRlciA9IGl0ZXItPnNpYmxpbmcpIHsKKwlpdGVyID0g
aHlwZXJ2X21taW87CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9mcm9tKGl0ZXIsICZpdGVyLT5wYXJl
bnQtPmNoaWxkLCBzaWJsaW5nKSB7CiAJCWlmICgoaXRlci0+c3RhcnQgPj0gc3RhcnQgKyBzaXpl
KSB8fCAoaXRlci0+ZW5kIDw9IHN0YXJ0KSkKIAkJCWNvbnRpbnVlOwogCmRpZmYgLS1naXQgYS9k
cml2ZXJzL2lucHV0L2pveXN0aWNrL2lmb3JjZS9pZm9yY2UtbWFpbi5jIGIvZHJpdmVycy9pbnB1
dC9qb3lzdGljay9pZm9yY2UvaWZvcmNlLW1haW4uYwppbmRleCBkYWVlYjRjN2UzYjAuLjVjMGJl
MjdiMzNmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9pZm9yY2UvaWZvcmNl
LW1haW4uYworKysgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2lmb3JjZS9pZm9yY2UtbWFpbi5j
CkBAIC0zMDUsOCArMzA1LDggQEAgaW50IGlmb3JjZV9pbml0X2RldmljZShzdHJ1Y3QgaWZvcmNl
ICppZm9yY2UpCiAJaWZvcmNlLT5kZXZpY2VfbWVtb3J5LmVuZCA9IDIwMDsKIAlpZm9yY2UtPmRl
dmljZV9tZW1vcnkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTTsKIAlpZm9yY2UtPmRldmljZV9tZW1v
cnkucGFyZW50ID0gTlVMTDsKLQlpZm9yY2UtPmRldmljZV9tZW1vcnkuY2hpbGQgPSBOVUxMOwot
CWlmb3JjZS0+ZGV2aWNlX21lbW9yeS5zaWJsaW5nID0gTlVMTDsKKwlJTklUX0xJU1RfSEVBRCgm
aWZvcmNlLT5kZXZpY2VfbWVtb3J5LmNoaWxkKTsKKwlJTklUX0xJU1RfSEVBRCgmaWZvcmNlLT5k
ZXZpY2VfbWVtb3J5LnNpYmxpbmcpOwogCiAvKgogICogV2FpdCB1bnRpbCBkZXZpY2UgcmVhZHkg
LSB1bnRpbCBpdCBzZW5kcyBpdHMgZmlyc3QgcmVzcG9uc2UuCmRpZmYgLS1naXQgYS9kcml2ZXJz
L252ZGltbS9lODIwLmMgYi9kcml2ZXJzL252ZGltbS9lODIwLmMKaW5kZXggNmY5YTZmZmQ3Y2Rl
Li41MTNlNjYxYmIwZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbnZkaW1tL2U4MjAuYworKysgYi9k
cml2ZXJzL252ZGltbS9lODIwLmMKQEAgLTUzLDcgKzUzLDcgQEAgc3RhdGljIGludCBlODIwX3Bt
ZW1fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIAkJZ290byBlcnI7CiAJcGxh
dGZvcm1fc2V0X2RydmRhdGEocGRldiwgbnZkaW1tX2J1cyk7CiAKLQlmb3IgKHAgPSBpb21lbV9y
ZXNvdXJjZS5jaGlsZDsgcCA7IHAgPSBwLT5zaWJsaW5nKSB7CisJbGlzdF9mb3JfZWFjaF9lbnRy
eShwLCAmaW9tZW1fcmVzb3VyY2UuY2hpbGQsIHNpYmxpbmcpIHsKIAkJc3RydWN0IG5kX3JlZ2lv
bl9kZXNjIG5kcl9kZXNjOwogCiAJCWlmIChwLT5kZXNjICE9IElPUkVTX0RFU0NfUEVSU0lTVEVO
VF9NRU1PUllfTEVHQUNZKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9udmRpbW0vbmFtZXNwYWNlX2Rl
dnMuYyBiL2RyaXZlcnMvbnZkaW1tL25hbWVzcGFjZV9kZXZzLmMKaW5kZXggMjhhZmRkNjY4OTA1
Li5mNTNkNDEwZDk5ODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbnZkaW1tL25hbWVzcGFjZV9kZXZz
LmMKKysrIGIvZHJpdmVycy9udmRpbW0vbmFtZXNwYWNlX2RldnMuYwpAQCAtNjM3LDcgKzYzNyw3
IEBAIHN0YXRpYyByZXNvdXJjZV9zaXplX3Qgc2Nhbl9hbGxvY2F0ZShzdHJ1Y3QgbmRfcmVnaW9u
ICpuZF9yZWdpb24sCiAgcmV0cnk6CiAJZmlyc3QgPSAwOwogCWZvcl9lYWNoX2RwYV9yZXNvdXJj
ZShuZGQsIHJlcykgewotCQlzdHJ1Y3QgcmVzb3VyY2UgKm5leHQgPSByZXMtPnNpYmxpbmcsICpu
ZXdfcmVzID0gTlVMTDsKKwkJc3RydWN0IHJlc291cmNlICpuZXh0ID0gcmVzb3VyY2Vfc2libGlu
ZyhyZXMpLCAqbmV3X3JlcyA9IE5VTEw7CiAJCXJlc291cmNlX3NpemVfdCBhbGxvY2F0ZSwgYXZh
aWxhYmxlID0gMDsKIAkJZW51bSBhbGxvY19sb2MgbG9jID0gQUxMT0NfRVJSOwogCQljb25zdCBj
aGFyICphY3Rpb247CkBAIC03NjMsNyArNzYzLDcgQEAgc3RhdGljIHJlc291cmNlX3NpemVfdCBz
Y2FuX2FsbG9jYXRlKHN0cnVjdCBuZF9yZWdpb24gKm5kX3JlZ2lvbiwKIAkgKiBhbiBpbml0aWFs
ICJwbWVtLXJlc2VydmUgcGFzcyIuICBPbmx5IGRvIGFuIGluaXRpYWwgQkxLIGFsbG9jYXRpb24K
IAkgKiB3aGVuIG5vbmUgb2YgdGhlIERQQSBzcGFjZSBpcyByZXNlcnZlZC4KIAkgKi8KLQlpZiAo
KGlzX3BtZW0gfHwgIW5kZC0+ZHBhLmNoaWxkKSAmJiBuID09IHRvX2FsbG9jYXRlKQorCWlmICgo
aXNfcG1lbSB8fCBsaXN0X2VtcHR5KCZuZGQtPmRwYS5jaGlsZCkpICYmIG4gPT0gdG9fYWxsb2Nh
dGUpCiAJCXJldHVybiBpbml0X2RwYV9hbGxvY2F0aW9uKGxhYmVsX2lkLCBuZF9yZWdpb24sIG5k
X21hcHBpbmcsIG4pOwogCXJldHVybiBuOwogfQpAQCAtNzc5LDcgKzc3OSw3IEBAIHN0YXRpYyBp
bnQgbWVyZ2VfZHBhKHN0cnVjdCBuZF9yZWdpb24gKm5kX3JlZ2lvbiwKICByZXRyeToKIAlmb3Jf
ZWFjaF9kcGFfcmVzb3VyY2UobmRkLCByZXMpIHsKIAkJaW50IHJjOwotCQlzdHJ1Y3QgcmVzb3Vy
Y2UgKm5leHQgPSByZXMtPnNpYmxpbmc7CisJCXN0cnVjdCByZXNvdXJjZSAqbmV4dCA9IHJlc291
cmNlX3NpYmxpbmcocmVzKTsKIAkJcmVzb3VyY2Vfc2l6ZV90IGVuZCA9IHJlcy0+c3RhcnQgKyBy
ZXNvdXJjZV9zaXplKHJlcyk7CiAKIAkJaWYgKCFuZXh0IHx8IHN0cmNtcChyZXMtPm5hbWUsIGxh
YmVsX2lkLT5pZCkgIT0gMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9udmRpbW0vbmQuaCBiL2RyaXZl
cnMvbnZkaW1tL25kLmgKaW5kZXggMzJlMDM2NGI0OGI5Li5kYTdkYTE1ZTAzZTcgMTAwNjQ0Ci0t
LSBhL2RyaXZlcnMvbnZkaW1tL25kLmgKKysrIGIvZHJpdmVycy9udmRpbW0vbmQuaApAQCAtMTAy
LDExICsxMDIsMTAgQEAgdW5zaWduZWQgc2l6ZW9mX25hbWVzcGFjZV9sYWJlbChzdHJ1Y3QgbnZk
aW1tX2RydmRhdGEgKm5kZCk7CiAJCSh1bnNpZ25lZCBsb25nIGxvbmcpIChyZXMgPyByZXMtPnN0
YXJ0IDogMCksICMjYXJnKQogCiAjZGVmaW5lIGZvcl9lYWNoX2RwYV9yZXNvdXJjZShuZGQsIHJl
cykgXAotCWZvciAocmVzID0gKG5kZCktPmRwYS5jaGlsZDsgcmVzOyByZXMgPSByZXMtPnNpYmxp
bmcpCisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZXMsICYobmRkKS0+ZHBhLmNoaWxkLCBzaWJsaW5n
KQogCiAjZGVmaW5lIGZvcl9lYWNoX2RwYV9yZXNvdXJjZV9zYWZlKG5kZCwgcmVzLCBuZXh0KSBc
Ci0JZm9yIChyZXMgPSAobmRkKS0+ZHBhLmNoaWxkLCBuZXh0ID0gcmVzID8gcmVzLT5zaWJsaW5n
IDogTlVMTDsgXAotCQkJcmVzOyByZXMgPSBuZXh0LCBuZXh0ID0gbmV4dCA/IG5leHQtPnNpYmxp
bmcgOiBOVUxMKQorCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyZXMsIG5leHQsICYobmRkKS0+
ZHBhLmNoaWxkLCBzaWJsaW5nKQogCiBzdHJ1Y3QgbmRfcGVyY3B1X2xhbmUgewogCWludCBjb3Vu
dDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvb2YvYWRkcmVzcy5jIGIvZHJpdmVycy9vZi9hZGRyZXNz
LmMKaW5kZXggNTMzNDk5MTJhYzc1Li5lMmUyNTcxOWFiNTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMv
b2YvYWRkcmVzcy5jCisrKyBiL2RyaXZlcnMvb2YvYWRkcmVzcy5jCkBAIC0zMzAsNyArMzMwLDkg
QEAgaW50IG9mX3BjaV9yYW5nZV90b19yZXNvdXJjZShzdHJ1Y3Qgb2ZfcGNpX3JhbmdlICpyYW5n
ZSwKIHsKIAlpbnQgZXJyOwogCXJlcy0+ZmxhZ3MgPSByYW5nZS0+ZmxhZ3M7Ci0JcmVzLT5wYXJl
bnQgPSByZXMtPmNoaWxkID0gcmVzLT5zaWJsaW5nID0gTlVMTDsKKwlyZXMtPnBhcmVudCA9IE5V
TEw7CisJSU5JVF9MSVNUX0hFQUQoJnJlcy0+Y2hpbGQpOworCUlOSVRfTElTVF9IRUFEKCZyZXMt
PnNpYmxpbmcpOwogCXJlcy0+bmFtZSA9IG5wLT5mdWxsX25hbWU7CiAKIAlpZiAocmVzLT5mbGFn
cyAmIElPUkVTT1VSQ0VfSU8pIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGFyaXNjL2xiYV9wY2ku
YyBiL2RyaXZlcnMvcGFyaXNjL2xiYV9wY2kuYwppbmRleCA2OWJkOTg0MjFlYjEuLjc0ODJiZGZk
MTk1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wYXJpc2MvbGJhX3BjaS5jCisrKyBiL2RyaXZlcnMv
cGFyaXNjL2xiYV9wY2kuYwpAQCAtMTcwLDggKzE3MCw4IEBAIGxiYV9kdW1wX3JlcyhzdHJ1Y3Qg
cmVzb3VyY2UgKnIsIGludCBkKQogCWZvciAoaSA9IGQ7IGkgOyAtLWkpIHByaW50aygiICIpOwog
CXByaW50ayhLRVJOX0RFQlVHICIlcCBbJWx4LCVseF0vJWx4XG4iLCByLAogCQkobG9uZylyLT5z
dGFydCwgKGxvbmcpci0+ZW5kLCByLT5mbGFncyk7Ci0JbGJhX2R1bXBfcmVzKHItPmNoaWxkLCBk
KzIpOwotCWxiYV9kdW1wX3JlcyhyLT5zaWJsaW5nLCBkKTsKKwlsYmFfZHVtcF9yZXMocmVzb3Vy
Y2VfZmlyc3RfY2hpbGQoJnItPmNoaWxkKSwgZCsyKTsKKwlsYmFfZHVtcF9yZXMocmVzb3VyY2Vf
c2libGluZyhyKSwgZCk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG9zdC92bWQu
YyBiL2RyaXZlcnMvcGNpL2hvc3Qvdm1kLmMKaW5kZXggOTMwYThmYTA4YmQ2Li5jMzAwMGFmOTAz
ZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvc3Qvdm1kLmMKKysrIGIvZHJpdmVycy9wY2kv
aG9zdC92bWQuYwpAQCAtNTIwLDE0ICs1MjAsMTQgQEAgc3RhdGljIHN0cnVjdCBwY2lfb3BzIHZt
ZF9vcHMgPSB7CiAKIHN0YXRpYyB2b2lkIHZtZF9hdHRhY2hfcmVzb3VyY2VzKHN0cnVjdCB2bWRf
ZGV2ICp2bWQpCiB7Ci0Jdm1kLT5kZXYtPnJlc291cmNlW1ZNRF9NRU1CQVIxXS5jaGlsZCA9ICZ2
bWQtPnJlc291cmNlc1sxXTsKLQl2bWQtPmRldi0+cmVzb3VyY2VbVk1EX01FTUJBUjJdLmNoaWxk
ID0gJnZtZC0+cmVzb3VyY2VzWzJdOworCWxpc3RfYWRkKCZ2bWQtPnJlc291cmNlc1sxXS5zaWJs
aW5nLCAmdm1kLT5kZXYtPnJlc291cmNlW1ZNRF9NRU1CQVIxXS5jaGlsZCk7CisJbGlzdF9hZGQo
JnZtZC0+cmVzb3VyY2VzWzJdLnNpYmxpbmcsICZ2bWQtPmRldi0+cmVzb3VyY2VbVk1EX01FTUJB
UjJdLmNoaWxkKTsKIH0KIAogc3RhdGljIHZvaWQgdm1kX2RldGFjaF9yZXNvdXJjZXMoc3RydWN0
IHZtZF9kZXYgKnZtZCkKIHsKLQl2bWQtPmRldi0+cmVzb3VyY2VbVk1EX01FTUJBUjFdLmNoaWxk
ID0gTlVMTDsKLQl2bWQtPmRldi0+cmVzb3VyY2VbVk1EX01FTUJBUjJdLmNoaWxkID0gTlVMTDsK
KwlJTklUX0xJU1RfSEVBRCgmdm1kLT5kZXYtPnJlc291cmNlW1ZNRF9NRU1CQVIxXS5jaGlsZCk7
CisJSU5JVF9MSVNUX0hFQUQoJnZtZC0+ZGV2LT5yZXNvdXJjZVtWTURfTUVNQkFSMl0uY2hpbGQp
OwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcHJvYmUuYyBiL2RyaXZlcnMvcGNp
L3Byb2JlLmMKaW5kZXggYWM5MWI2ZmQwYmNkLi5kMTYyYzc3YmVjMjkgMTAwNjQ0Ci0tLSBhL2Ry
aXZlcnMvcGNpL3Byb2JlLmMKKysrIGIvZHJpdmVycy9wY2kvcHJvYmUuYwpAQCAtNTksNiArNTks
OCBAQCBzdGF0aWMgc3RydWN0IHJlc291cmNlICpnZXRfcGNpX2RvbWFpbl9idXNuX3JlcyhpbnQg
ZG9tYWluX25yKQogCXItPnJlcy5zdGFydCA9IDA7CiAJci0+cmVzLmVuZCA9IDB4ZmY7CiAJci0+
cmVzLmZsYWdzID0gSU9SRVNPVVJDRV9CVVMgfCBJT1JFU09VUkNFX1BDSV9GSVhFRDsKKwlJTklU
X0xJU1RfSEVBRCgmci0+cmVzLmNoaWxkKTsKKwlJTklUX0xJU1RfSEVBRCgmci0+cmVzLnNpYmxp
bmcpOwogCiAJbGlzdF9hZGRfdGFpbCgmci0+bGlzdCwgJnBjaV9kb21haW5fYnVzbl9yZXNfbGlz
dCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3NldHVwLWJ1cy5jIGIvZHJpdmVycy9wY2kv
c2V0dXAtYnVzLmMKaW5kZXggMDcyNzg0ZjU1ZWE1Li4wZDVlMzAwMDRjYTYgMTAwNjQ0Ci0tLSBh
L2RyaXZlcnMvcGNpL3NldHVwLWJ1cy5jCisrKyBiL2RyaXZlcnMvcGNpL3NldHVwLWJ1cy5jCkBA
IC0yMTA3LDcgKzIxMDcsNyBAQCBpbnQgcGNpX3JlYXNzaWduX2JyaWRnZV9yZXNvdXJjZXMoc3Ry
dWN0IHBjaV9kZXYgKmJyaWRnZSwgdW5zaWduZWQgbG9uZyB0eXBlKQogCQkJCWNvbnRpbnVlOwog
CiAJCQkvKiBJZ25vcmUgQkFScyB3aGljaCBhcmUgc3RpbGwgaW4gdXNlICovCi0JCQlpZiAocmVz
LT5jaGlsZCkKKwkJCWlmICghbGlzdF9lbXB0eSgmcmVzLT5jaGlsZCkpCiAJCQkJY29udGludWU7
CiAKIAkJCXJldCA9IGFkZF90b19saXN0KCZzYXZlZCwgYnJpZGdlLCByZXMsIDAsIDApOwpkaWZm
IC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pb3BvcnQuaCBiL2luY2x1ZGUvbGludXgvaW9wb3J0LmgK
aW5kZXggZGEwZWJhZWMyNWYwLi4yMjVkMTNkMzUwMGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGlu
dXgvaW9wb3J0LmgKKysrIGIvaW5jbHVkZS9saW51eC9pb3BvcnQuaApAQCAtMTIsNiArMTIsNyBA
QAogI2lmbmRlZiBfX0FTU0VNQkxZX18KICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2lu
Y2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogLyoKICAqIFJl
c291cmNlcyBhcmUgdHJlZS1saWtlLCBhbGxvd2luZwogICogbmVzdGluZyBldGMuLgpAQCAtMjIs
NyArMjMsOCBAQCBzdHJ1Y3QgcmVzb3VyY2UgewogCWNvbnN0IGNoYXIgKm5hbWU7CiAJdW5zaWdu
ZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBsb25nIGRlc2M7Ci0Jc3RydWN0IHJlc291cmNlICpw
YXJlbnQsICpzaWJsaW5nLCAqY2hpbGQ7CisJc3RydWN0IGxpc3RfaGVhZCBjaGlsZCwgc2libGlu
ZzsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnBhcmVudDsKIH07CiAKIC8qCkBAIC0yMTUsNyArMjE3LDYg
QEAgc3RhdGljIGlubGluZSBib29sIHJlc291cmNlX2NvbnRhaW5zKHN0cnVjdCByZXNvdXJjZSAq
cjEsIHN0cnVjdCByZXNvdXJjZSAqcjIpCiAJcmV0dXJuIHIxLT5zdGFydCA8PSByMi0+c3RhcnQg
JiYgcjEtPmVuZCA+PSByMi0+ZW5kOwogfQogCi0KIC8qIENvbnZlbmllbmNlIHNob3J0aGFuZCB3
aXRoIGFsbG9jYXRpb24gKi8KICNkZWZpbmUgcmVxdWVzdF9yZWdpb24oc3RhcnQsbixuYW1lKQkJ
X19yZXF1ZXN0X3JlZ2lvbigmaW9wb3J0X3Jlc291cmNlLCAoc3RhcnQpLCAobiksIChuYW1lKSwg
MCkKICNkZWZpbmUgcmVxdWVzdF9tdXhlZF9yZWdpb24oc3RhcnQsbixuYW1lKQlfX3JlcXVlc3Rf
cmVnaW9uKCZpb3BvcnRfcmVzb3VyY2UsIChzdGFydCksIChuKSwgKG5hbWUpLCBJT1JFU09VUkNF
X01VWEVEKQpAQCAtMjg2LDYgKzI4NywxOCBAQCBzdGF0aWMgaW5saW5lIGJvb2wgcmVzb3VyY2Vf
b3ZlcmxhcHMoc3RydWN0IHJlc291cmNlICpyMSwgc3RydWN0IHJlc291cmNlICpyMikKICAgICAg
ICByZXR1cm4gKHIxLT5zdGFydCA8PSByMi0+ZW5kICYmIHIxLT5lbmQgPj0gcjItPnN0YXJ0KTsK
IH0KIAorc3RhdGljIGlubGluZSBzdHJ1Y3QgcmVzb3VyY2UgKnJlc291cmNlX3NpYmxpbmcoc3Ry
dWN0IHJlc291cmNlICpyZXMpCit7CisJaWYgKHJlcy0+cGFyZW50ICYmICFsaXN0X2lzX2xhc3Qo
JnJlcy0+c2libGluZywgJnJlcy0+cGFyZW50LT5jaGlsZCkpCisJCXJldHVybiBsaXN0X25leHRf
ZW50cnkocmVzLCBzaWJsaW5nKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGlubGluZSBz
dHJ1Y3QgcmVzb3VyY2UgKnJlc291cmNlX2ZpcnN0X2NoaWxkKHN0cnVjdCBsaXN0X2hlYWQgKmhl
YWQpCit7CisJcmV0dXJuIGxpc3RfZmlyc3RfZW50cnlfb3JfbnVsbChoZWFkLCBzdHJ1Y3QgcmVz
b3VyY2UsIHNpYmxpbmcpOworfQorCiAKICNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KICNlbmRp
ZgkvKiBfTElOVVhfSU9QT1JUX0ggKi8KZGlmZiAtLWdpdCBhL2tlcm5lbC9yZXNvdXJjZS5jIGIv
a2VybmVsL3Jlc291cmNlLmMKaW5kZXggMmFmNmMwMzg1OGI5Li40ZjU2MDk5MWMxMzAgMTAwNjQ0
Ci0tLSBhL2tlcm5lbC9yZXNvdXJjZS5jCisrKyBiL2tlcm5lbC9yZXNvdXJjZS5jCkBAIC0zMSw2
ICszMSw4IEBAIHN0cnVjdCByZXNvdXJjZSBpb3BvcnRfcmVzb3VyY2UgPSB7CiAJLnN0YXJ0CT0g
MCwKIAkuZW5kCT0gSU9fU1BBQ0VfTElNSVQsCiAJLmZsYWdzCT0gSU9SRVNPVVJDRV9JTywKKwku
c2libGluZyA9IExJU1RfSEVBRF9JTklUKGlvcG9ydF9yZXNvdXJjZS5zaWJsaW5nKSwKKwkuY2hp
bGQgID0gTElTVF9IRUFEX0lOSVQoaW9wb3J0X3Jlc291cmNlLmNoaWxkKSwKIH07CiBFWFBPUlRf
U1lNQk9MKGlvcG9ydF9yZXNvdXJjZSk7CiAKQEAgLTM5LDYgKzQxLDggQEAgc3RydWN0IHJlc291
cmNlIGlvbWVtX3Jlc291cmNlID0gewogCS5zdGFydAk9IDAsCiAJLmVuZAk9IC0xLAogCS5mbGFn
cwk9IElPUkVTT1VSQ0VfTUVNLAorCS5zaWJsaW5nID0gTElTVF9IRUFEX0lOSVQoaW9tZW1fcmVz
b3VyY2Uuc2libGluZyksCisJLmNoaWxkICA9IExJU1RfSEVBRF9JTklUKGlvbWVtX3Jlc291cmNl
LmNoaWxkKSwKIH07CiBFWFBPUlRfU1lNQk9MKGlvbWVtX3Jlc291cmNlKTsKIApAQCAtNTcsMjAg
KzYxLDIwIEBAIHN0YXRpYyBERUZJTkVfUldMT0NLKHJlc291cmNlX2xvY2spOwogICogYnkgYm9v
dCBtZW0gYWZ0ZXIgdGhlIHN5c3RlbSBpcyB1cC4gU28gZm9yIHJldXNpbmcgdGhlIHJlc291cmNl
IGVudHJ5CiAgKiB3ZSBuZWVkIHRvIHJlbWVtYmVyIHRoZSByZXNvdXJjZS4KICAqLwotc3RhdGlj
IHN0cnVjdCByZXNvdXJjZSAqYm9vdG1lbV9yZXNvdXJjZV9mcmVlOworc3RhdGljIHN0cnVjdCBs
aXN0X2hlYWQgYm9vdG1lbV9yZXNvdXJjZV9mcmVlID0gTElTVF9IRUFEX0lOSVQoYm9vdG1lbV9y
ZXNvdXJjZV9mcmVlKTsKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soYm9vdG1lbV9yZXNvdXJjZV9s
b2NrKTsKIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSAqbmV4dF9yZXNvdXJjZShzdHJ1Y3QgcmVz
b3VyY2UgKnAsIGJvb2wgc2libGluZ19vbmx5KQogewogCS8qIENhbGxlciB3YW50cyB0byB0cmF2
ZXJzZSB0aHJvdWdoIHNpYmxpbmdzIG9ubHkgKi8KIAlpZiAoc2libGluZ19vbmx5KQotCQlyZXR1
cm4gcC0+c2libGluZzsKKwkJcmV0dXJuIHJlc291cmNlX3NpYmxpbmcocCk7CiAKLQlpZiAocC0+
Y2hpbGQpCi0JCXJldHVybiBwLT5jaGlsZDsKLQl3aGlsZSAoIXAtPnNpYmxpbmcgJiYgcC0+cGFy
ZW50KQorCWlmICghbGlzdF9lbXB0eSgmcC0+Y2hpbGQpKQorCQlyZXR1cm4gcmVzb3VyY2VfZmly
c3RfY2hpbGQoJnAtPmNoaWxkKTsKKwl3aGlsZSAoIXJlc291cmNlX3NpYmxpbmcocCkgJiYgcC0+
cGFyZW50KQogCQlwID0gcC0+cGFyZW50OwotCXJldHVybiBwLT5zaWJsaW5nOworCXJldHVybiBy
ZXNvdXJjZV9zaWJsaW5nKHApOwogfQogCiBzdGF0aWMgdm9pZCAqcl9uZXh0KHN0cnVjdCBzZXFf
ZmlsZSAqbSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCkBAIC05MCw3ICs5NCw3IEBAIHN0YXRpYyB2
b2lkICpyX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqbSwgbG9mZl90ICpwb3MpCiAJc3RydWN0IHJl
c291cmNlICpwID0gbS0+cHJpdmF0ZTsKIAlsb2ZmX3QgbCA9IDA7CiAJcmVhZF9sb2NrKCZyZXNv
dXJjZV9sb2NrKTsKLQlmb3IgKHAgPSBwLT5jaGlsZDsgcCAmJiBsIDwgKnBvczsgcCA9IHJfbmV4
dChtLCBwLCAmbCkpCisJZm9yIChwID0gcmVzb3VyY2VfZmlyc3RfY2hpbGQoJnAtPmNoaWxkKTsg
cCAmJiBsIDwgKnBvczsgcCA9IHJfbmV4dChtLCBwLCAmbCkpCiAJCTsKIAlyZXR1cm4gcDsKIH0K
QEAgLTE4Niw4ICsxOTAsNyBAQCBzdGF0aWMgdm9pZCBmcmVlX3Jlc291cmNlKHN0cnVjdCByZXNv
dXJjZSAqcmVzKQogCiAJaWYgKCFQYWdlU2xhYih2aXJ0X3RvX2hlYWRfcGFnZShyZXMpKSkgewog
CQlzcGluX2xvY2soJmJvb3RtZW1fcmVzb3VyY2VfbG9jayk7Ci0JCXJlcy0+c2libGluZyA9IGJv
b3RtZW1fcmVzb3VyY2VfZnJlZTsKLQkJYm9vdG1lbV9yZXNvdXJjZV9mcmVlID0gcmVzOworCQls
aXN0X2FkZCgmcmVzLT5zaWJsaW5nLCAmYm9vdG1lbV9yZXNvdXJjZV9mcmVlKTsKIAkJc3Bpbl91
bmxvY2soJmJvb3RtZW1fcmVzb3VyY2VfbG9jayk7CiAJfSBlbHNlIHsKIAkJa2ZyZWUocmVzKTsK
QEAgLTE5OSwxMCArMjAyLDkgQEAgc3RhdGljIHN0cnVjdCByZXNvdXJjZSAqYWxsb2NfcmVzb3Vy
Y2UoZ2ZwX3QgZmxhZ3MpCiAJc3RydWN0IHJlc291cmNlICpyZXMgPSBOVUxMOwogCiAJc3Bpbl9s
b2NrKCZib290bWVtX3Jlc291cmNlX2xvY2spOwotCWlmIChib290bWVtX3Jlc291cmNlX2ZyZWUp
IHsKLQkJcmVzID0gYm9vdG1lbV9yZXNvdXJjZV9mcmVlOwotCQlib290bWVtX3Jlc291cmNlX2Zy
ZWUgPSByZXMtPnNpYmxpbmc7Ci0JfQorCXJlcyA9IHJlc291cmNlX2ZpcnN0X2NoaWxkKCZib290
bWVtX3Jlc291cmNlX2ZyZWUpOworCWlmIChyZXMpCisJCWxpc3RfZGVsKCZyZXMtPnNpYmxpbmcp
OwogCXNwaW5fdW5sb2NrKCZib290bWVtX3Jlc291cmNlX2xvY2spOwogCiAJaWYgKHJlcykKQEAg
LTIxMCw2ICsyMTIsOCBAQCBzdGF0aWMgc3RydWN0IHJlc291cmNlICphbGxvY19yZXNvdXJjZShn
ZnBfdCBmbGFncykKIAllbHNlCiAJCXJlcyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCByZXNvdXJj
ZSksIGZsYWdzKTsKIAorCUlOSVRfTElTVF9IRUFEKCZyZXMtPmNoaWxkKTsKKwlJTklUX0xJU1Rf
SEVBRCgmcmVzLT5zaWJsaW5nKTsKIAlyZXR1cm4gcmVzOwogfQogCkBAIC0yMTgsNyArMjIyLDcg
QEAgc3RhdGljIHN0cnVjdCByZXNvdXJjZSAqIF9fcmVxdWVzdF9yZXNvdXJjZShzdHJ1Y3QgcmVz
b3VyY2UgKnJvb3QsIHN0cnVjdCByZXNvdXIKIHsKIAlyZXNvdXJjZV9zaXplX3Qgc3RhcnQgPSBu
ZXctPnN0YXJ0OwogCXJlc291cmNlX3NpemVfdCBlbmQgPSBuZXctPmVuZDsKLQlzdHJ1Y3QgcmVz
b3VyY2UgKnRtcCwgKipwOworCXN0cnVjdCByZXNvdXJjZSAqdG1wOwogCiAJaWYgKGVuZCA8IHN0
YXJ0KQogCQlyZXR1cm4gcm9vdDsKQEAgLTIyNiw2NCArMjMwLDYyIEBAIHN0YXRpYyBzdHJ1Y3Qg
cmVzb3VyY2UgKiBfX3JlcXVlc3RfcmVzb3VyY2Uoc3RydWN0IHJlc291cmNlICpyb290LCBzdHJ1
Y3QgcmVzb3VyCiAJCXJldHVybiByb290OwogCWlmIChlbmQgPiByb290LT5lbmQpCiAJCXJldHVy
biByb290OwotCXAgPSAmcm9vdC0+Y2hpbGQ7Ci0JZm9yICg7OykgewotCQl0bXAgPSAqcDsKLQkJ
aWYgKCF0bXAgfHwgdG1wLT5zdGFydCA+IGVuZCkgewotCQkJbmV3LT5zaWJsaW5nID0gdG1wOwot
CQkJKnAgPSBuZXc7CisKKwlpZiAobGlzdF9lbXB0eSgmcm9vdC0+Y2hpbGQpKSB7CisJCWxpc3Rf
YWRkKCZuZXctPnNpYmxpbmcsICZyb290LT5jaGlsZCk7CisJCW5ldy0+cGFyZW50ID0gcm9vdDsK
KwkJSU5JVF9MSVNUX0hFQUQoJm5ldy0+Y2hpbGQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwls
aXN0X2Zvcl9lYWNoX2VudHJ5KHRtcCwgJnJvb3QtPmNoaWxkLCBzaWJsaW5nKSB7CisJCWlmICh0
bXAtPnN0YXJ0ID4gZW5kKSB7CisJCQlsaXN0X2FkZCgmbmV3LT5zaWJsaW5nLCB0bXAtPnNpYmxp
bmcucHJldik7CiAJCQluZXctPnBhcmVudCA9IHJvb3Q7CisJCQlJTklUX0xJU1RfSEVBRCgmbmV3
LT5jaGlsZCk7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfQotCQlwID0gJnRtcC0+c2libGluZzsKIAkJ
aWYgKHRtcC0+ZW5kIDwgc3RhcnQpCiAJCQljb250aW51ZTsKIAkJcmV0dXJuIHRtcDsKIAl9CisK
KwlsaXN0X2FkZF90YWlsKCZuZXctPnNpYmxpbmcsICZyb290LT5jaGlsZCk7CisJbmV3LT5wYXJl
bnQgPSByb290OworCUlOSVRfTElTVF9IRUFEKCZuZXctPmNoaWxkKTsKKwlyZXR1cm4gTlVMTDsK
IH0KIAogc3RhdGljIGludCBfX3JlbGVhc2VfcmVzb3VyY2Uoc3RydWN0IHJlc291cmNlICpvbGQs
IGJvb2wgcmVsZWFzZV9jaGlsZCkKIHsKLQlzdHJ1Y3QgcmVzb3VyY2UgKnRtcCwgKipwLCAqY2hk
OworCXN0cnVjdCByZXNvdXJjZSAqdG1wLCAqbmV4dCwgKmNoZDsKIAotCXAgPSAmb2xkLT5wYXJl
bnQtPmNoaWxkOwotCWZvciAoOzspIHsKLQkJdG1wID0gKnA7Ci0JCWlmICghdG1wKQotCQkJYnJl
YWs7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHRtcCwgbmV4dCwgJm9sZC0+cGFyZW50LT5j
aGlsZCwgc2libGluZykgewogCQlpZiAodG1wID09IG9sZCkgewotCQkJaWYgKHJlbGVhc2VfY2hp
bGQgfHwgISh0bXAtPmNoaWxkKSkgewotCQkJCSpwID0gdG1wLT5zaWJsaW5nOworCQkJaWYgKHJl
bGVhc2VfY2hpbGQgfHwgbGlzdF9lbXB0eSgmdG1wLT5jaGlsZCkpIHsKKwkJCQlsaXN0X2RlbCgm
dG1wLT5zaWJsaW5nKTsKIAkJCX0gZWxzZSB7Ci0JCQkJZm9yIChjaGQgPSB0bXAtPmNoaWxkOzsg
Y2hkID0gY2hkLT5zaWJsaW5nKSB7CisJCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShjaGQsICZ0bXAt
PmNoaWxkLCBzaWJsaW5nKQogCQkJCQljaGQtPnBhcmVudCA9IHRtcC0+cGFyZW50OwotCQkJCQlp
ZiAoIShjaGQtPnNpYmxpbmcpKQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCSpwID0gdG1wLT5j
aGlsZDsKLQkJCQljaGQtPnNpYmxpbmcgPSB0bXAtPnNpYmxpbmc7CisJCQkJbGlzdF9zcGxpY2Uo
JnRtcC0+Y2hpbGQsIHRtcC0+c2libGluZy5wcmV2KTsKKwkJCQlsaXN0X2RlbCgmdG1wLT5zaWJs
aW5nKTsKIAkJCX0KKwogCQkJb2xkLT5wYXJlbnQgPSBOVUxMOwogCQkJcmV0dXJuIDA7CiAJCX0K
LQkJcCA9ICZ0bXAtPnNpYmxpbmc7CiAJfQogCXJldHVybiAtRUlOVkFMOwogfQogCiBzdGF0aWMg
dm9pZCBfX3JlbGVhc2VfY2hpbGRfcmVzb3VyY2VzKHN0cnVjdCByZXNvdXJjZSAqcikKIHsKLQlz
dHJ1Y3QgcmVzb3VyY2UgKnRtcCwgKnA7CisJc3RydWN0IHJlc291cmNlICp0bXAsICpuZXh0Owog
CXJlc291cmNlX3NpemVfdCBzaXplOwogCi0JcCA9IHItPmNoaWxkOwotCXItPmNoaWxkID0gTlVM
TDsKLQl3aGlsZSAocCkgewotCQl0bXAgPSBwOwotCQlwID0gcC0+c2libGluZzsKLQorCWxpc3Rf
Zm9yX2VhY2hfZW50cnlfc2FmZSh0bXAsIG5leHQsICZyLT5jaGlsZCwgc2libGluZykgewogCQl0
bXAtPnBhcmVudCA9IE5VTEw7Ci0JCXRtcC0+c2libGluZyA9IE5VTEw7CisJCUlOSVRfTElTVF9I
RUFEKCZ0bXAtPnNpYmxpbmcpOwogCQlfX3JlbGVhc2VfY2hpbGRfcmVzb3VyY2VzKHRtcCk7CiAK
IAkJcHJpbnRrKEtFUk5fREVCVUcgInJlbGVhc2UgY2hpbGQgcmVzb3VyY2UgJXBSXG4iLCB0bXAp
OwpAQCAtMjkyLDYgKzI5NCw4IEBAIHN0YXRpYyB2b2lkIF9fcmVsZWFzZV9jaGlsZF9yZXNvdXJj
ZXMoc3RydWN0IHJlc291cmNlICpyKQogCQl0bXAtPnN0YXJ0ID0gMDsKIAkJdG1wLT5lbmQgPSBz
aXplIC0gMTsKIAl9CisKKwlJTklUX0xJU1RfSEVBRCgmdG1wLT5jaGlsZCk7CiB9CiAKIHZvaWQg
cmVsZWFzZV9jaGlsZF9yZXNvdXJjZXMoc3RydWN0IHJlc291cmNlICpyKQpAQCAtMzc2LDcgKzM4
MCw4IEBAIHN0YXRpYyBpbnQgZmluZF9uZXh0X2lvbWVtX3JlcyhzdHJ1Y3QgcmVzb3VyY2UgKnJl
cywgdW5zaWduZWQgbG9uZyBkZXNjLAogCiAJcmVhZF9sb2NrKCZyZXNvdXJjZV9sb2NrKTsKIAot
CWZvciAocCA9IGlvbWVtX3Jlc291cmNlLmNoaWxkOyBwOyBwID0gbmV4dF9yZXNvdXJjZShwLCBz
aWJsaW5nX29ubHkpKSB7CisJZm9yIChwID0gcmVzb3VyY2VfZmlyc3RfY2hpbGQoJmlvbWVtX3Jl
c291cmNlLmNoaWxkKTsgcDsKKwkJCXAgPSBuZXh0X3Jlc291cmNlKHAsIHNpYmxpbmdfb25seSkp
IHsKIAkJaWYgKChwLT5mbGFncyAmIHJlcy0+ZmxhZ3MpICE9IHJlcy0+ZmxhZ3MpCiAJCQljb250
aW51ZTsKIAkJaWYgKChkZXNjICE9IElPUkVTX0RFU0NfTk9ORSkgJiYgKGRlc2MgIT0gcC0+ZGVz
YykpCkBAIC01NjQsNyArNTY5LDcgQEAgaW50IHJlZ2lvbl9pbnRlcnNlY3RzKHJlc291cmNlX3Np
emVfdCBzdGFydCwgc2l6ZV90IHNpemUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCiAJc3RydWN0IHJl
c291cmNlICpwOwogCiAJcmVhZF9sb2NrKCZyZXNvdXJjZV9sb2NrKTsKLQlmb3IgKHAgPSBpb21l
bV9yZXNvdXJjZS5jaGlsZDsgcCA7IHAgPSBwLT5zaWJsaW5nKSB7CisJbGlzdF9mb3JfZWFjaF9l
bnRyeShwLCAmaW9tZW1fcmVzb3VyY2UuY2hpbGQsIHNpYmxpbmcpIHsKIAkJYm9vbCBpc190eXBl
ID0gKCgocC0+ZmxhZ3MgJiBmbGFncykgPT0gZmxhZ3MpICYmCiAJCQkJKChkZXNjID09IElPUkVT
X0RFU0NfTk9ORSkgfHwKIAkJCQkgKGRlc2MgPT0gcC0+ZGVzYykpKTsKQEAgLTYxOCw3ICs2MjMs
NyBAQCBzdGF0aWMgaW50IF9fZmluZF9yZXNvdXJjZShzdHJ1Y3QgcmVzb3VyY2UgKnJvb3QsIHN0
cnVjdCByZXNvdXJjZSAqb2xkLAogCQkJIHJlc291cmNlX3NpemVfdCAgc2l6ZSwKIAkJCSBzdHJ1
Y3QgcmVzb3VyY2VfY29uc3RyYWludCAqY29uc3RyYWludCkKIHsKLQlzdHJ1Y3QgcmVzb3VyY2Ug
KnRoaXMgPSByb290LT5jaGlsZDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnRoaXMgPSByZXNvdXJjZV9m
aXJzdF9jaGlsZCgmcm9vdC0+Y2hpbGQpOwogCXN0cnVjdCByZXNvdXJjZSB0bXAgPSAqbmV3LCBh
dmFpbCwgYWxsb2M7CiAKIAl0bXAuc3RhcnQgPSByb290LT5zdGFydDsKQEAgLTYyOCw3ICs2MzMs
NyBAQCBzdGF0aWMgaW50IF9fZmluZF9yZXNvdXJjZShzdHJ1Y3QgcmVzb3VyY2UgKnJvb3QsIHN0
cnVjdCByZXNvdXJjZSAqb2xkLAogCSAqLwogCWlmICh0aGlzICYmIHRoaXMtPnN0YXJ0ID09IHJv
b3QtPnN0YXJ0KSB7CiAJCXRtcC5zdGFydCA9ICh0aGlzID09IG9sZCkgPyBvbGQtPnN0YXJ0IDog
dGhpcy0+ZW5kICsgMTsKLQkJdGhpcyA9IHRoaXMtPnNpYmxpbmc7CisJCXRoaXMgPSByZXNvdXJj
ZV9zaWJsaW5nKHRoaXMpOwogCX0KIAlmb3IoOzspIHsKIAkJaWYgKHRoaXMpCkBAIC02NjQsNyAr
NjY5LDcgQEAgbmV4dDoJCWlmICghdGhpcyB8fCB0aGlzLT5lbmQgPT0gcm9vdC0+ZW5kKQogCiAJ
CWlmICh0aGlzICE9IG9sZCkKIAkJCXRtcC5zdGFydCA9IHRoaXMtPmVuZCArIDE7Ci0JCXRoaXMg
PSB0aGlzLT5zaWJsaW5nOworCQl0aGlzID0gcmVzb3VyY2Vfc2libGluZyh0aGlzKTsKIAl9CiAJ
cmV0dXJuIC1FQlVTWTsKIH0KQEAgLTcwOCw3ICs3MTMsNyBAQCBzdGF0aWMgaW50IHJlYWxsb2Nh
dGVfcmVzb3VyY2Uoc3RydWN0IHJlc291cmNlICpyb290LCBzdHJ1Y3QgcmVzb3VyY2UgKm9sZCwK
IAkJZ290byBvdXQ7CiAJfQogCi0JaWYgKG9sZC0+Y2hpbGQpIHsKKwlpZiAoIWxpc3RfZW1wdHko
Jm9sZC0+Y2hpbGQpKSB7CiAJCWVyciA9IC1FQlVTWTsKIAkJZ290byBvdXQ7CiAJfQpAQCAtNzg5
LDcgKzc5NCw3IEBAIHN0cnVjdCByZXNvdXJjZSAqbG9va3VwX3Jlc291cmNlKHN0cnVjdCByZXNv
dXJjZSAqcm9vdCwgcmVzb3VyY2Vfc2l6ZV90IHN0YXJ0KQogCXN0cnVjdCByZXNvdXJjZSAqcmVz
OwogCiAJcmVhZF9sb2NrKCZyZXNvdXJjZV9sb2NrKTsKLQlmb3IgKHJlcyA9IHJvb3QtPmNoaWxk
OyByZXM7IHJlcyA9IHJlcy0+c2libGluZykgeworCWxpc3RfZm9yX2VhY2hfZW50cnkocmVzLCAm
cm9vdC0+Y2hpbGQsIHNpYmxpbmcpIHsKIAkJaWYgKHJlcy0+c3RhcnQgPT0gc3RhcnQpCiAJCQli
cmVhazsKIAl9CkBAIC04MjIsMzIgKzgyNywyNyBAQCBzdGF0aWMgc3RydWN0IHJlc291cmNlICog
X19pbnNlcnRfcmVzb3VyY2Uoc3RydWN0IHJlc291cmNlICpwYXJlbnQsIHN0cnVjdCByZXNvdQog
CQkJYnJlYWs7CiAJfQogCi0JZm9yIChuZXh0ID0gZmlyc3Q7IDsgbmV4dCA9IG5leHQtPnNpYmxp
bmcpIHsKKwlmb3IgKG5leHQgPSBmaXJzdDsgOyBuZXh0ID0gcmVzb3VyY2Vfc2libGluZyhuZXh0
KSkgewogCQkvKiBQYXJ0aWFsIG92ZXJsYXA/IEJhZCwgYW5kIHVuZml4YWJsZSAqLwogCQlpZiAo
bmV4dC0+c3RhcnQgPCBuZXctPnN0YXJ0IHx8IG5leHQtPmVuZCA+IG5ldy0+ZW5kKQogCQkJcmV0
dXJuIG5leHQ7Ci0JCWlmICghbmV4dC0+c2libGluZykKKwkJaWYgKCFyZXNvdXJjZV9zaWJsaW5n
KG5leHQpKQogCQkJYnJlYWs7Ci0JCWlmIChuZXh0LT5zaWJsaW5nLT5zdGFydCA+IG5ldy0+ZW5k
KQorCQlpZiAocmVzb3VyY2Vfc2libGluZyhuZXh0KS0+c3RhcnQgPiBuZXctPmVuZCkKIAkJCWJy
ZWFrOwogCX0KLQogCW5ldy0+cGFyZW50ID0gcGFyZW50OwotCW5ldy0+c2libGluZyA9IG5leHQt
PnNpYmxpbmc7Ci0JbmV3LT5jaGlsZCA9IGZpcnN0OworCWxpc3RfYWRkKCZuZXctPnNpYmxpbmcs
ICZuZXh0LT5zaWJsaW5nKTsKKwlJTklUX0xJU1RfSEVBRCgmbmV3LT5jaGlsZCk7CiAKLQluZXh0
LT5zaWJsaW5nID0gTlVMTDsKLQlmb3IgKG5leHQgPSBmaXJzdDsgbmV4dDsgbmV4dCA9IG5leHQt
PnNpYmxpbmcpCisJLyoKKwkgKiBGcm9tIGZpcnN0IHRvIG5leHQsIHRoZXkgYWxsIGZhbGwgaW50
byBuZXcncyByZWdpb24sIHNvIGNoYW5nZSB0aGVtCisJICogYXMgbmV3J3MgY2hpbGRyZW4uCisJ
ICovCisJbGlzdF9jdXRfcG9zaXRpb24oJm5ldy0+Y2hpbGQsIGZpcnN0LT5zaWJsaW5nLnByZXYs
ICZuZXh0LT5zaWJsaW5nKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG5leHQsICZuZXctPmNoaWxk
LCBzaWJsaW5nKQogCQluZXh0LT5wYXJlbnQgPSBuZXc7CiAKLQlpZiAocGFyZW50LT5jaGlsZCA9
PSBmaXJzdCkgewotCQlwYXJlbnQtPmNoaWxkID0gbmV3OwotCX0gZWxzZSB7Ci0JCW5leHQgPSBw
YXJlbnQtPmNoaWxkOwotCQl3aGlsZSAobmV4dC0+c2libGluZyAhPSBmaXJzdCkKLQkJCW5leHQg
PSBuZXh0LT5zaWJsaW5nOwotCQluZXh0LT5zaWJsaW5nID0gbmV3OwotCX0KIAlyZXR1cm4gTlVM
TDsKIH0KIApAQCAtOTY5LDE5ICs5NjksMTcgQEAgc3RhdGljIGludCBfX2FkanVzdF9yZXNvdXJj
ZShzdHJ1Y3QgcmVzb3VyY2UgKnJlcywgcmVzb3VyY2Vfc2l6ZV90IHN0YXJ0LAogCWlmICgoc3Rh
cnQgPCBwYXJlbnQtPnN0YXJ0KSB8fCAoZW5kID4gcGFyZW50LT5lbmQpKQogCQlnb3RvIG91dDsK
IAotCWlmIChyZXMtPnNpYmxpbmcgJiYgKHJlcy0+c2libGluZy0+c3RhcnQgPD0gZW5kKSkKKwlp
ZiAocmVzb3VyY2Vfc2libGluZyhyZXMpICYmIChyZXNvdXJjZV9zaWJsaW5nKHJlcyktPnN0YXJ0
IDw9IGVuZCkpCiAJCWdvdG8gb3V0OwogCi0JdG1wID0gcGFyZW50LT5jaGlsZDsKLQlpZiAodG1w
ICE9IHJlcykgewotCQl3aGlsZSAodG1wLT5zaWJsaW5nICE9IHJlcykKLQkJCXRtcCA9IHRtcC0+
c2libGluZzsKKwlpZiAocmVzLT5zaWJsaW5nLnByZXYgIT0gJnBhcmVudC0+Y2hpbGQpIHsKKwkJ
dG1wID0gbGlzdF9wcmV2X2VudHJ5KHJlcywgc2libGluZyk7CiAJCWlmIChzdGFydCA8PSB0bXAt
PmVuZCkKIAkJCWdvdG8gb3V0OwogCX0KIAogc2tpcDoKLQlmb3IgKHRtcCA9IHJlcy0+Y2hpbGQ7
IHRtcDsgdG1wID0gdG1wLT5zaWJsaW5nKQorCWxpc3RfZm9yX2VhY2hfZW50cnkodG1wLCAmcmVz
LT5jaGlsZCwgc2libGluZykKIAkJaWYgKCh0bXAtPnN0YXJ0IDwgc3RhcnQpIHx8ICh0bXAtPmVu
ZCA+IGVuZCkpCiAJCQlnb3RvIG91dDsKIApAQCAtMTIwNiwzNCArMTIwNCwzMiBAQCBFWFBPUlRf
U1lNQk9MKF9fcmVxdWVzdF9yZWdpb24pOwogdm9pZCBfX3JlbGVhc2VfcmVnaW9uKHN0cnVjdCBy
ZXNvdXJjZSAqcGFyZW50LCByZXNvdXJjZV9zaXplX3Qgc3RhcnQsCiAJCQlyZXNvdXJjZV9zaXpl
X3QgbikKIHsKLQlzdHJ1Y3QgcmVzb3VyY2UgKipwOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOwog
CXJlc291cmNlX3NpemVfdCBlbmQ7CiAKLQlwID0gJnBhcmVudC0+Y2hpbGQ7CisJcmVzID0gcmVz
b3VyY2VfZmlyc3RfY2hpbGQoJnBhcmVudC0+Y2hpbGQpOwogCWVuZCA9IHN0YXJ0ICsgbiAtIDE7
CiAKIAl3cml0ZV9sb2NrKCZyZXNvdXJjZV9sb2NrKTsKIAogCWZvciAoOzspIHsKLQkJc3RydWN0
IHJlc291cmNlICpyZXMgPSAqcDsKLQogCQlpZiAoIXJlcykKIAkJCWJyZWFrOwogCQlpZiAocmVz
LT5zdGFydCA8PSBzdGFydCAmJiByZXMtPmVuZCA+PSBlbmQpIHsKIAkJCWlmICghKHJlcy0+Zmxh
Z3MgJiBJT1JFU09VUkNFX0JVU1kpKSB7Ci0JCQkJcCA9ICZyZXMtPmNoaWxkOworCQkJCXJlcyA9
IHJlc291cmNlX2ZpcnN0X2NoaWxkKCZyZXMtPmNoaWxkKTsKIAkJCQljb250aW51ZTsKIAkJCX0K
IAkJCWlmIChyZXMtPnN0YXJ0ICE9IHN0YXJ0IHx8IHJlcy0+ZW5kICE9IGVuZCkKIAkJCQlicmVh
azsKLQkJCSpwID0gcmVzLT5zaWJsaW5nOworCQkJbGlzdF9kZWwoJnJlcy0+c2libGluZyk7CiAJ
CQl3cml0ZV91bmxvY2soJnJlc291cmNlX2xvY2spOwogCQkJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JF
U09VUkNFX01VWEVEKQogCQkJCXdha2VfdXAoJm11eGVkX3Jlc291cmNlX3dhaXQpOwogCQkJZnJl
ZV9yZXNvdXJjZShyZXMpOwogCQkJcmV0dXJuOwogCQl9Ci0JCXAgPSAmcmVzLT5zaWJsaW5nOwor
CQlyZXMgPSByZXNvdXJjZV9zaWJsaW5nKHJlcyk7CiAJfQogCiAJd3JpdGVfdW5sb2NrKCZyZXNv
dXJjZV9sb2NrKTsKQEAgLTEyNjgsOSArMTI2NCw3IEBAIEVYUE9SVF9TWU1CT0woX19yZWxlYXNl
X3JlZ2lvbik7CiBpbnQgcmVsZWFzZV9tZW1fcmVnaW9uX2FkanVzdGFibGUoc3RydWN0IHJlc291
cmNlICpwYXJlbnQsCiAJCQlyZXNvdXJjZV9zaXplX3Qgc3RhcnQsIHJlc291cmNlX3NpemVfdCBz
aXplKQogewotCXN0cnVjdCByZXNvdXJjZSAqKnA7Ci0Jc3RydWN0IHJlc291cmNlICpyZXM7Ci0J
c3RydWN0IHJlc291cmNlICpuZXdfcmVzOworCXN0cnVjdCByZXNvdXJjZSAqcmVzLCAqbmV3X3Jl
czsKIAlyZXNvdXJjZV9zaXplX3QgZW5kOwogCWludCByZXQgPSAtRUlOVkFMOwogCkBAIC0xMjgx
LDE2ICsxMjc1LDE2IEBAIGludCByZWxlYXNlX21lbV9yZWdpb25fYWRqdXN0YWJsZShzdHJ1Y3Qg
cmVzb3VyY2UgKnBhcmVudCwKIAkvKiBUaGUgYWxsb2NfcmVzb3VyY2UoKSByZXN1bHQgZ2V0cyBj
aGVja2VkIGxhdGVyICovCiAJbmV3X3JlcyA9IGFsbG9jX3Jlc291cmNlKEdGUF9LRVJORUwpOwog
Ci0JcCA9ICZwYXJlbnQtPmNoaWxkOworCXJlcyA9IHJlc291cmNlX2ZpcnN0X2NoaWxkKCZwYXJl
bnQtPmNoaWxkKTsKIAl3cml0ZV9sb2NrKCZyZXNvdXJjZV9sb2NrKTsKIAotCXdoaWxlICgocmVz
ID0gKnApKSB7CisJd2hpbGUgKChyZXMpKSB7CiAJCWlmIChyZXMtPnN0YXJ0ID49IGVuZCkKIAkJ
CWJyZWFrOwogCiAJCS8qIGxvb2sgZm9yIHRoZSBuZXh0IHJlc291cmNlIGlmIGl0IGRvZXMgbm90
IGZpdCBpbnRvICovCiAJCWlmIChyZXMtPnN0YXJ0ID4gc3RhcnQgfHwgcmVzLT5lbmQgPCBlbmQp
IHsKLQkJCXAgPSAmcmVzLT5zaWJsaW5nOworCQkJcmVzID0gcmVzb3VyY2Vfc2libGluZyhyZXMp
OwogCQkJY29udGludWU7CiAJCX0KIApAQCAtMTI5OCwxNCArMTI5MiwxNCBAQCBpbnQgcmVsZWFz
ZV9tZW1fcmVnaW9uX2FkanVzdGFibGUoc3RydWN0IHJlc291cmNlICpwYXJlbnQsCiAJCQlicmVh
azsKIAogCQlpZiAoIShyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9CVVNZKSkgewotCQkJcCA9ICZy
ZXMtPmNoaWxkOworCQkJcmVzID0gcmVzb3VyY2VfZmlyc3RfY2hpbGQoJnJlcy0+Y2hpbGQpOwog
CQkJY29udGludWU7CiAJCX0KIAogCQkvKiBmb3VuZCB0aGUgdGFyZ2V0IHJlc291cmNlOyBsZXQn
cyBhZGp1c3QgYWNjb3JkaW5nbHkgKi8KIAkJaWYgKHJlcy0+c3RhcnQgPT0gc3RhcnQgJiYgcmVz
LT5lbmQgPT0gZW5kKSB7CiAJCQkvKiBmcmVlIHRoZSB3aG9sZSBlbnRyeSAqLwotCQkJKnAgPSBy
ZXMtPnNpYmxpbmc7CisJCQlsaXN0X2RlbCgmcmVzLT5zaWJsaW5nKTsKIAkJCWZyZWVfcmVzb3Vy
Y2UocmVzKTsKIAkJCXJldCA9IDA7CiAJCX0gZWxzZSBpZiAocmVzLT5zdGFydCA9PSBzdGFydCAm
JiByZXMtPmVuZCAhPSBlbmQpIHsKQEAgLTEzMjgsMTQgKzEzMjIsMTMgQEAgaW50IHJlbGVhc2Vf
bWVtX3JlZ2lvbl9hZGp1c3RhYmxlKHN0cnVjdCByZXNvdXJjZSAqcGFyZW50LAogCQkJbmV3X3Jl
cy0+ZmxhZ3MgPSByZXMtPmZsYWdzOwogCQkJbmV3X3Jlcy0+ZGVzYyA9IHJlcy0+ZGVzYzsKIAkJ
CW5ld19yZXMtPnBhcmVudCA9IHJlcy0+cGFyZW50OwotCQkJbmV3X3Jlcy0+c2libGluZyA9IHJl
cy0+c2libGluZzsKLQkJCW5ld19yZXMtPmNoaWxkID0gTlVMTDsKKwkJCUlOSVRfTElTVF9IRUFE
KCZuZXdfcmVzLT5jaGlsZCk7CiAKIAkJCXJldCA9IF9fYWRqdXN0X3Jlc291cmNlKHJlcywgcmVz
LT5zdGFydCwKIAkJCQkJCXN0YXJ0IC0gcmVzLT5zdGFydCk7CiAJCQlpZiAocmV0KQogCQkJCWJy
ZWFrOwotCQkJcmVzLT5zaWJsaW5nID0gbmV3X3JlczsKKwkJCWxpc3RfYWRkKCZuZXdfcmVzLT5z
aWJsaW5nLCAmcmVzLT5zaWJsaW5nKTsKIAkJCW5ld19yZXMgPSBOVUxMOwogCQl9CiAKQEAgLTE1
MTYsNyArMTUwOSw3IEBAIHN0YXRpYyBpbnQgX19pbml0IHJlc2VydmVfc2V0dXAoY2hhciAqc3Ry
KQogCQkJcmVzLT5lbmQgPSBpb19zdGFydCArIGlvX251bSAtIDE7CiAJCQlyZXMtPmZsYWdzIHw9
IElPUkVTT1VSQ0VfQlVTWTsKIAkJCXJlcy0+ZGVzYyA9IElPUkVTX0RFU0NfTk9ORTsKLQkJCXJl
cy0+Y2hpbGQgPSBOVUxMOworCQkJSU5JVF9MSVNUX0hFQUQoJnJlcy0+Y2hpbGQpOwogCQkJaWYg
KHJlcXVlc3RfcmVzb3VyY2UocGFyZW50LCByZXMpID09IDApCiAJCQkJcmVzZXJ2ZWQgPSB4KzE7
CiAJCX0KQEAgLTE1MzYsNyArMTUyOSw3IEBAIGludCBpb21lbV9tYXBfc2FuaXR5X2NoZWNrKHJl
c291cmNlX3NpemVfdCBhZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCiAJbG9mZl90IGw7CiAKIAly
ZWFkX2xvY2soJnJlc291cmNlX2xvY2spOwotCWZvciAocCA9IHAtPmNoaWxkOyBwIDsgcCA9IHJf
bmV4dChOVUxMLCBwLCAmbCkpIHsKKwlmb3IgKHAgPSByZXNvdXJjZV9maXJzdF9jaGlsZCgmcC0+
Y2hpbGQpOyBwOyBwID0gcl9uZXh0KE5VTEwsIHAsICZsKSkgewogCQkvKgogCQkgKiBXZSBjYW4g
cHJvYmFibHkgc2tpcCB0aGUgcmVzb3VyY2VzIHdpdGhvdXQKIAkJICogSU9SRVNPVVJDRV9JTyBh
dHRyaWJ1dGU/CkBAIC0xNTkyLDcgKzE1ODUsNyBAQCBib29sIGlvbWVtX2lzX2V4Y2x1c2l2ZSh1
NjQgYWRkcikKIAlhZGRyID0gYWRkciAmIFBBR0VfTUFTSzsKIAogCXJlYWRfbG9jaygmcmVzb3Vy
Y2VfbG9jayk7Ci0JZm9yIChwID0gcC0+Y2hpbGQ7IHAgOyBwID0gcl9uZXh0KE5VTEwsIHAsICZs
KSkgeworCWZvciAocCA9IHJlc291cmNlX2ZpcnN0X2NoaWxkKCZwLT5jaGlsZCk7IHA7IHAgPSBy
X25leHQoTlVMTCwgcCwgJmwpKSB7CiAJCS8qCiAJCSAqIFdlIGNhbiBwcm9iYWJseSBza2lwIHRo
ZSByZXNvdXJjZXMgd2l0aG91dAogCQkgKiBJT1JFU09VUkNFX0lPIGF0dHJpYnV0ZT8KLS0gCjIu
MTMuNgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KTGlu
dXgtbnZkaW1tIG1haWxpbmcgbGlzdApMaW51eC1udmRpbW1AbGlzdHMuMDEub3JnCmh0dHBzOi8v
bGlzdHMuMDEub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtbnZkaW1tCg==
^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: [PATCH v4 1/3] resource: Use list_head to link sibling resource
@ 2018-05-07 11:42 ` kbuild test robot
0 siblings, 0 replies; 42+ messages in thread
From: kbuild test robot @ 2018-05-07 11:42 UTC (permalink / raw)
To: Baoquan He
Cc: nicolas.pitre, brijesh.singh, devicetree, airlied, linux-pci,
richard.weiyang, keith.busch, jcmvbkbc, baiyaowei, kys,
frowand.list, lorenzo.pieralisi, sthemmin, linux-nvdimm,
patrik.r.jakobsson, linux-input, gustavo, bp, dyoung, ebiederm,
thomas.lendacky, haiyangz, maarten.lankhorst, josh, jglisse,
robh+dt, seanpaul, bhelgaas, tglx, yinghai, jonathan.derrick,
chris, monstr, linux-parisc, gregkh, dmitry.torokhov, kexec,
linux-kernel, kbuild-all, devel, akpm, fengguang.wu, davem
Hi Baoquan,
I love your patch! Yet something to improve:
[auto build test ERROR on linus/master]
[also build test ERROR on v4.17-rc4 next-20180504]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
url: https://github.com/0day-ci/linux/commits/Baoquan-He/resource-Use-list_head-to-link-sibling-resource/20180507-144345
config: powerpc-defconfig (attached as .config)
compiler: powerpc64-linux-gnu-gcc (Debian 7.2.0-11) 7.2.0
reproduce:
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
make.cross ARCH=powerpc
All errors (new ones prefixed by >>):
arch/powerpc/kernel/pci-common.c: In function 'pci_process_bridge_OF_ranges':
>> arch/powerpc/kernel/pci-common.c:764:44: error: incompatible types when assigning to type 'struct list_head' from type 'void *'
res->parent = res->child = res->sibling = NULL;
^
arch/powerpc/kernel/pci-common.c: In function 'reparent_resources':
>> arch/powerpc/kernel/pci-common.c:1100:10: error: assignment from incompatible pointer type [-Werror=incompatible-pointer-types]
for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) {
^
arch/powerpc/kernel/pci-common.c:1100:50: error: assignment from incompatible pointer type [-Werror=incompatible-pointer-types]
for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) {
^
>> arch/powerpc/kernel/pci-common.c:1113:13: error: incompatible types when assigning to type 'struct list_head' from type 'struct resource *'
res->child = *firstpp;
^
arch/powerpc/kernel/pci-common.c:1114:15: error: incompatible types when assigning to type 'struct list_head' from type 'struct resource *'
res->sibling = *pp;
^
>> arch/powerpc/kernel/pci-common.c:1117:9: error: incompatible types when assigning to type 'struct resource *' from type 'struct list_head'
for (p = res->child; p != NULL; p = p->sibling) {
^
arch/powerpc/kernel/pci-common.c:1117:36: error: incompatible types when assigning to type 'struct resource *' from type 'struct list_head'
for (p = res->child; p != NULL; p = p->sibling) {
^
cc1: all warnings being treated as errors
vim +764 arch/powerpc/kernel/pci-common.c
13dccb9e Benjamin Herrenschmidt 2007-12-11 642
13dccb9e Benjamin Herrenschmidt 2007-12-11 643 /**
13dccb9e Benjamin Herrenschmidt 2007-12-11 644 * pci_process_bridge_OF_ranges - Parse PCI bridge resources from device tree
13dccb9e Benjamin Herrenschmidt 2007-12-11 645 * @hose: newly allocated pci_controller to be setup
13dccb9e Benjamin Herrenschmidt 2007-12-11 646 * @dev: device node of the host bridge
13dccb9e Benjamin Herrenschmidt 2007-12-11 647 * @primary: set if primary bus (32 bits only, soon to be deprecated)
13dccb9e Benjamin Herrenschmidt 2007-12-11 648 *
13dccb9e Benjamin Herrenschmidt 2007-12-11 649 * This function will parse the "ranges" property of a PCI host bridge device
13dccb9e Benjamin Herrenschmidt 2007-12-11 650 * node and setup the resource mapping of a pci controller based on its
13dccb9e Benjamin Herrenschmidt 2007-12-11 651 * content.
13dccb9e Benjamin Herrenschmidt 2007-12-11 652 *
13dccb9e Benjamin Herrenschmidt 2007-12-11 653 * Life would be boring if it wasn't for a few issues that we have to deal
13dccb9e Benjamin Herrenschmidt 2007-12-11 654 * with here:
13dccb9e Benjamin Herrenschmidt 2007-12-11 655 *
13dccb9e Benjamin Herrenschmidt 2007-12-11 656 * - We can only cope with one IO space range and up to 3 Memory space
13dccb9e Benjamin Herrenschmidt 2007-12-11 657 * ranges. However, some machines (thanks Apple !) tend to split their
13dccb9e Benjamin Herrenschmidt 2007-12-11 658 * space into lots of small contiguous ranges. So we have to coalesce.
13dccb9e Benjamin Herrenschmidt 2007-12-11 659 *
13dccb9e Benjamin Herrenschmidt 2007-12-11 660 * - Some busses have IO space not starting at 0, which causes trouble with
13dccb9e Benjamin Herrenschmidt 2007-12-11 661 * the way we do our IO resource renumbering. The code somewhat deals with
13dccb9e Benjamin Herrenschmidt 2007-12-11 662 * it for 64 bits but I would expect problems on 32 bits.
13dccb9e Benjamin Herrenschmidt 2007-12-11 663 *
13dccb9e Benjamin Herrenschmidt 2007-12-11 664 * - Some 32 bits platforms such as 4xx can have physical space larger than
13dccb9e Benjamin Herrenschmidt 2007-12-11 665 * 32 bits so we need to use 64 bits values for the parsing
13dccb9e Benjamin Herrenschmidt 2007-12-11 666 */
cad5cef6 Greg Kroah-Hartman 2012-12-21 667 void pci_process_bridge_OF_ranges(struct pci_controller *hose,
cad5cef6 Greg Kroah-Hartman 2012-12-21 668 struct device_node *dev, int primary)
13dccb9e Benjamin Herrenschmidt 2007-12-11 669 {
858957ab Kevin Hao 2013-05-16 670 int memno = 0;
13dccb9e Benjamin Herrenschmidt 2007-12-11 671 struct resource *res;
654837e8 Andrew Murray 2014-02-25 672 struct of_pci_range range;
654837e8 Andrew Murray 2014-02-25 673 struct of_pci_range_parser parser;
13dccb9e Benjamin Herrenschmidt 2007-12-11 674
b7c670d6 Rob Herring 2017-08-21 675 printk(KERN_INFO "PCI host bridge %pOF %s ranges:\n",
b7c670d6 Rob Herring 2017-08-21 676 dev, primary ? "(primary)" : "");
13dccb9e Benjamin Herrenschmidt 2007-12-11 677
654837e8 Andrew Murray 2014-02-25 678 /* Check for ranges property */
654837e8 Andrew Murray 2014-02-25 679 if (of_pci_range_parser_init(&parser, dev))
13dccb9e Benjamin Herrenschmidt 2007-12-11 680 return;
13dccb9e Benjamin Herrenschmidt 2007-12-11 681
13dccb9e Benjamin Herrenschmidt 2007-12-11 682 /* Parse it */
654837e8 Andrew Murray 2014-02-25 683 for_each_of_pci_range(&parser, &range) {
e9f82cb7 Benjamin Herrenschmidt 2008-10-14 684 /* If we failed translation or got a zero-sized region
e9f82cb7 Benjamin Herrenschmidt 2008-10-14 685 * (some FW try to feed us with non sensical zero sized regions
e9f82cb7 Benjamin Herrenschmidt 2008-10-14 686 * such as power3 which look like some kind of attempt at exposing
e9f82cb7 Benjamin Herrenschmidt 2008-10-14 687 * the VGA memory hole)
e9f82cb7 Benjamin Herrenschmidt 2008-10-14 688 */
654837e8 Andrew Murray 2014-02-25 689 if (range.cpu_addr == OF_BAD_ADDR || range.size == 0)
13dccb9e Benjamin Herrenschmidt 2007-12-11 690 continue;
13dccb9e Benjamin Herrenschmidt 2007-12-11 691
13dccb9e Benjamin Herrenschmidt 2007-12-11 692 /* Act based on address space type */
13dccb9e Benjamin Herrenschmidt 2007-12-11 693 res = NULL;
654837e8 Andrew Murray 2014-02-25 694 switch (range.flags & IORESOURCE_TYPE_BITS) {
654837e8 Andrew Murray 2014-02-25 695 case IORESOURCE_IO:
13dccb9e Benjamin Herrenschmidt 2007-12-11 696 printk(KERN_INFO
13dccb9e Benjamin Herrenschmidt 2007-12-11 697 " IO 0x%016llx..0x%016llx -> 0x%016llx\n",
654837e8 Andrew Murray 2014-02-25 698 range.cpu_addr, range.cpu_addr + range.size - 1,
654837e8 Andrew Murray 2014-02-25 699 range.pci_addr);
13dccb9e Benjamin Herrenschmidt 2007-12-11 700
13dccb9e Benjamin Herrenschmidt 2007-12-11 701 /* We support only one IO range */
13dccb9e Benjamin Herrenschmidt 2007-12-11 702 if (hose->pci_io_size) {
13dccb9e Benjamin Herrenschmidt 2007-12-11 703 printk(KERN_INFO
13dccb9e Benjamin Herrenschmidt 2007-12-11 704 " \\--> Skipped (too many) !\n");
13dccb9e Benjamin Herrenschmidt 2007-12-11 705 continue;
13dccb9e Benjamin Herrenschmidt 2007-12-11 706 }
13dccb9e Benjamin Herrenschmidt 2007-12-11 707 #ifdef CONFIG_PPC32
13dccb9e Benjamin Herrenschmidt 2007-12-11 708 /* On 32 bits, limit I/O space to 16MB */
654837e8 Andrew Murray 2014-02-25 709 if (range.size > 0x01000000)
654837e8 Andrew Murray 2014-02-25 710 range.size = 0x01000000;
13dccb9e Benjamin Herrenschmidt 2007-12-11 711
13dccb9e Benjamin Herrenschmidt 2007-12-11 712 /* 32 bits needs to map IOs here */
654837e8 Andrew Murray 2014-02-25 713 hose->io_base_virt = ioremap(range.cpu_addr,
654837e8 Andrew Murray 2014-02-25 714 range.size);
13dccb9e Benjamin Herrenschmidt 2007-12-11 715
13dccb9e Benjamin Herrenschmidt 2007-12-11 716 /* Expect trouble if pci_addr is not 0 */
13dccb9e Benjamin Herrenschmidt 2007-12-11 717 if (primary)
13dccb9e Benjamin Herrenschmidt 2007-12-11 718 isa_io_base =
13dccb9e Benjamin Herrenschmidt 2007-12-11 719 (unsigned long)hose->io_base_virt;
13dccb9e Benjamin Herrenschmidt 2007-12-11 720 #endif /* CONFIG_PPC32 */
13dccb9e Benjamin Herrenschmidt 2007-12-11 721 /* pci_io_size and io_base_phys always represent IO
13dccb9e Benjamin Herrenschmidt 2007-12-11 722 * space starting at 0 so we factor in pci_addr
13dccb9e Benjamin Herrenschmidt 2007-12-11 723 */
654837e8 Andrew Murray 2014-02-25 724 hose->pci_io_size = range.pci_addr + range.size;
654837e8 Andrew Murray 2014-02-25 725 hose->io_base_phys = range.cpu_addr - range.pci_addr;
13dccb9e Benjamin Herrenschmidt 2007-12-11 726
13dccb9e Benjamin Herrenschmidt 2007-12-11 727 /* Build resource */
13dccb9e Benjamin Herrenschmidt 2007-12-11 728 res = &hose->io_resource;
654837e8 Andrew Murray 2014-02-25 729 range.cpu_addr = range.pci_addr;
13dccb9e Benjamin Herrenschmidt 2007-12-11 730 break;
654837e8 Andrew Murray 2014-02-25 731 case IORESOURCE_MEM:
13dccb9e Benjamin Herrenschmidt 2007-12-11 732 printk(KERN_INFO
13dccb9e Benjamin Herrenschmidt 2007-12-11 733 " MEM 0x%016llx..0x%016llx -> 0x%016llx %s\n",
654837e8 Andrew Murray 2014-02-25 734 range.cpu_addr, range.cpu_addr + range.size - 1,
654837e8 Andrew Murray 2014-02-25 735 range.pci_addr,
654837e8 Andrew Murray 2014-02-25 736 (range.pci_space & 0x40000000) ?
654837e8 Andrew Murray 2014-02-25 737 "Prefetch" : "");
13dccb9e Benjamin Herrenschmidt 2007-12-11 738
13dccb9e Benjamin Herrenschmidt 2007-12-11 739 /* We support only 3 memory ranges */
13dccb9e Benjamin Herrenschmidt 2007-12-11 740 if (memno >= 3) {
13dccb9e Benjamin Herrenschmidt 2007-12-11 741 printk(KERN_INFO
13dccb9e Benjamin Herrenschmidt 2007-12-11 742 " \\--> Skipped (too many) !\n");
13dccb9e Benjamin Herrenschmidt 2007-12-11 743 continue;
13dccb9e Benjamin Herrenschmidt 2007-12-11 744 }
13dccb9e Benjamin Herrenschmidt 2007-12-11 745 /* Handles ISA memory hole space here */
654837e8 Andrew Murray 2014-02-25 746 if (range.pci_addr == 0) {
13dccb9e Benjamin Herrenschmidt 2007-12-11 747 if (primary || isa_mem_base == 0)
654837e8 Andrew Murray 2014-02-25 748 isa_mem_base = range.cpu_addr;
654837e8 Andrew Murray 2014-02-25 749 hose->isa_mem_phys = range.cpu_addr;
654837e8 Andrew Murray 2014-02-25 750 hose->isa_mem_size = range.size;
13dccb9e Benjamin Herrenschmidt 2007-12-11 751 }
13dccb9e Benjamin Herrenschmidt 2007-12-11 752
13dccb9e Benjamin Herrenschmidt 2007-12-11 753 /* Build resource */
654837e8 Andrew Murray 2014-02-25 754 hose->mem_offset[memno] = range.cpu_addr -
654837e8 Andrew Murray 2014-02-25 755 range.pci_addr;
13dccb9e Benjamin Herrenschmidt 2007-12-11 756 res = &hose->mem_resources[memno++];
13dccb9e Benjamin Herrenschmidt 2007-12-11 757 break;
13dccb9e Benjamin Herrenschmidt 2007-12-11 758 }
13dccb9e Benjamin Herrenschmidt 2007-12-11 759 if (res != NULL) {
aeba3731 Michael Ellerman 2014-10-16 760 res->name = dev->full_name;
aeba3731 Michael Ellerman 2014-10-16 761 res->flags = range.flags;
aeba3731 Michael Ellerman 2014-10-16 762 res->start = range.cpu_addr;
aeba3731 Michael Ellerman 2014-10-16 763 res->end = range.cpu_addr + range.size - 1;
aeba3731 Michael Ellerman 2014-10-16 @764 res->parent = res->child = res->sibling = NULL;
13dccb9e Benjamin Herrenschmidt 2007-12-11 765 }
13dccb9e Benjamin Herrenschmidt 2007-12-11 766 }
13dccb9e Benjamin Herrenschmidt 2007-12-11 767 }
fa462f2d Benjamin Herrenschmidt 2007-12-20 768
:::::: The code at line 764 was first introduced by commit
:::::: aeba3731b150188685225b510886f1370d8814de powerpc/pci: Fix IO space breakage after of_pci_range_to_resource() change
:::::: TO: Michael Ellerman <mpe@ellerman.id.au>
:::::: CC: Michael Ellerman <mpe@ellerman.id.au>
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
_______________________________________________
Linux-nvdimm mailing list
Linux-nvdimm@lists.01.org
https://lists.01.org/mailman/listinfo/linux-nvdimm
^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: [PATCH v4 1/3] resource: Use list_head to link sibling resource
@ 2018-05-07 11:42 ` kbuild test robot
0 siblings, 0 replies; 42+ messages in thread
From: kbuild test robot @ 2018-05-07 11:42 UTC (permalink / raw)
To: Baoquan He
Cc: nicolas.pitre, brijesh.singh, devicetree, airlied, linux-pci,
richard.weiyang, keith.busch, jcmvbkbc, baiyaowei, kys,
frowand.list, dan.j.williams, lorenzo.pieralisi, sthemmin,
Baoquan He, linux-nvdimm, patrik.r.jakobsson, linux-input,
gustavo, bp, dyoung, vgoyal, ebiederm, thomas.lendacky, haiyangz,
maarten.lankhorst, josh, jglisse, robh+dt, seanpaul, bhelgaas,
tglx, yinghai, jonathan.derrick, chris, monstr, linux-parisc,
gregkh, dmitry.torokhov, kexec, linux-kernel, kbuild-all, devel,
akpm, fengguang.wu, davem
[-- Attachment #1: Type: text/plain, Size: 13194 bytes --]
Hi Baoquan,
I love your patch! Yet something to improve:
[auto build test ERROR on linus/master]
[also build test ERROR on v4.17-rc4 next-20180504]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
url: https://github.com/0day-ci/linux/commits/Baoquan-He/resource-Use-list_head-to-link-sibling-resource/20180507-144345
config: powerpc-defconfig (attached as .config)
compiler: powerpc64-linux-gnu-gcc (Debian 7.2.0-11) 7.2.0
reproduce:
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
make.cross ARCH=powerpc
All errors (new ones prefixed by >>):
arch/powerpc/kernel/pci-common.c: In function 'pci_process_bridge_OF_ranges':
>> arch/powerpc/kernel/pci-common.c:764:44: error: incompatible types when assigning to type 'struct list_head' from type 'void *'
res->parent = res->child = res->sibling = NULL;
^
arch/powerpc/kernel/pci-common.c: In function 'reparent_resources':
>> arch/powerpc/kernel/pci-common.c:1100:10: error: assignment from incompatible pointer type [-Werror=incompatible-pointer-types]
for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) {
^
arch/powerpc/kernel/pci-common.c:1100:50: error: assignment from incompatible pointer type [-Werror=incompatible-pointer-types]
for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) {
^
>> arch/powerpc/kernel/pci-common.c:1113:13: error: incompatible types when assigning to type 'struct list_head' from type 'struct resource *'
res->child = *firstpp;
^
arch/powerpc/kernel/pci-common.c:1114:15: error: incompatible types when assigning to type 'struct list_head' from type 'struct resource *'
res->sibling = *pp;
^
>> arch/powerpc/kernel/pci-common.c:1117:9: error: incompatible types when assigning to type 'struct resource *' from type 'struct list_head'
for (p = res->child; p != NULL; p = p->sibling) {
^
arch/powerpc/kernel/pci-common.c:1117:36: error: incompatible types when assigning to type 'struct resource *' from type 'struct list_head'
for (p = res->child; p != NULL; p = p->sibling) {
^
cc1: all warnings being treated as errors
vim +764 arch/powerpc/kernel/pci-common.c
13dccb9e Benjamin Herrenschmidt 2007-12-11 642
13dccb9e Benjamin Herrenschmidt 2007-12-11 643 /**
13dccb9e Benjamin Herrenschmidt 2007-12-11 644 * pci_process_bridge_OF_ranges - Parse PCI bridge resources from device tree
13dccb9e Benjamin Herrenschmidt 2007-12-11 645 * @hose: newly allocated pci_controller to be setup
13dccb9e Benjamin Herrenschmidt 2007-12-11 646 * @dev: device node of the host bridge
13dccb9e Benjamin Herrenschmidt 2007-12-11 647 * @primary: set if primary bus (32 bits only, soon to be deprecated)
13dccb9e Benjamin Herrenschmidt 2007-12-11 648 *
13dccb9e Benjamin Herrenschmidt 2007-12-11 649 * This function will parse the "ranges" property of a PCI host bridge device
13dccb9e Benjamin Herrenschmidt 2007-12-11 650 * node and setup the resource mapping of a pci controller based on its
13dccb9e Benjamin Herrenschmidt 2007-12-11 651 * content.
13dccb9e Benjamin Herrenschmidt 2007-12-11 652 *
13dccb9e Benjamin Herrenschmidt 2007-12-11 653 * Life would be boring if it wasn't for a few issues that we have to deal
13dccb9e Benjamin Herrenschmidt 2007-12-11 654 * with here:
13dccb9e Benjamin Herrenschmidt 2007-12-11 655 *
13dccb9e Benjamin Herrenschmidt 2007-12-11 656 * - We can only cope with one IO space range and up to 3 Memory space
13dccb9e Benjamin Herrenschmidt 2007-12-11 657 * ranges. However, some machines (thanks Apple !) tend to split their
13dccb9e Benjamin Herrenschmidt 2007-12-11 658 * space into lots of small contiguous ranges. So we have to coalesce.
13dccb9e Benjamin Herrenschmidt 2007-12-11 659 *
13dccb9e Benjamin Herrenschmidt 2007-12-11 660 * - Some busses have IO space not starting at 0, which causes trouble with
13dccb9e Benjamin Herrenschmidt 2007-12-11 661 * the way we do our IO resource renumbering. The code somewhat deals with
13dccb9e Benjamin Herrenschmidt 2007-12-11 662 * it for 64 bits but I would expect problems on 32 bits.
13dccb9e Benjamin Herrenschmidt 2007-12-11 663 *
13dccb9e Benjamin Herrenschmidt 2007-12-11 664 * - Some 32 bits platforms such as 4xx can have physical space larger than
13dccb9e Benjamin Herrenschmidt 2007-12-11 665 * 32 bits so we need to use 64 bits values for the parsing
13dccb9e Benjamin Herrenschmidt 2007-12-11 666 */
cad5cef6 Greg Kroah-Hartman 2012-12-21 667 void pci_process_bridge_OF_ranges(struct pci_controller *hose,
cad5cef6 Greg Kroah-Hartman 2012-12-21 668 struct device_node *dev, int primary)
13dccb9e Benjamin Herrenschmidt 2007-12-11 669 {
858957ab Kevin Hao 2013-05-16 670 int memno = 0;
13dccb9e Benjamin Herrenschmidt 2007-12-11 671 struct resource *res;
654837e8 Andrew Murray 2014-02-25 672 struct of_pci_range range;
654837e8 Andrew Murray 2014-02-25 673 struct of_pci_range_parser parser;
13dccb9e Benjamin Herrenschmidt 2007-12-11 674
b7c670d6 Rob Herring 2017-08-21 675 printk(KERN_INFO "PCI host bridge %pOF %s ranges:\n",
b7c670d6 Rob Herring 2017-08-21 676 dev, primary ? "(primary)" : "");
13dccb9e Benjamin Herrenschmidt 2007-12-11 677
654837e8 Andrew Murray 2014-02-25 678 /* Check for ranges property */
654837e8 Andrew Murray 2014-02-25 679 if (of_pci_range_parser_init(&parser, dev))
13dccb9e Benjamin Herrenschmidt 2007-12-11 680 return;
13dccb9e Benjamin Herrenschmidt 2007-12-11 681
13dccb9e Benjamin Herrenschmidt 2007-12-11 682 /* Parse it */
654837e8 Andrew Murray 2014-02-25 683 for_each_of_pci_range(&parser, &range) {
e9f82cb7 Benjamin Herrenschmidt 2008-10-14 684 /* If we failed translation or got a zero-sized region
e9f82cb7 Benjamin Herrenschmidt 2008-10-14 685 * (some FW try to feed us with non sensical zero sized regions
e9f82cb7 Benjamin Herrenschmidt 2008-10-14 686 * such as power3 which look like some kind of attempt at exposing
e9f82cb7 Benjamin Herrenschmidt 2008-10-14 687 * the VGA memory hole)
e9f82cb7 Benjamin Herrenschmidt 2008-10-14 688 */
654837e8 Andrew Murray 2014-02-25 689 if (range.cpu_addr == OF_BAD_ADDR || range.size == 0)
13dccb9e Benjamin Herrenschmidt 2007-12-11 690 continue;
13dccb9e Benjamin Herrenschmidt 2007-12-11 691
13dccb9e Benjamin Herrenschmidt 2007-12-11 692 /* Act based on address space type */
13dccb9e Benjamin Herrenschmidt 2007-12-11 693 res = NULL;
654837e8 Andrew Murray 2014-02-25 694 switch (range.flags & IORESOURCE_TYPE_BITS) {
654837e8 Andrew Murray 2014-02-25 695 case IORESOURCE_IO:
13dccb9e Benjamin Herrenschmidt 2007-12-11 696 printk(KERN_INFO
13dccb9e Benjamin Herrenschmidt 2007-12-11 697 " IO 0x%016llx..0x%016llx -> 0x%016llx\n",
654837e8 Andrew Murray 2014-02-25 698 range.cpu_addr, range.cpu_addr + range.size - 1,
654837e8 Andrew Murray 2014-02-25 699 range.pci_addr);
13dccb9e Benjamin Herrenschmidt 2007-12-11 700
13dccb9e Benjamin Herrenschmidt 2007-12-11 701 /* We support only one IO range */
13dccb9e Benjamin Herrenschmidt 2007-12-11 702 if (hose->pci_io_size) {
13dccb9e Benjamin Herrenschmidt 2007-12-11 703 printk(KERN_INFO
13dccb9e Benjamin Herrenschmidt 2007-12-11 704 " \\--> Skipped (too many) !\n");
13dccb9e Benjamin Herrenschmidt 2007-12-11 705 continue;
13dccb9e Benjamin Herrenschmidt 2007-12-11 706 }
13dccb9e Benjamin Herrenschmidt 2007-12-11 707 #ifdef CONFIG_PPC32
13dccb9e Benjamin Herrenschmidt 2007-12-11 708 /* On 32 bits, limit I/O space to 16MB */
654837e8 Andrew Murray 2014-02-25 709 if (range.size > 0x01000000)
654837e8 Andrew Murray 2014-02-25 710 range.size = 0x01000000;
13dccb9e Benjamin Herrenschmidt 2007-12-11 711
13dccb9e Benjamin Herrenschmidt 2007-12-11 712 /* 32 bits needs to map IOs here */
654837e8 Andrew Murray 2014-02-25 713 hose->io_base_virt = ioremap(range.cpu_addr,
654837e8 Andrew Murray 2014-02-25 714 range.size);
13dccb9e Benjamin Herrenschmidt 2007-12-11 715
13dccb9e Benjamin Herrenschmidt 2007-12-11 716 /* Expect trouble if pci_addr is not 0 */
13dccb9e Benjamin Herrenschmidt 2007-12-11 717 if (primary)
13dccb9e Benjamin Herrenschmidt 2007-12-11 718 isa_io_base =
13dccb9e Benjamin Herrenschmidt 2007-12-11 719 (unsigned long)hose->io_base_virt;
13dccb9e Benjamin Herrenschmidt 2007-12-11 720 #endif /* CONFIG_PPC32 */
13dccb9e Benjamin Herrenschmidt 2007-12-11 721 /* pci_io_size and io_base_phys always represent IO
13dccb9e Benjamin Herrenschmidt 2007-12-11 722 * space starting at 0 so we factor in pci_addr
13dccb9e Benjamin Herrenschmidt 2007-12-11 723 */
654837e8 Andrew Murray 2014-02-25 724 hose->pci_io_size = range.pci_addr + range.size;
654837e8 Andrew Murray 2014-02-25 725 hose->io_base_phys = range.cpu_addr - range.pci_addr;
13dccb9e Benjamin Herrenschmidt 2007-12-11 726
13dccb9e Benjamin Herrenschmidt 2007-12-11 727 /* Build resource */
13dccb9e Benjamin Herrenschmidt 2007-12-11 728 res = &hose->io_resource;
654837e8 Andrew Murray 2014-02-25 729 range.cpu_addr = range.pci_addr;
13dccb9e Benjamin Herrenschmidt 2007-12-11 730 break;
654837e8 Andrew Murray 2014-02-25 731 case IORESOURCE_MEM:
13dccb9e Benjamin Herrenschmidt 2007-12-11 732 printk(KERN_INFO
13dccb9e Benjamin Herrenschmidt 2007-12-11 733 " MEM 0x%016llx..0x%016llx -> 0x%016llx %s\n",
654837e8 Andrew Murray 2014-02-25 734 range.cpu_addr, range.cpu_addr + range.size - 1,
654837e8 Andrew Murray 2014-02-25 735 range.pci_addr,
654837e8 Andrew Murray 2014-02-25 736 (range.pci_space & 0x40000000) ?
654837e8 Andrew Murray 2014-02-25 737 "Prefetch" : "");
13dccb9e Benjamin Herrenschmidt 2007-12-11 738
13dccb9e Benjamin Herrenschmidt 2007-12-11 739 /* We support only 3 memory ranges */
13dccb9e Benjamin Herrenschmidt 2007-12-11 740 if (memno >= 3) {
13dccb9e Benjamin Herrenschmidt 2007-12-11 741 printk(KERN_INFO
13dccb9e Benjamin Herrenschmidt 2007-12-11 742 " \\--> Skipped (too many) !\n");
13dccb9e Benjamin Herrenschmidt 2007-12-11 743 continue;
13dccb9e Benjamin Herrenschmidt 2007-12-11 744 }
13dccb9e Benjamin Herrenschmidt 2007-12-11 745 /* Handles ISA memory hole space here */
654837e8 Andrew Murray 2014-02-25 746 if (range.pci_addr == 0) {
13dccb9e Benjamin Herrenschmidt 2007-12-11 747 if (primary || isa_mem_base == 0)
654837e8 Andrew Murray 2014-02-25 748 isa_mem_base = range.cpu_addr;
654837e8 Andrew Murray 2014-02-25 749 hose->isa_mem_phys = range.cpu_addr;
654837e8 Andrew Murray 2014-02-25 750 hose->isa_mem_size = range.size;
13dccb9e Benjamin Herrenschmidt 2007-12-11 751 }
13dccb9e Benjamin Herrenschmidt 2007-12-11 752
13dccb9e Benjamin Herrenschmidt 2007-12-11 753 /* Build resource */
654837e8 Andrew Murray 2014-02-25 754 hose->mem_offset[memno] = range.cpu_addr -
654837e8 Andrew Murray 2014-02-25 755 range.pci_addr;
13dccb9e Benjamin Herrenschmidt 2007-12-11 756 res = &hose->mem_resources[memno++];
13dccb9e Benjamin Herrenschmidt 2007-12-11 757 break;
13dccb9e Benjamin Herrenschmidt 2007-12-11 758 }
13dccb9e Benjamin Herrenschmidt 2007-12-11 759 if (res != NULL) {
aeba3731 Michael Ellerman 2014-10-16 760 res->name = dev->full_name;
aeba3731 Michael Ellerman 2014-10-16 761 res->flags = range.flags;
aeba3731 Michael Ellerman 2014-10-16 762 res->start = range.cpu_addr;
aeba3731 Michael Ellerman 2014-10-16 763 res->end = range.cpu_addr + range.size - 1;
aeba3731 Michael Ellerman 2014-10-16 @764 res->parent = res->child = res->sibling = NULL;
13dccb9e Benjamin Herrenschmidt 2007-12-11 765 }
13dccb9e Benjamin Herrenschmidt 2007-12-11 766 }
13dccb9e Benjamin Herrenschmidt 2007-12-11 767 }
fa462f2d Benjamin Herrenschmidt 2007-12-20 768
:::::: The code at line 764 was first introduced by commit
:::::: aeba3731b150188685225b510886f1370d8814de powerpc/pci: Fix IO space breakage after of_pci_range_to_resource() change
:::::: TO: Michael Ellerman <mpe@ellerman.id.au>
:::::: CC: Michael Ellerman <mpe@ellerman.id.au>
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 23368 bytes --]
[-- Attachment #3: Type: text/plain, Size: 143 bytes --]
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: [PATCH v4 1/3] resource: Use list_head to link sibling resource
@ 2018-05-07 11:42 ` kbuild test robot
0 siblings, 0 replies; 42+ messages in thread
From: kbuild test robot @ 2018-05-07 11:42 UTC (permalink / raw)
To: Baoquan He
Cc: kbuild-all, linux-kernel, akpm, robh+dt, dan.j.williams,
nicolas.pitre, josh, fengguang.wu, bp, patrik.r.jakobsson,
airlied, kys, haiyangz, sthemmin, dmitry.torokhov, frowand.list,
keith.busch, jonathan.derrick, lorenzo.pieralisi, bhelgaas, tglx,
brijesh.singh, jglisse, thomas.lendacky, gregkh, baiyaowei,
richard.weiyang, devel, linux-input, linux-nvdimm, devicetree,
linux-pci, ebiederm, vgoyal, dyoung, yinghai, kexec, monstr,
davem, chris, jcmvbkbc, gustavo, maarten.lankhorst, seanpaul,
linux-parisc, Baoquan He
[-- Attachment #1: Type: text/plain, Size: 13194 bytes --]
Hi Baoquan,
I love your patch! Yet something to improve:
[auto build test ERROR on linus/master]
[also build test ERROR on v4.17-rc4 next-20180504]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
url: https://github.com/0day-ci/linux/commits/Baoquan-He/resource-Use-list_head-to-link-sibling-resource/20180507-144345
config: powerpc-defconfig (attached as .config)
compiler: powerpc64-linux-gnu-gcc (Debian 7.2.0-11) 7.2.0
reproduce:
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
make.cross ARCH=powerpc
All errors (new ones prefixed by >>):
arch/powerpc/kernel/pci-common.c: In function 'pci_process_bridge_OF_ranges':
>> arch/powerpc/kernel/pci-common.c:764:44: error: incompatible types when assigning to type 'struct list_head' from type 'void *'
res->parent = res->child = res->sibling = NULL;
^
arch/powerpc/kernel/pci-common.c: In function 'reparent_resources':
>> arch/powerpc/kernel/pci-common.c:1100:10: error: assignment from incompatible pointer type [-Werror=incompatible-pointer-types]
for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) {
^
arch/powerpc/kernel/pci-common.c:1100:50: error: assignment from incompatible pointer type [-Werror=incompatible-pointer-types]
for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) {
^
>> arch/powerpc/kernel/pci-common.c:1113:13: error: incompatible types when assigning to type 'struct list_head' from type 'struct resource *'
res->child = *firstpp;
^
arch/powerpc/kernel/pci-common.c:1114:15: error: incompatible types when assigning to type 'struct list_head' from type 'struct resource *'
res->sibling = *pp;
^
>> arch/powerpc/kernel/pci-common.c:1117:9: error: incompatible types when assigning to type 'struct resource *' from type 'struct list_head'
for (p = res->child; p != NULL; p = p->sibling) {
^
arch/powerpc/kernel/pci-common.c:1117:36: error: incompatible types when assigning to type 'struct resource *' from type 'struct list_head'
for (p = res->child; p != NULL; p = p->sibling) {
^
cc1: all warnings being treated as errors
vim +764 arch/powerpc/kernel/pci-common.c
13dccb9e Benjamin Herrenschmidt 2007-12-11 642
13dccb9e Benjamin Herrenschmidt 2007-12-11 643 /**
13dccb9e Benjamin Herrenschmidt 2007-12-11 644 * pci_process_bridge_OF_ranges - Parse PCI bridge resources from device tree
13dccb9e Benjamin Herrenschmidt 2007-12-11 645 * @hose: newly allocated pci_controller to be setup
13dccb9e Benjamin Herrenschmidt 2007-12-11 646 * @dev: device node of the host bridge
13dccb9e Benjamin Herrenschmidt 2007-12-11 647 * @primary: set if primary bus (32 bits only, soon to be deprecated)
13dccb9e Benjamin Herrenschmidt 2007-12-11 648 *
13dccb9e Benjamin Herrenschmidt 2007-12-11 649 * This function will parse the "ranges" property of a PCI host bridge device
13dccb9e Benjamin Herrenschmidt 2007-12-11 650 * node and setup the resource mapping of a pci controller based on its
13dccb9e Benjamin Herrenschmidt 2007-12-11 651 * content.
13dccb9e Benjamin Herrenschmidt 2007-12-11 652 *
13dccb9e Benjamin Herrenschmidt 2007-12-11 653 * Life would be boring if it wasn't for a few issues that we have to deal
13dccb9e Benjamin Herrenschmidt 2007-12-11 654 * with here:
13dccb9e Benjamin Herrenschmidt 2007-12-11 655 *
13dccb9e Benjamin Herrenschmidt 2007-12-11 656 * - We can only cope with one IO space range and up to 3 Memory space
13dccb9e Benjamin Herrenschmidt 2007-12-11 657 * ranges. However, some machines (thanks Apple !) tend to split their
13dccb9e Benjamin Herrenschmidt 2007-12-11 658 * space into lots of small contiguous ranges. So we have to coalesce.
13dccb9e Benjamin Herrenschmidt 2007-12-11 659 *
13dccb9e Benjamin Herrenschmidt 2007-12-11 660 * - Some busses have IO space not starting at 0, which causes trouble with
13dccb9e Benjamin Herrenschmidt 2007-12-11 661 * the way we do our IO resource renumbering. The code somewhat deals with
13dccb9e Benjamin Herrenschmidt 2007-12-11 662 * it for 64 bits but I would expect problems on 32 bits.
13dccb9e Benjamin Herrenschmidt 2007-12-11 663 *
13dccb9e Benjamin Herrenschmidt 2007-12-11 664 * - Some 32 bits platforms such as 4xx can have physical space larger than
13dccb9e Benjamin Herrenschmidt 2007-12-11 665 * 32 bits so we need to use 64 bits values for the parsing
13dccb9e Benjamin Herrenschmidt 2007-12-11 666 */
cad5cef6 Greg Kroah-Hartman 2012-12-21 667 void pci_process_bridge_OF_ranges(struct pci_controller *hose,
cad5cef6 Greg Kroah-Hartman 2012-12-21 668 struct device_node *dev, int primary)
13dccb9e Benjamin Herrenschmidt 2007-12-11 669 {
858957ab Kevin Hao 2013-05-16 670 int memno = 0;
13dccb9e Benjamin Herrenschmidt 2007-12-11 671 struct resource *res;
654837e8 Andrew Murray 2014-02-25 672 struct of_pci_range range;
654837e8 Andrew Murray 2014-02-25 673 struct of_pci_range_parser parser;
13dccb9e Benjamin Herrenschmidt 2007-12-11 674
b7c670d6 Rob Herring 2017-08-21 675 printk(KERN_INFO "PCI host bridge %pOF %s ranges:\n",
b7c670d6 Rob Herring 2017-08-21 676 dev, primary ? "(primary)" : "");
13dccb9e Benjamin Herrenschmidt 2007-12-11 677
654837e8 Andrew Murray 2014-02-25 678 /* Check for ranges property */
654837e8 Andrew Murray 2014-02-25 679 if (of_pci_range_parser_init(&parser, dev))
13dccb9e Benjamin Herrenschmidt 2007-12-11 680 return;
13dccb9e Benjamin Herrenschmidt 2007-12-11 681
13dccb9e Benjamin Herrenschmidt 2007-12-11 682 /* Parse it */
654837e8 Andrew Murray 2014-02-25 683 for_each_of_pci_range(&parser, &range) {
e9f82cb7 Benjamin Herrenschmidt 2008-10-14 684 /* If we failed translation or got a zero-sized region
e9f82cb7 Benjamin Herrenschmidt 2008-10-14 685 * (some FW try to feed us with non sensical zero sized regions
e9f82cb7 Benjamin Herrenschmidt 2008-10-14 686 * such as power3 which look like some kind of attempt at exposing
e9f82cb7 Benjamin Herrenschmidt 2008-10-14 687 * the VGA memory hole)
e9f82cb7 Benjamin Herrenschmidt 2008-10-14 688 */
654837e8 Andrew Murray 2014-02-25 689 if (range.cpu_addr == OF_BAD_ADDR || range.size == 0)
13dccb9e Benjamin Herrenschmidt 2007-12-11 690 continue;
13dccb9e Benjamin Herrenschmidt 2007-12-11 691
13dccb9e Benjamin Herrenschmidt 2007-12-11 692 /* Act based on address space type */
13dccb9e Benjamin Herrenschmidt 2007-12-11 693 res = NULL;
654837e8 Andrew Murray 2014-02-25 694 switch (range.flags & IORESOURCE_TYPE_BITS) {
654837e8 Andrew Murray 2014-02-25 695 case IORESOURCE_IO:
13dccb9e Benjamin Herrenschmidt 2007-12-11 696 printk(KERN_INFO
13dccb9e Benjamin Herrenschmidt 2007-12-11 697 " IO 0x%016llx..0x%016llx -> 0x%016llx\n",
654837e8 Andrew Murray 2014-02-25 698 range.cpu_addr, range.cpu_addr + range.size - 1,
654837e8 Andrew Murray 2014-02-25 699 range.pci_addr);
13dccb9e Benjamin Herrenschmidt 2007-12-11 700
13dccb9e Benjamin Herrenschmidt 2007-12-11 701 /* We support only one IO range */
13dccb9e Benjamin Herrenschmidt 2007-12-11 702 if (hose->pci_io_size) {
13dccb9e Benjamin Herrenschmidt 2007-12-11 703 printk(KERN_INFO
13dccb9e Benjamin Herrenschmidt 2007-12-11 704 " \\--> Skipped (too many) !\n");
13dccb9e Benjamin Herrenschmidt 2007-12-11 705 continue;
13dccb9e Benjamin Herrenschmidt 2007-12-11 706 }
13dccb9e Benjamin Herrenschmidt 2007-12-11 707 #ifdef CONFIG_PPC32
13dccb9e Benjamin Herrenschmidt 2007-12-11 708 /* On 32 bits, limit I/O space to 16MB */
654837e8 Andrew Murray 2014-02-25 709 if (range.size > 0x01000000)
654837e8 Andrew Murray 2014-02-25 710 range.size = 0x01000000;
13dccb9e Benjamin Herrenschmidt 2007-12-11 711
13dccb9e Benjamin Herrenschmidt 2007-12-11 712 /* 32 bits needs to map IOs here */
654837e8 Andrew Murray 2014-02-25 713 hose->io_base_virt = ioremap(range.cpu_addr,
654837e8 Andrew Murray 2014-02-25 714 range.size);
13dccb9e Benjamin Herrenschmidt 2007-12-11 715
13dccb9e Benjamin Herrenschmidt 2007-12-11 716 /* Expect trouble if pci_addr is not 0 */
13dccb9e Benjamin Herrenschmidt 2007-12-11 717 if (primary)
13dccb9e Benjamin Herrenschmidt 2007-12-11 718 isa_io_base =
13dccb9e Benjamin Herrenschmidt 2007-12-11 719 (unsigned long)hose->io_base_virt;
13dccb9e Benjamin Herrenschmidt 2007-12-11 720 #endif /* CONFIG_PPC32 */
13dccb9e Benjamin Herrenschmidt 2007-12-11 721 /* pci_io_size and io_base_phys always represent IO
13dccb9e Benjamin Herrenschmidt 2007-12-11 722 * space starting at 0 so we factor in pci_addr
13dccb9e Benjamin Herrenschmidt 2007-12-11 723 */
654837e8 Andrew Murray 2014-02-25 724 hose->pci_io_size = range.pci_addr + range.size;
654837e8 Andrew Murray 2014-02-25 725 hose->io_base_phys = range.cpu_addr - range.pci_addr;
13dccb9e Benjamin Herrenschmidt 2007-12-11 726
13dccb9e Benjamin Herrenschmidt 2007-12-11 727 /* Build resource */
13dccb9e Benjamin Herrenschmidt 2007-12-11 728 res = &hose->io_resource;
654837e8 Andrew Murray 2014-02-25 729 range.cpu_addr = range.pci_addr;
13dccb9e Benjamin Herrenschmidt 2007-12-11 730 break;
654837e8 Andrew Murray 2014-02-25 731 case IORESOURCE_MEM:
13dccb9e Benjamin Herrenschmidt 2007-12-11 732 printk(KERN_INFO
13dccb9e Benjamin Herrenschmidt 2007-12-11 733 " MEM 0x%016llx..0x%016llx -> 0x%016llx %s\n",
654837e8 Andrew Murray 2014-02-25 734 range.cpu_addr, range.cpu_addr + range.size - 1,
654837e8 Andrew Murray 2014-02-25 735 range.pci_addr,
654837e8 Andrew Murray 2014-02-25 736 (range.pci_space & 0x40000000) ?
654837e8 Andrew Murray 2014-02-25 737 "Prefetch" : "");
13dccb9e Benjamin Herrenschmidt 2007-12-11 738
13dccb9e Benjamin Herrenschmidt 2007-12-11 739 /* We support only 3 memory ranges */
13dccb9e Benjamin Herrenschmidt 2007-12-11 740 if (memno >= 3) {
13dccb9e Benjamin Herrenschmidt 2007-12-11 741 printk(KERN_INFO
13dccb9e Benjamin Herrenschmidt 2007-12-11 742 " \\--> Skipped (too many) !\n");
13dccb9e Benjamin Herrenschmidt 2007-12-11 743 continue;
13dccb9e Benjamin Herrenschmidt 2007-12-11 744 }
13dccb9e Benjamin Herrenschmidt 2007-12-11 745 /* Handles ISA memory hole space here */
654837e8 Andrew Murray 2014-02-25 746 if (range.pci_addr == 0) {
13dccb9e Benjamin Herrenschmidt 2007-12-11 747 if (primary || isa_mem_base == 0)
654837e8 Andrew Murray 2014-02-25 748 isa_mem_base = range.cpu_addr;
654837e8 Andrew Murray 2014-02-25 749 hose->isa_mem_phys = range.cpu_addr;
654837e8 Andrew Murray 2014-02-25 750 hose->isa_mem_size = range.size;
13dccb9e Benjamin Herrenschmidt 2007-12-11 751 }
13dccb9e Benjamin Herrenschmidt 2007-12-11 752
13dccb9e Benjamin Herrenschmidt 2007-12-11 753 /* Build resource */
654837e8 Andrew Murray 2014-02-25 754 hose->mem_offset[memno] = range.cpu_addr -
654837e8 Andrew Murray 2014-02-25 755 range.pci_addr;
13dccb9e Benjamin Herrenschmidt 2007-12-11 756 res = &hose->mem_resources[memno++];
13dccb9e Benjamin Herrenschmidt 2007-12-11 757 break;
13dccb9e Benjamin Herrenschmidt 2007-12-11 758 }
13dccb9e Benjamin Herrenschmidt 2007-12-11 759 if (res != NULL) {
aeba3731 Michael Ellerman 2014-10-16 760 res->name = dev->full_name;
aeba3731 Michael Ellerman 2014-10-16 761 res->flags = range.flags;
aeba3731 Michael Ellerman 2014-10-16 762 res->start = range.cpu_addr;
aeba3731 Michael Ellerman 2014-10-16 763 res->end = range.cpu_addr + range.size - 1;
aeba3731 Michael Ellerman 2014-10-16 @764 res->parent = res->child = res->sibling = NULL;
13dccb9e Benjamin Herrenschmidt 2007-12-11 765 }
13dccb9e Benjamin Herrenschmidt 2007-12-11 766 }
13dccb9e Benjamin Herrenschmidt 2007-12-11 767 }
fa462f2d Benjamin Herrenschmidt 2007-12-20 768
:::::: The code at line 764 was first introduced by commit
:::::: aeba3731b150188685225b510886f1370d8814de powerpc/pci: Fix IO space breakage after of_pci_range_to_resource() change
:::::: TO: Michael Ellerman <mpe@ellerman.id.au>
:::::: CC: Michael Ellerman <mpe@ellerman.id.au>
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 23368 bytes --]
^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: [PATCH v4 1/3] resource: Use list_head to link sibling resource
@ 2018-05-07 11:42 ` kbuild test robot
0 siblings, 0 replies; 42+ messages in thread
From: kbuild test robot @ 2018-05-07 11:42 UTC (permalink / raw)
Cc: nicolas.pitre-QSEj5FYQhm4dnm+yROfE0A, brijesh.singh-5C7GfCeVMHo,
devicetree-u79uwXL29TY76Z2rM5mHXA, airlied-cv59FeDIM0c,
linux-pci-u79uwXL29TY76Z2rM5mHXA,
richard.weiyang-Re5JQEeQqe8AvxtiuMwx3w,
keith.busch-ral2JQCrhuEAvxtiuMwx3w,
jcmvbkbc-Re5JQEeQqe8AvxtiuMwx3w,
baiyaowei-0p4V/sDNsUmm0O/7XYngnFaTQe2KTcn/,
kys-0li6OtcxBFHby3iVrkZq2A, frowand.list-Re5JQEeQqe8AvxtiuMwx3w,
lorenzo.pieralisi-5wv7dgnIgG8, sthemmin-0li6OtcxBFHby3iVrkZq2A,
Baoquan He, linux-nvdimm-hn68Rpc1hR1g9hUCZPvPmw,
patrik.r.jakobsson-Re5JQEeQqe8AvxtiuMwx3w,
linux-input-u79uwXL29TY76Z2rM5mHXA,
gustavo-THi1TnShQwVAfugRpC6u6w, bp-l3A5Bk7waGM,
dyoung-H+wXaHxf7aLQT0dZR+AlfA, ebiederm-aS9lmoZGLiVWk0Htik3J/w,
thomas.lendacky-5C7GfCeVMHo, haiyangz-0li6OtcxBFHby3iVrkZq2A,
maarten.lankhorst-VuQAYsv1563Yd54FQh9/CA,
josh-iaAMLnmF4UmaiuxdJuQwMA, jglisse-H+wXaHxf7aLQT0dZR+AlfA,
robh+dt-DgEjT+Ai2ygdnm+yROfE0A, seanpaul-F7+t8E8rja9g9hUCZPvPmw,
bhelgaas-hpIqsD4AKlfQT0dZR+AlfA, tglx-hfZtesqFncYOwBW4kG4KsQ,
yinghai-DgEjT+Ai2ygdnm+yROfE0A,
jonathan.derrick-ral2JQCrhuEAvxtiuMwx3w,
chris-YvXeqwSYzG2sTnJN9+BGXg, monstr-pSz03upnqPeHXe+LvDLADg,
linux-parisc-u79uwXL29TY76Z2rM5mHXA,
gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r, dmitry.torokhov
Hi Baoquan,
I love your patch! Yet something to improve:
[auto build test ERROR on linus/master]
[also build test ERROR on v4.17-rc4 next-20180504]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
url: https://github.com/0day-ci/linux/commits/Baoquan-He/resource-Use-list_head-to-link-sibling-resource/20180507-144345
config: powerpc-defconfig (attached as .config)
compiler: powerpc64-linux-gnu-gcc (Debian 7.2.0-11) 7.2.0
reproduce:
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
make.cross ARCH=powerpc
All errors (new ones prefixed by >>):
arch/powerpc/kernel/pci-common.c: In function 'pci_process_bridge_OF_ranges':
>> arch/powerpc/kernel/pci-common.c:764:44: error: incompatible types when assigning to type 'struct list_head' from type 'void *'
res->parent = res->child = res->sibling = NULL;
^
arch/powerpc/kernel/pci-common.c: In function 'reparent_resources':
>> arch/powerpc/kernel/pci-common.c:1100:10: error: assignment from incompatible pointer type [-Werror=incompatible-pointer-types]
for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) {
^
arch/powerpc/kernel/pci-common.c:1100:50: error: assignment from incompatible pointer type [-Werror=incompatible-pointer-types]
for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) {
^
>> arch/powerpc/kernel/pci-common.c:1113:13: error: incompatible types when assigning to type 'struct list_head' from type 'struct resource *'
res->child = *firstpp;
^
arch/powerpc/kernel/pci-common.c:1114:15: error: incompatible types when assigning to type 'struct list_head' from type 'struct resource *'
res->sibling = *pp;
^
>> arch/powerpc/kernel/pci-common.c:1117:9: error: incompatible types when assigning to type 'struct resource *' from type 'struct list_head'
for (p = res->child; p != NULL; p = p->sibling) {
^
arch/powerpc/kernel/pci-common.c:1117:36: error: incompatible types when assigning to type 'struct resource *' from type 'struct list_head'
for (p = res->child; p != NULL; p = p->sibling) {
^
cc1: all warnings being treated as errors
vim +764 arch/powerpc/kernel/pci-common.c
13dccb9e Benjamin Herrenschmidt 2007-12-11 642
13dccb9e Benjamin Herrenschmidt 2007-12-11 643 /**
13dccb9e Benjamin Herrenschmidt 2007-12-11 644 * pci_process_bridge_OF_ranges - Parse PCI bridge resources from device tree
13dccb9e Benjamin Herrenschmidt 2007-12-11 645 * @hose: newly allocated pci_controller to be setup
13dccb9e Benjamin Herrenschmidt 2007-12-11 646 * @dev: device node of the host bridge
13dccb9e Benjamin Herrenschmidt 2007-12-11 647 * @primary: set if primary bus (32 bits only, soon to be deprecated)
13dccb9e Benjamin Herrenschmidt 2007-12-11 648 *
13dccb9e Benjamin Herrenschmidt 2007-12-11 649 * This function will parse the "ranges" property of a PCI host bridge device
13dccb9e Benjamin Herrenschmidt 2007-12-11 650 * node and setup the resource mapping of a pci controller based on its
13dccb9e Benjamin Herrenschmidt 2007-12-11 651 * content.
13dccb9e Benjamin Herrenschmidt 2007-12-11 652 *
13dccb9e Benjamin Herrenschmidt 2007-12-11 653 * Life would be boring if it wasn't for a few issues that we have to deal
13dccb9e Benjamin Herrenschmidt 2007-12-11 654 * with here:
13dccb9e Benjamin Herrenschmidt 2007-12-11 655 *
13dccb9e Benjamin Herrenschmidt 2007-12-11 656 * - We can only cope with one IO space range and up to 3 Memory space
13dccb9e Benjamin Herrenschmidt 2007-12-11 657 * ranges. However, some machines (thanks Apple !) tend to split their
13dccb9e Benjamin Herrenschmidt 2007-12-11 658 * space into lots of small contiguous ranges. So we have to coalesce.
13dccb9e Benjamin Herrenschmidt 2007-12-11 659 *
13dccb9e Benjamin Herrenschmidt 2007-12-11 660 * - Some busses have IO space not starting at 0, which causes trouble with
13dccb9e Benjamin Herrenschmidt 2007-12-11 661 * the way we do our IO resource renumbering. The code somewhat deals with
13dccb9e Benjamin Herrenschmidt 2007-12-11 662 * it for 64 bits but I would expect problems on 32 bits.
13dccb9e Benjamin Herrenschmidt 2007-12-11 663 *
13dccb9e Benjamin Herrenschmidt 2007-12-11 664 * - Some 32 bits platforms such as 4xx can have physical space larger than
13dccb9e Benjamin Herrenschmidt 2007-12-11 665 * 32 bits so we need to use 64 bits values for the parsing
13dccb9e Benjamin Herrenschmidt 2007-12-11 666 */
cad5cef6 Greg Kroah-Hartman 2012-12-21 667 void pci_process_bridge_OF_ranges(struct pci_controller *hose,
cad5cef6 Greg Kroah-Hartman 2012-12-21 668 struct device_node *dev, int primary)
13dccb9e Benjamin Herrenschmidt 2007-12-11 669 {
858957ab Kevin Hao 2013-05-16 670 int memno = 0;
13dccb9e Benjamin Herrenschmidt 2007-12-11 671 struct resource *res;
654837e8 Andrew Murray 2014-02-25 672 struct of_pci_range range;
654837e8 Andrew Murray 2014-02-25 673 struct of_pci_range_parser parser;
13dccb9e Benjamin Herrenschmidt 2007-12-11 674
b7c670d6 Rob Herring 2017-08-21 675 printk(KERN_INFO "PCI host bridge %pOF %s ranges:\n",
b7c670d6 Rob Herring 2017-08-21 676 dev, primary ? "(primary)" : "");
13dccb9e Benjamin Herrenschmidt 2007-12-11 677
654837e8 Andrew Murray 2014-02-25 678 /* Check for ranges property */
654837e8 Andrew Murray 2014-02-25 679 if (of_pci_range_parser_init(&parser, dev))
13dccb9e Benjamin Herrenschmidt 2007-12-11 680 return;
13dccb9e Benjamin Herrenschmidt 2007-12-11 681
13dccb9e Benjamin Herrenschmidt 2007-12-11 682 /* Parse it */
654837e8 Andrew Murray 2014-02-25 683 for_each_of_pci_range(&parser, &range) {
e9f82cb7 Benjamin Herrenschmidt 2008-10-14 684 /* If we failed translation or got a zero-sized region
e9f82cb7 Benjamin Herrenschmidt 2008-10-14 685 * (some FW try to feed us with non sensical zero sized regions
e9f82cb7 Benjamin Herrenschmidt 2008-10-14 686 * such as power3 which look like some kind of attempt at exposing
e9f82cb7 Benjamin Herrenschmidt 2008-10-14 687 * the VGA memory hole)
e9f82cb7 Benjamin Herrenschmidt 2008-10-14 688 */
654837e8 Andrew Murray 2014-02-25 689 if (range.cpu_addr == OF_BAD_ADDR || range.size == 0)
13dccb9e Benjamin Herrenschmidt 2007-12-11 690 continue;
13dccb9e Benjamin Herrenschmidt 2007-12-11 691
13dccb9e Benjamin Herrenschmidt 2007-12-11 692 /* Act based on address space type */
13dccb9e Benjamin Herrenschmidt 2007-12-11 693 res = NULL;
654837e8 Andrew Murray 2014-02-25 694 switch (range.flags & IORESOURCE_TYPE_BITS) {
654837e8 Andrew Murray 2014-02-25 695 case IORESOURCE_IO:
13dccb9e Benjamin Herrenschmidt 2007-12-11 696 printk(KERN_INFO
13dccb9e Benjamin Herrenschmidt 2007-12-11 697 " IO 0x%016llx..0x%016llx -> 0x%016llx\n",
654837e8 Andrew Murray 2014-02-25 698 range.cpu_addr, range.cpu_addr + range.size - 1,
654837e8 Andrew Murray 2014-02-25 699 range.pci_addr);
13dccb9e Benjamin Herrenschmidt 2007-12-11 700
13dccb9e Benjamin Herrenschmidt 2007-12-11 701 /* We support only one IO range */
13dccb9e Benjamin Herrenschmidt 2007-12-11 702 if (hose->pci_io_size) {
13dccb9e Benjamin Herrenschmidt 2007-12-11 703 printk(KERN_INFO
13dccb9e Benjamin Herrenschmidt 2007-12-11 704 " \\--> Skipped (too many) !\n");
13dccb9e Benjamin Herrenschmidt 2007-12-11 705 continue;
13dccb9e Benjamin Herrenschmidt 2007-12-11 706 }
13dccb9e Benjamin Herrenschmidt 2007-12-11 707 #ifdef CONFIG_PPC32
13dccb9e Benjamin Herrenschmidt 2007-12-11 708 /* On 32 bits, limit I/O space to 16MB */
654837e8 Andrew Murray 2014-02-25 709 if (range.size > 0x01000000)
654837e8 Andrew Murray 2014-02-25 710 range.size = 0x01000000;
13dccb9e Benjamin Herrenschmidt 2007-12-11 711
13dccb9e Benjamin Herrenschmidt 2007-12-11 712 /* 32 bits needs to map IOs here */
654837e8 Andrew Murray 2014-02-25 713 hose->io_base_virt = ioremap(range.cpu_addr,
654837e8 Andrew Murray 2014-02-25 714 range.size);
13dccb9e Benjamin Herrenschmidt 2007-12-11 715
13dccb9e Benjamin Herrenschmidt 2007-12-11 716 /* Expect trouble if pci_addr is not 0 */
13dccb9e Benjamin Herrenschmidt 2007-12-11 717 if (primary)
13dccb9e Benjamin Herrenschmidt 2007-12-11 718 isa_io_base =
13dccb9e Benjamin Herrenschmidt 2007-12-11 719 (unsigned long)hose->io_base_virt;
13dccb9e Benjamin Herrenschmidt 2007-12-11 720 #endif /* CONFIG_PPC32 */
13dccb9e Benjamin Herrenschmidt 2007-12-11 721 /* pci_io_size and io_base_phys always represent IO
13dccb9e Benjamin Herrenschmidt 2007-12-11 722 * space starting at 0 so we factor in pci_addr
13dccb9e Benjamin Herrenschmidt 2007-12-11 723 */
654837e8 Andrew Murray 2014-02-25 724 hose->pci_io_size = range.pci_addr + range.size;
654837e8 Andrew Murray 2014-02-25 725 hose->io_base_phys = range.cpu_addr - range.pci_addr;
13dccb9e Benjamin Herrenschmidt 2007-12-11 726
13dccb9e Benjamin Herrenschmidt 2007-12-11 727 /* Build resource */
13dccb9e Benjamin Herrenschmidt 2007-12-11 728 res = &hose->io_resource;
654837e8 Andrew Murray 2014-02-25 729 range.cpu_addr = range.pci_addr;
13dccb9e Benjamin Herrenschmidt 2007-12-11 730 break;
654837e8 Andrew Murray 2014-02-25 731 case IORESOURCE_MEM:
13dccb9e Benjamin Herrenschmidt 2007-12-11 732 printk(KERN_INFO
13dccb9e Benjamin Herrenschmidt 2007-12-11 733 " MEM 0x%016llx..0x%016llx -> 0x%016llx %s\n",
654837e8 Andrew Murray 2014-02-25 734 range.cpu_addr, range.cpu_addr + range.size - 1,
654837e8 Andrew Murray 2014-02-25 735 range.pci_addr,
654837e8 Andrew Murray 2014-02-25 736 (range.pci_space & 0x40000000) ?
654837e8 Andrew Murray 2014-02-25 737 "Prefetch" : "");
13dccb9e Benjamin Herrenschmidt 2007-12-11 738
13dccb9e Benjamin Herrenschmidt 2007-12-11 739 /* We support only 3 memory ranges */
13dccb9e Benjamin Herrenschmidt 2007-12-11 740 if (memno >= 3) {
13dccb9e Benjamin Herrenschmidt 2007-12-11 741 printk(KERN_INFO
13dccb9e Benjamin Herrenschmidt 2007-12-11 742 " \\--> Skipped (too many) !\n");
13dccb9e Benjamin Herrenschmidt 2007-12-11 743 continue;
13dccb9e Benjamin Herrenschmidt 2007-12-11 744 }
13dccb9e Benjamin Herrenschmidt 2007-12-11 745 /* Handles ISA memory hole space here */
654837e8 Andrew Murray 2014-02-25 746 if (range.pci_addr == 0) {
13dccb9e Benjamin Herrenschmidt 2007-12-11 747 if (primary || isa_mem_base == 0)
654837e8 Andrew Murray 2014-02-25 748 isa_mem_base = range.cpu_addr;
654837e8 Andrew Murray 2014-02-25 749 hose->isa_mem_phys = range.cpu_addr;
654837e8 Andrew Murray 2014-02-25 750 hose->isa_mem_size = range.size;
13dccb9e Benjamin Herrenschmidt 2007-12-11 751 }
13dccb9e Benjamin Herrenschmidt 2007-12-11 752
13dccb9e Benjamin Herrenschmidt 2007-12-11 753 /* Build resource */
654837e8 Andrew Murray 2014-02-25 754 hose->mem_offset[memno] = range.cpu_addr -
654837e8 Andrew Murray 2014-02-25 755 range.pci_addr;
13dccb9e Benjamin Herrenschmidt 2007-12-11 756 res = &hose->mem_resources[memno++];
13dccb9e Benjamin Herrenschmidt 2007-12-11 757 break;
13dccb9e Benjamin Herrenschmidt 2007-12-11 758 }
13dccb9e Benjamin Herrenschmidt 2007-12-11 759 if (res != NULL) {
aeba3731 Michael Ellerman 2014-10-16 760 res->name = dev->full_name;
aeba3731 Michael Ellerman 2014-10-16 761 res->flags = range.flags;
aeba3731 Michael Ellerman 2014-10-16 762 res->start = range.cpu_addr;
aeba3731 Michael Ellerman 2014-10-16 763 res->end = range.cpu_addr + range.size - 1;
aeba3731 Michael Ellerman 2014-10-16 @764 res->parent = res->child = res->sibling = NULL;
13dccb9e Benjamin Herrenschmidt 2007-12-11 765 }
13dccb9e Benjamin Herrenschmidt 2007-12-11 766 }
13dccb9e Benjamin Herrenschmidt 2007-12-11 767 }
fa462f2d Benjamin Herrenschmidt 2007-12-20 768
:::::: The code at line 764 was first introduced by commit
:::::: aeba3731b150188685225b510886f1370d8814de powerpc/pci: Fix IO space breakage after of_pci_range_to_resource() change
:::::: TO: Michael Ellerman <mpe-Gsx/Oe8HsFggBc27wqDAHg@public.gmane.org>
:::::: CC: Michael Ellerman <mpe-Gsx/Oe8HsFggBc27wqDAHg@public.gmane.org>
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: [PATCH v4 1/3] resource: Use list_head to link sibling resource
@ 2018-05-07 11:42 ` kbuild test robot
0 siblings, 0 replies; 42+ messages in thread
From: kbuild test robot @ 2018-05-07 11:42 UTC (permalink / raw)
To: Baoquan He
Cc: nicolas.pitre, brijesh.singh, devicetree, airlied, linux-pci,
richard.weiyang, keith.busch, jcmvbkbc, baiyaowei, frowand.list,
dan.j.williams, lorenzo.pieralisi, sthemmin, Baoquan He,
linux-nvdimm, patrik.r.jakobsson, linux-input, gustavo, bp,
dyoung, vgoyal, ebiederm, thomas.lendacky, haiyangz,
maarten.lankhorst, josh, jglisse, robh+dt, seanpaul, bhelgaas,
tglx, yinghai, jonathan.derrick, chris, monstr, linux-parisc,
gregkh, dmitry.torokhov, kexec, linux-kernel, kbuild-all, devel,
akpm, fengguang.wu, davem
[-- Attachment #1: Type: text/plain, Size: 13194 bytes --]
Hi Baoquan,
I love your patch! Yet something to improve:
[auto build test ERROR on linus/master]
[also build test ERROR on v4.17-rc4 next-20180504]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
url: https://github.com/0day-ci/linux/commits/Baoquan-He/resource-Use-list_head-to-link-sibling-resource/20180507-144345
config: powerpc-defconfig (attached as .config)
compiler: powerpc64-linux-gnu-gcc (Debian 7.2.0-11) 7.2.0
reproduce:
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
make.cross ARCH=powerpc
All errors (new ones prefixed by >>):
arch/powerpc/kernel/pci-common.c: In function 'pci_process_bridge_OF_ranges':
>> arch/powerpc/kernel/pci-common.c:764:44: error: incompatible types when assigning to type 'struct list_head' from type 'void *'
res->parent = res->child = res->sibling = NULL;
^
arch/powerpc/kernel/pci-common.c: In function 'reparent_resources':
>> arch/powerpc/kernel/pci-common.c:1100:10: error: assignment from incompatible pointer type [-Werror=incompatible-pointer-types]
for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) {
^
arch/powerpc/kernel/pci-common.c:1100:50: error: assignment from incompatible pointer type [-Werror=incompatible-pointer-types]
for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) {
^
>> arch/powerpc/kernel/pci-common.c:1113:13: error: incompatible types when assigning to type 'struct list_head' from type 'struct resource *'
res->child = *firstpp;
^
arch/powerpc/kernel/pci-common.c:1114:15: error: incompatible types when assigning to type 'struct list_head' from type 'struct resource *'
res->sibling = *pp;
^
>> arch/powerpc/kernel/pci-common.c:1117:9: error: incompatible types when assigning to type 'struct resource *' from type 'struct list_head'
for (p = res->child; p != NULL; p = p->sibling) {
^
arch/powerpc/kernel/pci-common.c:1117:36: error: incompatible types when assigning to type 'struct resource *' from type 'struct list_head'
for (p = res->child; p != NULL; p = p->sibling) {
^
cc1: all warnings being treated as errors
vim +764 arch/powerpc/kernel/pci-common.c
13dccb9e Benjamin Herrenschmidt 2007-12-11 642
13dccb9e Benjamin Herrenschmidt 2007-12-11 643 /**
13dccb9e Benjamin Herrenschmidt 2007-12-11 644 * pci_process_bridge_OF_ranges - Parse PCI bridge resources from device tree
13dccb9e Benjamin Herrenschmidt 2007-12-11 645 * @hose: newly allocated pci_controller to be setup
13dccb9e Benjamin Herrenschmidt 2007-12-11 646 * @dev: device node of the host bridge
13dccb9e Benjamin Herrenschmidt 2007-12-11 647 * @primary: set if primary bus (32 bits only, soon to be deprecated)
13dccb9e Benjamin Herrenschmidt 2007-12-11 648 *
13dccb9e Benjamin Herrenschmidt 2007-12-11 649 * This function will parse the "ranges" property of a PCI host bridge device
13dccb9e Benjamin Herrenschmidt 2007-12-11 650 * node and setup the resource mapping of a pci controller based on its
13dccb9e Benjamin Herrenschmidt 2007-12-11 651 * content.
13dccb9e Benjamin Herrenschmidt 2007-12-11 652 *
13dccb9e Benjamin Herrenschmidt 2007-12-11 653 * Life would be boring if it wasn't for a few issues that we have to deal
13dccb9e Benjamin Herrenschmidt 2007-12-11 654 * with here:
13dccb9e Benjamin Herrenschmidt 2007-12-11 655 *
13dccb9e Benjamin Herrenschmidt 2007-12-11 656 * - We can only cope with one IO space range and up to 3 Memory space
13dccb9e Benjamin Herrenschmidt 2007-12-11 657 * ranges. However, some machines (thanks Apple !) tend to split their
13dccb9e Benjamin Herrenschmidt 2007-12-11 658 * space into lots of small contiguous ranges. So we have to coalesce.
13dccb9e Benjamin Herrenschmidt 2007-12-11 659 *
13dccb9e Benjamin Herrenschmidt 2007-12-11 660 * - Some busses have IO space not starting at 0, which causes trouble with
13dccb9e Benjamin Herrenschmidt 2007-12-11 661 * the way we do our IO resource renumbering. The code somewhat deals with
13dccb9e Benjamin Herrenschmidt 2007-12-11 662 * it for 64 bits but I would expect problems on 32 bits.
13dccb9e Benjamin Herrenschmidt 2007-12-11 663 *
13dccb9e Benjamin Herrenschmidt 2007-12-11 664 * - Some 32 bits platforms such as 4xx can have physical space larger than
13dccb9e Benjamin Herrenschmidt 2007-12-11 665 * 32 bits so we need to use 64 bits values for the parsing
13dccb9e Benjamin Herrenschmidt 2007-12-11 666 */
cad5cef6 Greg Kroah-Hartman 2012-12-21 667 void pci_process_bridge_OF_ranges(struct pci_controller *hose,
cad5cef6 Greg Kroah-Hartman 2012-12-21 668 struct device_node *dev, int primary)
13dccb9e Benjamin Herrenschmidt 2007-12-11 669 {
858957ab Kevin Hao 2013-05-16 670 int memno = 0;
13dccb9e Benjamin Herrenschmidt 2007-12-11 671 struct resource *res;
654837e8 Andrew Murray 2014-02-25 672 struct of_pci_range range;
654837e8 Andrew Murray 2014-02-25 673 struct of_pci_range_parser parser;
13dccb9e Benjamin Herrenschmidt 2007-12-11 674
b7c670d6 Rob Herring 2017-08-21 675 printk(KERN_INFO "PCI host bridge %pOF %s ranges:\n",
b7c670d6 Rob Herring 2017-08-21 676 dev, primary ? "(primary)" : "");
13dccb9e Benjamin Herrenschmidt 2007-12-11 677
654837e8 Andrew Murray 2014-02-25 678 /* Check for ranges property */
654837e8 Andrew Murray 2014-02-25 679 if (of_pci_range_parser_init(&parser, dev))
13dccb9e Benjamin Herrenschmidt 2007-12-11 680 return;
13dccb9e Benjamin Herrenschmidt 2007-12-11 681
13dccb9e Benjamin Herrenschmidt 2007-12-11 682 /* Parse it */
654837e8 Andrew Murray 2014-02-25 683 for_each_of_pci_range(&parser, &range) {
e9f82cb7 Benjamin Herrenschmidt 2008-10-14 684 /* If we failed translation or got a zero-sized region
e9f82cb7 Benjamin Herrenschmidt 2008-10-14 685 * (some FW try to feed us with non sensical zero sized regions
e9f82cb7 Benjamin Herrenschmidt 2008-10-14 686 * such as power3 which look like some kind of attempt at exposing
e9f82cb7 Benjamin Herrenschmidt 2008-10-14 687 * the VGA memory hole)
e9f82cb7 Benjamin Herrenschmidt 2008-10-14 688 */
654837e8 Andrew Murray 2014-02-25 689 if (range.cpu_addr == OF_BAD_ADDR || range.size == 0)
13dccb9e Benjamin Herrenschmidt 2007-12-11 690 continue;
13dccb9e Benjamin Herrenschmidt 2007-12-11 691
13dccb9e Benjamin Herrenschmidt 2007-12-11 692 /* Act based on address space type */
13dccb9e Benjamin Herrenschmidt 2007-12-11 693 res = NULL;
654837e8 Andrew Murray 2014-02-25 694 switch (range.flags & IORESOURCE_TYPE_BITS) {
654837e8 Andrew Murray 2014-02-25 695 case IORESOURCE_IO:
13dccb9e Benjamin Herrenschmidt 2007-12-11 696 printk(KERN_INFO
13dccb9e Benjamin Herrenschmidt 2007-12-11 697 " IO 0x%016llx..0x%016llx -> 0x%016llx\n",
654837e8 Andrew Murray 2014-02-25 698 range.cpu_addr, range.cpu_addr + range.size - 1,
654837e8 Andrew Murray 2014-02-25 699 range.pci_addr);
13dccb9e Benjamin Herrenschmidt 2007-12-11 700
13dccb9e Benjamin Herrenschmidt 2007-12-11 701 /* We support only one IO range */
13dccb9e Benjamin Herrenschmidt 2007-12-11 702 if (hose->pci_io_size) {
13dccb9e Benjamin Herrenschmidt 2007-12-11 703 printk(KERN_INFO
13dccb9e Benjamin Herrenschmidt 2007-12-11 704 " \\--> Skipped (too many) !\n");
13dccb9e Benjamin Herrenschmidt 2007-12-11 705 continue;
13dccb9e Benjamin Herrenschmidt 2007-12-11 706 }
13dccb9e Benjamin Herrenschmidt 2007-12-11 707 #ifdef CONFIG_PPC32
13dccb9e Benjamin Herrenschmidt 2007-12-11 708 /* On 32 bits, limit I/O space to 16MB */
654837e8 Andrew Murray 2014-02-25 709 if (range.size > 0x01000000)
654837e8 Andrew Murray 2014-02-25 710 range.size = 0x01000000;
13dccb9e Benjamin Herrenschmidt 2007-12-11 711
13dccb9e Benjamin Herrenschmidt 2007-12-11 712 /* 32 bits needs to map IOs here */
654837e8 Andrew Murray 2014-02-25 713 hose->io_base_virt = ioremap(range.cpu_addr,
654837e8 Andrew Murray 2014-02-25 714 range.size);
13dccb9e Benjamin Herrenschmidt 2007-12-11 715
13dccb9e Benjamin Herrenschmidt 2007-12-11 716 /* Expect trouble if pci_addr is not 0 */
13dccb9e Benjamin Herrenschmidt 2007-12-11 717 if (primary)
13dccb9e Benjamin Herrenschmidt 2007-12-11 718 isa_io_base =
13dccb9e Benjamin Herrenschmidt 2007-12-11 719 (unsigned long)hose->io_base_virt;
13dccb9e Benjamin Herrenschmidt 2007-12-11 720 #endif /* CONFIG_PPC32 */
13dccb9e Benjamin Herrenschmidt 2007-12-11 721 /* pci_io_size and io_base_phys always represent IO
13dccb9e Benjamin Herrenschmidt 2007-12-11 722 * space starting at 0 so we factor in pci_addr
13dccb9e Benjamin Herrenschmidt 2007-12-11 723 */
654837e8 Andrew Murray 2014-02-25 724 hose->pci_io_size = range.pci_addr + range.size;
654837e8 Andrew Murray 2014-02-25 725 hose->io_base_phys = range.cpu_addr - range.pci_addr;
13dccb9e Benjamin Herrenschmidt 2007-12-11 726
13dccb9e Benjamin Herrenschmidt 2007-12-11 727 /* Build resource */
13dccb9e Benjamin Herrenschmidt 2007-12-11 728 res = &hose->io_resource;
654837e8 Andrew Murray 2014-02-25 729 range.cpu_addr = range.pci_addr;
13dccb9e Benjamin Herrenschmidt 2007-12-11 730 break;
654837e8 Andrew Murray 2014-02-25 731 case IORESOURCE_MEM:
13dccb9e Benjamin Herrenschmidt 2007-12-11 732 printk(KERN_INFO
13dccb9e Benjamin Herrenschmidt 2007-12-11 733 " MEM 0x%016llx..0x%016llx -> 0x%016llx %s\n",
654837e8 Andrew Murray 2014-02-25 734 range.cpu_addr, range.cpu_addr + range.size - 1,
654837e8 Andrew Murray 2014-02-25 735 range.pci_addr,
654837e8 Andrew Murray 2014-02-25 736 (range.pci_space & 0x40000000) ?
654837e8 Andrew Murray 2014-02-25 737 "Prefetch" : "");
13dccb9e Benjamin Herrenschmidt 2007-12-11 738
13dccb9e Benjamin Herrenschmidt 2007-12-11 739 /* We support only 3 memory ranges */
13dccb9e Benjamin Herrenschmidt 2007-12-11 740 if (memno >= 3) {
13dccb9e Benjamin Herrenschmidt 2007-12-11 741 printk(KERN_INFO
13dccb9e Benjamin Herrenschmidt 2007-12-11 742 " \\--> Skipped (too many) !\n");
13dccb9e Benjamin Herrenschmidt 2007-12-11 743 continue;
13dccb9e Benjamin Herrenschmidt 2007-12-11 744 }
13dccb9e Benjamin Herrenschmidt 2007-12-11 745 /* Handles ISA memory hole space here */
654837e8 Andrew Murray 2014-02-25 746 if (range.pci_addr == 0) {
13dccb9e Benjamin Herrenschmidt 2007-12-11 747 if (primary || isa_mem_base == 0)
654837e8 Andrew Murray 2014-02-25 748 isa_mem_base = range.cpu_addr;
654837e8 Andrew Murray 2014-02-25 749 hose->isa_mem_phys = range.cpu_addr;
654837e8 Andrew Murray 2014-02-25 750 hose->isa_mem_size = range.size;
13dccb9e Benjamin Herrenschmidt 2007-12-11 751 }
13dccb9e Benjamin Herrenschmidt 2007-12-11 752
13dccb9e Benjamin Herrenschmidt 2007-12-11 753 /* Build resource */
654837e8 Andrew Murray 2014-02-25 754 hose->mem_offset[memno] = range.cpu_addr -
654837e8 Andrew Murray 2014-02-25 755 range.pci_addr;
13dccb9e Benjamin Herrenschmidt 2007-12-11 756 res = &hose->mem_resources[memno++];
13dccb9e Benjamin Herrenschmidt 2007-12-11 757 break;
13dccb9e Benjamin Herrenschmidt 2007-12-11 758 }
13dccb9e Benjamin Herrenschmidt 2007-12-11 759 if (res != NULL) {
aeba3731 Michael Ellerman 2014-10-16 760 res->name = dev->full_name;
aeba3731 Michael Ellerman 2014-10-16 761 res->flags = range.flags;
aeba3731 Michael Ellerman 2014-10-16 762 res->start = range.cpu_addr;
aeba3731 Michael Ellerman 2014-10-16 763 res->end = range.cpu_addr + range.size - 1;
aeba3731 Michael Ellerman 2014-10-16 @764 res->parent = res->child = res->sibling = NULL;
13dccb9e Benjamin Herrenschmidt 2007-12-11 765 }
13dccb9e Benjamin Herrenschmidt 2007-12-11 766 }
13dccb9e Benjamin Herrenschmidt 2007-12-11 767 }
fa462f2d Benjamin Herrenschmidt 2007-12-20 768
:::::: The code at line 764 was first introduced by commit
:::::: aeba3731b150188685225b510886f1370d8814de powerpc/pci: Fix IO space breakage after of_pci_range_to_resource() change
:::::: TO: Michael Ellerman <mpe@ellerman.id.au>
:::::: CC: Michael Ellerman <mpe@ellerman.id.au>
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 23368 bytes --]
[-- Attachment #3: Type: text/plain, Size: 169 bytes --]
_______________________________________________
devel mailing list
devel@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: [PATCH v4 1/3] resource: Use list_head to link sibling resource
@ 2018-05-07 11:42 ` kbuild test robot
0 siblings, 0 replies; 42+ messages in thread
From: kbuild test robot @ 2018-05-07 11:42 UTC (permalink / raw)
To: Baoquan He
Cc: nicolas.pitre-QSEj5FYQhm4dnm+yROfE0A, brijesh.singh-5C7GfCeVMHo,
devicetree-u79uwXL29TY76Z2rM5mHXA, airlied-cv59FeDIM0c,
linux-pci-u79uwXL29TY76Z2rM5mHXA,
richard.weiyang-Re5JQEeQqe8AvxtiuMwx3w,
keith.busch-ral2JQCrhuEAvxtiuMwx3w,
jcmvbkbc-Re5JQEeQqe8AvxtiuMwx3w,
baiyaowei-0p4V/sDNsUmm0O/7XYngnFaTQe2KTcn/,
kys-0li6OtcxBFHby3iVrkZq2A, frowand.list-Re5JQEeQqe8AvxtiuMwx3w,
lorenzo.pieralisi-5wv7dgnIgG8, sthemmin-0li6OtcxBFHby3iVrkZq2A,
Baoquan He, linux-nvdimm-hn68Rpc1hR1g9hUCZPvPmw,
patrik.r.jakobsson-Re5JQEeQqe8AvxtiuMwx3w,
linux-input-u79uwXL29TY76Z2rM5mHXA,
gustavo-THi1TnShQwVAfugRpC6u6w, bp-l3A5Bk7waGM,
dyoung-H+wXaHxf7aLQT0dZR+AlfA, ebiederm-aS9lmoZGLiVWk0Htik3J/w,
thomas.lendacky-5C7GfCeVMHo, haiyangz-0li6OtcxBFHby3iVrkZq2A,
maarten.lankhorst-VuQAYsv1563Yd54FQh9/CA,
josh-iaAMLnmF4UmaiuxdJuQwMA, jglisse-H+wXaHxf7aLQT0dZR+AlfA,
robh+dt-DgEjT+Ai2ygdnm+yROfE0A, seanpaul-F7+t8E8rja9g9hUCZPvPmw,
bhelgaas-hpIqsD4AKlfQT0dZR+AlfA, tglx-hfZtesqFncYOwBW4kG4KsQ,
yinghai-DgEjT+Ai2ygdnm+yROfE0A,
jonathan.derrick-ral2JQCrhuEAvxtiuMwx3w,
chris-YvXeqwSYzG2sTnJN9+BGXg, monstr-pSz03upnqPeHXe+LvDLADg,
linux-parisc-u79uwXL29TY76Z2rM5mHXA,
gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r, dmitry.torokhov
Hi Baoquan,
I love your patch! Yet something to improve:
[auto build test ERROR on linus/master]
[also build test ERROR on v4.17-rc4 next-20180504]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
url: https://github.com/0day-ci/linux/commits/Baoquan-He/resource-Use-list_head-to-link-sibling-resource/20180507-144345
config: powerpc-defconfig (attached as .config)
compiler: powerpc64-linux-gnu-gcc (Debian 7.2.0-11) 7.2.0
reproduce:
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
make.cross ARCH=powerpc
All errors (new ones prefixed by >>):
arch/powerpc/kernel/pci-common.c: In function 'pci_process_bridge_OF_ranges':
>> arch/powerpc/kernel/pci-common.c:764:44: error: incompatible types when assigning to type 'struct list_head' from type 'void *'
res->parent = res->child = res->sibling = NULL;
^
arch/powerpc/kernel/pci-common.c: In function 'reparent_resources':
>> arch/powerpc/kernel/pci-common.c:1100:10: error: assignment from incompatible pointer type [-Werror=incompatible-pointer-types]
for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) {
^
arch/powerpc/kernel/pci-common.c:1100:50: error: assignment from incompatible pointer type [-Werror=incompatible-pointer-types]
for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) {
^
>> arch/powerpc/kernel/pci-common.c:1113:13: error: incompatible types when assigning to type 'struct list_head' from type 'struct resource *'
res->child = *firstpp;
^
arch/powerpc/kernel/pci-common.c:1114:15: error: incompatible types when assigning to type 'struct list_head' from type 'struct resource *'
res->sibling = *pp;
^
>> arch/powerpc/kernel/pci-common.c:1117:9: error: incompatible types when assigning to type 'struct resource *' from type 'struct list_head'
for (p = res->child; p != NULL; p = p->sibling) {
^
arch/powerpc/kernel/pci-common.c:1117:36: error: incompatible types when assigning to type 'struct resource *' from type 'struct list_head'
for (p = res->child; p != NULL; p = p->sibling) {
^
cc1: all warnings being treated as errors
vim +764 arch/powerpc/kernel/pci-common.c
13dccb9e Benjamin Herrenschmidt 2007-12-11 642
13dccb9e Benjamin Herrenschmidt 2007-12-11 643 /**
13dccb9e Benjamin Herrenschmidt 2007-12-11 644 * pci_process_bridge_OF_ranges - Parse PCI bridge resources from device tree
13dccb9e Benjamin Herrenschmidt 2007-12-11 645 * @hose: newly allocated pci_controller to be setup
13dccb9e Benjamin Herrenschmidt 2007-12-11 646 * @dev: device node of the host bridge
13dccb9e Benjamin Herrenschmidt 2007-12-11 647 * @primary: set if primary bus (32 bits only, soon to be deprecated)
13dccb9e Benjamin Herrenschmidt 2007-12-11 648 *
13dccb9e Benjamin Herrenschmidt 2007-12-11 649 * This function will parse the "ranges" property of a PCI host bridge device
13dccb9e Benjamin Herrenschmidt 2007-12-11 650 * node and setup the resource mapping of a pci controller based on its
13dccb9e Benjamin Herrenschmidt 2007-12-11 651 * content.
13dccb9e Benjamin Herrenschmidt 2007-12-11 652 *
13dccb9e Benjamin Herrenschmidt 2007-12-11 653 * Life would be boring if it wasn't for a few issues that we have to deal
13dccb9e Benjamin Herrenschmidt 2007-12-11 654 * with here:
13dccb9e Benjamin Herrenschmidt 2007-12-11 655 *
13dccb9e Benjamin Herrenschmidt 2007-12-11 656 * - We can only cope with one IO space range and up to 3 Memory space
13dccb9e Benjamin Herrenschmidt 2007-12-11 657 * ranges. However, some machines (thanks Apple !) tend to split their
13dccb9e Benjamin Herrenschmidt 2007-12-11 658 * space into lots of small contiguous ranges. So we have to coalesce.
13dccb9e Benjamin Herrenschmidt 2007-12-11 659 *
13dccb9e Benjamin Herrenschmidt 2007-12-11 660 * - Some busses have IO space not starting at 0, which causes trouble with
13dccb9e Benjamin Herrenschmidt 2007-12-11 661 * the way we do our IO resource renumbering. The code somewhat deals with
13dccb9e Benjamin Herrenschmidt 2007-12-11 662 * it for 64 bits but I would expect problems on 32 bits.
13dccb9e Benjamin Herrenschmidt 2007-12-11 663 *
13dccb9e Benjamin Herrenschmidt 2007-12-11 664 * - Some 32 bits platforms such as 4xx can have physical space larger than
13dccb9e Benjamin Herrenschmidt 2007-12-11 665 * 32 bits so we need to use 64 bits values for the parsing
13dccb9e Benjamin Herrenschmidt 2007-12-11 666 */
cad5cef6 Greg Kroah-Hartman 2012-12-21 667 void pci_process_bridge_OF_ranges(struct pci_controller *hose,
cad5cef6 Greg Kroah-Hartman 2012-12-21 668 struct device_node *dev, int primary)
13dccb9e Benjamin Herrenschmidt 2007-12-11 669 {
858957ab Kevin Hao 2013-05-16 670 int memno = 0;
13dccb9e Benjamin Herrenschmidt 2007-12-11 671 struct resource *res;
654837e8 Andrew Murray 2014-02-25 672 struct of_pci_range range;
654837e8 Andrew Murray 2014-02-25 673 struct of_pci_range_parser parser;
13dccb9e Benjamin Herrenschmidt 2007-12-11 674
b7c670d6 Rob Herring 2017-08-21 675 printk(KERN_INFO "PCI host bridge %pOF %s ranges:\n",
b7c670d6 Rob Herring 2017-08-21 676 dev, primary ? "(primary)" : "");
13dccb9e Benjamin Herrenschmidt 2007-12-11 677
654837e8 Andrew Murray 2014-02-25 678 /* Check for ranges property */
654837e8 Andrew Murray 2014-02-25 679 if (of_pci_range_parser_init(&parser, dev))
13dccb9e Benjamin Herrenschmidt 2007-12-11 680 return;
13dccb9e Benjamin Herrenschmidt 2007-12-11 681
13dccb9e Benjamin Herrenschmidt 2007-12-11 682 /* Parse it */
654837e8 Andrew Murray 2014-02-25 683 for_each_of_pci_range(&parser, &range) {
e9f82cb7 Benjamin Herrenschmidt 2008-10-14 684 /* If we failed translation or got a zero-sized region
e9f82cb7 Benjamin Herrenschmidt 2008-10-14 685 * (some FW try to feed us with non sensical zero sized regions
e9f82cb7 Benjamin Herrenschmidt 2008-10-14 686 * such as power3 which look like some kind of attempt at exposing
e9f82cb7 Benjamin Herrenschmidt 2008-10-14 687 * the VGA memory hole)
e9f82cb7 Benjamin Herrenschmidt 2008-10-14 688 */
654837e8 Andrew Murray 2014-02-25 689 if (range.cpu_addr == OF_BAD_ADDR || range.size == 0)
13dccb9e Benjamin Herrenschmidt 2007-12-11 690 continue;
13dccb9e Benjamin Herrenschmidt 2007-12-11 691
13dccb9e Benjamin Herrenschmidt 2007-12-11 692 /* Act based on address space type */
13dccb9e Benjamin Herrenschmidt 2007-12-11 693 res = NULL;
654837e8 Andrew Murray 2014-02-25 694 switch (range.flags & IORESOURCE_TYPE_BITS) {
654837e8 Andrew Murray 2014-02-25 695 case IORESOURCE_IO:
13dccb9e Benjamin Herrenschmidt 2007-12-11 696 printk(KERN_INFO
13dccb9e Benjamin Herrenschmidt 2007-12-11 697 " IO 0x%016llx..0x%016llx -> 0x%016llx\n",
654837e8 Andrew Murray 2014-02-25 698 range.cpu_addr, range.cpu_addr + range.size - 1,
654837e8 Andrew Murray 2014-02-25 699 range.pci_addr);
13dccb9e Benjamin Herrenschmidt 2007-12-11 700
13dccb9e Benjamin Herrenschmidt 2007-12-11 701 /* We support only one IO range */
13dccb9e Benjamin Herrenschmidt 2007-12-11 702 if (hose->pci_io_size) {
13dccb9e Benjamin Herrenschmidt 2007-12-11 703 printk(KERN_INFO
13dccb9e Benjamin Herrenschmidt 2007-12-11 704 " \\--> Skipped (too many) !\n");
13dccb9e Benjamin Herrenschmidt 2007-12-11 705 continue;
13dccb9e Benjamin Herrenschmidt 2007-12-11 706 }
13dccb9e Benjamin Herrenschmidt 2007-12-11 707 #ifdef CONFIG_PPC32
13dccb9e Benjamin Herrenschmidt 2007-12-11 708 /* On 32 bits, limit I/O space to 16MB */
654837e8 Andrew Murray 2014-02-25 709 if (range.size > 0x01000000)
654837e8 Andrew Murray 2014-02-25 710 range.size = 0x01000000;
13dccb9e Benjamin Herrenschmidt 2007-12-11 711
13dccb9e Benjamin Herrenschmidt 2007-12-11 712 /* 32 bits needs to map IOs here */
654837e8 Andrew Murray 2014-02-25 713 hose->io_base_virt = ioremap(range.cpu_addr,
654837e8 Andrew Murray 2014-02-25 714 range.size);
13dccb9e Benjamin Herrenschmidt 2007-12-11 715
13dccb9e Benjamin Herrenschmidt 2007-12-11 716 /* Expect trouble if pci_addr is not 0 */
13dccb9e Benjamin Herrenschmidt 2007-12-11 717 if (primary)
13dccb9e Benjamin Herrenschmidt 2007-12-11 718 isa_io_base =
13dccb9e Benjamin Herrenschmidt 2007-12-11 719 (unsigned long)hose->io_base_virt;
13dccb9e Benjamin Herrenschmidt 2007-12-11 720 #endif /* CONFIG_PPC32 */
13dccb9e Benjamin Herrenschmidt 2007-12-11 721 /* pci_io_size and io_base_phys always represent IO
13dccb9e Benjamin Herrenschmidt 2007-12-11 722 * space starting at 0 so we factor in pci_addr
13dccb9e Benjamin Herrenschmidt 2007-12-11 723 */
654837e8 Andrew Murray 2014-02-25 724 hose->pci_io_size = range.pci_addr + range.size;
654837e8 Andrew Murray 2014-02-25 725 hose->io_base_phys = range.cpu_addr - range.pci_addr;
13dccb9e Benjamin Herrenschmidt 2007-12-11 726
13dccb9e Benjamin Herrenschmidt 2007-12-11 727 /* Build resource */
13dccb9e Benjamin Herrenschmidt 2007-12-11 728 res = &hose->io_resource;
654837e8 Andrew Murray 2014-02-25 729 range.cpu_addr = range.pci_addr;
13dccb9e Benjamin Herrenschmidt 2007-12-11 730 break;
654837e8 Andrew Murray 2014-02-25 731 case IORESOURCE_MEM:
13dccb9e Benjamin Herrenschmidt 2007-12-11 732 printk(KERN_INFO
13dccb9e Benjamin Herrenschmidt 2007-12-11 733 " MEM 0x%016llx..0x%016llx -> 0x%016llx %s\n",
654837e8 Andrew Murray 2014-02-25 734 range.cpu_addr, range.cpu_addr + range.size - 1,
654837e8 Andrew Murray 2014-02-25 735 range.pci_addr,
654837e8 Andrew Murray 2014-02-25 736 (range.pci_space & 0x40000000) ?
654837e8 Andrew Murray 2014-02-25 737 "Prefetch" : "");
13dccb9e Benjamin Herrenschmidt 2007-12-11 738
13dccb9e Benjamin Herrenschmidt 2007-12-11 739 /* We support only 3 memory ranges */
13dccb9e Benjamin Herrenschmidt 2007-12-11 740 if (memno >= 3) {
13dccb9e Benjamin Herrenschmidt 2007-12-11 741 printk(KERN_INFO
13dccb9e Benjamin Herrenschmidt 2007-12-11 742 " \\--> Skipped (too many) !\n");
13dccb9e Benjamin Herrenschmidt 2007-12-11 743 continue;
13dccb9e Benjamin Herrenschmidt 2007-12-11 744 }
13dccb9e Benjamin Herrenschmidt 2007-12-11 745 /* Handles ISA memory hole space here */
654837e8 Andrew Murray 2014-02-25 746 if (range.pci_addr == 0) {
13dccb9e Benjamin Herrenschmidt 2007-12-11 747 if (primary || isa_mem_base == 0)
654837e8 Andrew Murray 2014-02-25 748 isa_mem_base = range.cpu_addr;
654837e8 Andrew Murray 2014-02-25 749 hose->isa_mem_phys = range.cpu_addr;
654837e8 Andrew Murray 2014-02-25 750 hose->isa_mem_size = range.size;
13dccb9e Benjamin Herrenschmidt 2007-12-11 751 }
13dccb9e Benjamin Herrenschmidt 2007-12-11 752
13dccb9e Benjamin Herrenschmidt 2007-12-11 753 /* Build resource */
654837e8 Andrew Murray 2014-02-25 754 hose->mem_offset[memno] = range.cpu_addr -
654837e8 Andrew Murray 2014-02-25 755 range.pci_addr;
13dccb9e Benjamin Herrenschmidt 2007-12-11 756 res = &hose->mem_resources[memno++];
13dccb9e Benjamin Herrenschmidt 2007-12-11 757 break;
13dccb9e Benjamin Herrenschmidt 2007-12-11 758 }
13dccb9e Benjamin Herrenschmidt 2007-12-11 759 if (res != NULL) {
aeba3731 Michael Ellerman 2014-10-16 760 res->name = dev->full_name;
aeba3731 Michael Ellerman 2014-10-16 761 res->flags = range.flags;
aeba3731 Michael Ellerman 2014-10-16 762 res->start = range.cpu_addr;
aeba3731 Michael Ellerman 2014-10-16 763 res->end = range.cpu_addr + range.size - 1;
aeba3731 Michael Ellerman 2014-10-16 @764 res->parent = res->child = res->sibling = NULL;
13dccb9e Benjamin Herrenschmidt 2007-12-11 765 }
13dccb9e Benjamin Herrenschmidt 2007-12-11 766 }
13dccb9e Benjamin Herrenschmidt 2007-12-11 767 }
fa462f2d Benjamin Herrenschmidt 2007-12-20 768
:::::: The code at line 764 was first introduced by commit
:::::: aeba3731b150188685225b510886f1370d8814de powerpc/pci: Fix IO space breakage after of_pci_range_to_resource() change
:::::: TO: Michael Ellerman <mpe-Gsx/Oe8HsFggBc27wqDAHg@public.gmane.org>
:::::: CC: Michael Ellerman <mpe-Gsx/Oe8HsFggBc27wqDAHg@public.gmane.org>
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: [PATCH v4 1/3] resource: Use list_head to link sibling resource
@ 2018-05-09 2:08 ` Baoquan He
0 siblings, 0 replies; 42+ messages in thread
From: Baoquan He @ 2018-05-09 2:08 UTC (permalink / raw)
To: kbuild test robot
Cc: nicolas.pitre, brijesh.singh, devicetree, airlied, linux-pci,
richard.weiyang, keith.busch, jcmvbkbc, baiyaowei, kys,
frowand.list, lorenzo.pieralisi, sthemmin, linux-nvdimm,
patrik.r.jakobsson, linux-input, gustavo, bp, dyoung, ebiederm,
thomas.lendacky, haiyangz, maarten.lankhorst, josh, jglisse,
robh+dt, seanpaul, bhelgaas, tglx, yinghai, jonathan.derrick,
chris, monstr, linux-parisc, gregkh, dmitry.torokhov, kexec,
linux-kernel, kbuild-all, devel, akpm, fengguang.wu, davem
On 05/07/18 at 07:42pm, kbuild test robot wrote:
> Hi Baoquan,
>
> I love your patch! Yet something to improve:
>
> [auto build test ERROR on linus/master]
> [also build test ERROR on v4.17-rc4 next-20180504]
> [if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
>
> url: https://github.com/0day-ci/linux/commits/Baoquan-He/resource-Use-list_head-to-link-sibling-resource/20180507-144345
> config: powerpc-defconfig (attached as .config)
> compiler: powerpc64-linux-gnu-gcc (Debian 7.2.0-11) 7.2.0
> reproduce:
> wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
> chmod +x ~/bin/make.cross
> # save the attached .config to linux build tree
> make.cross ARCH=powerpc
>
> All errors (new ones prefixed by >>):
>
> arch/powerpc/kernel/pci-common.c: In function 'pci_process_bridge_OF_ranges':
> >> arch/powerpc/kernel/pci-common.c:764:44: error: incompatible types when assigning to type 'struct list_head' from type 'void *'
> res->parent = res->child = res->sibling = NULL;
Pasted code can fix above error.
diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c
index fe9733ffffaa..a7e68f6f9f24 100644
--- a/arch/powerpc/kernel/pci-common.c
+++ b/arch/powerpc/kernel/pci-common.c
@@ -761,7 +761,9 @@ void pci_process_bridge_OF_ranges(struct pci_controller *hose,
res->flags = range.flags;
res->start = range.cpu_addr;
res->end = range.cpu_addr + range.size - 1;
- res->parent = res->child = res->sibling = NULL;
+ res->parent = NULL;
+ INIT_LIST_HEAD(&res->child);
+ INIT_LIST_HEAD(&res->sibling);
}
}
}
> ^
> arch/powerpc/kernel/pci-common.c: In function 'reparent_resources':
> >> arch/powerpc/kernel/pci-common.c:1100:10: error: assignment from incompatible pointer type [-Werror=incompatible-pointer-types]
> for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) {
> ^
This reparent_resources() function is duplicated with the one in
arch/microblaze/pci/pci-common.c which has been fixed in v4. I planned
to move it to kernel/resource.c in a separate patch since it's shared by
different ARCH, then fix it in this patch.
> arch/powerpc/kernel/pci-common.c:1100:50: error: assignment from incompatible pointer type [-Werror=incompatible-pointer-types]
> for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) {
> ^
> >> arch/powerpc/kernel/pci-common.c:1113:13: error: incompatible types when assigning to type 'struct list_head' from type 'struct resource *'
> res->child = *firstpp;
> ^
> arch/powerpc/kernel/pci-common.c:1114:15: error: incompatible types when assigning to type 'struct list_head' from type 'struct resource *'
> res->sibling = *pp;
> ^
> >> arch/powerpc/kernel/pci-common.c:1117:9: error: incompatible types when assigning to type 'struct resource *' from type 'struct list_head'
> for (p = res->child; p != NULL; p = p->sibling) {
> ^
> arch/powerpc/kernel/pci-common.c:1117:36: error: incompatible types when assigning to type 'struct resource *' from type 'struct list_head'
> for (p = res->child; p != NULL; p = p->sibling) {
> ^
> cc1: all warnings being treated as errors
>
> vim +764 arch/powerpc/kernel/pci-common.c
>
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 642
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 643 /**
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 644 * pci_process_bridge_OF_ranges - Parse PCI bridge resources from device tree
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 645 * @hose: newly allocated pci_controller to be setup
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 646 * @dev: device node of the host bridge
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 647 * @primary: set if primary bus (32 bits only, soon to be deprecated)
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 648 *
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 649 * This function will parse the "ranges" property of a PCI host bridge device
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 650 * node and setup the resource mapping of a pci controller based on its
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 651 * content.
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 652 *
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 653 * Life would be boring if it wasn't for a few issues that we have to deal
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 654 * with here:
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 655 *
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 656 * - We can only cope with one IO space range and up to 3 Memory space
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 657 * ranges. However, some machines (thanks Apple !) tend to split their
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 658 * space into lots of small contiguous ranges. So we have to coalesce.
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 659 *
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 660 * - Some busses have IO space not starting at 0, which causes trouble with
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 661 * the way we do our IO resource renumbering. The code somewhat deals with
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 662 * it for 64 bits but I would expect problems on 32 bits.
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 663 *
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 664 * - Some 32 bits platforms such as 4xx can have physical space larger than
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 665 * 32 bits so we need to use 64 bits values for the parsing
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 666 */
> cad5cef6 Greg Kroah-Hartman 2012-12-21 667 void pci_process_bridge_OF_ranges(struct pci_controller *hose,
> cad5cef6 Greg Kroah-Hartman 2012-12-21 668 struct device_node *dev, int primary)
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 669 {
> 858957ab Kevin Hao 2013-05-16 670 int memno = 0;
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 671 struct resource *res;
> 654837e8 Andrew Murray 2014-02-25 672 struct of_pci_range range;
> 654837e8 Andrew Murray 2014-02-25 673 struct of_pci_range_parser parser;
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 674
> b7c670d6 Rob Herring 2017-08-21 675 printk(KERN_INFO "PCI host bridge %pOF %s ranges:\n",
> b7c670d6 Rob Herring 2017-08-21 676 dev, primary ? "(primary)" : "");
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 677
> 654837e8 Andrew Murray 2014-02-25 678 /* Check for ranges property */
> 654837e8 Andrew Murray 2014-02-25 679 if (of_pci_range_parser_init(&parser, dev))
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 680 return;
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 681
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 682 /* Parse it */
> 654837e8 Andrew Murray 2014-02-25 683 for_each_of_pci_range(&parser, &range) {
> e9f82cb7 Benjamin Herrenschmidt 2008-10-14 684 /* If we failed translation or got a zero-sized region
> e9f82cb7 Benjamin Herrenschmidt 2008-10-14 685 * (some FW try to feed us with non sensical zero sized regions
> e9f82cb7 Benjamin Herrenschmidt 2008-10-14 686 * such as power3 which look like some kind of attempt at exposing
> e9f82cb7 Benjamin Herrenschmidt 2008-10-14 687 * the VGA memory hole)
> e9f82cb7 Benjamin Herrenschmidt 2008-10-14 688 */
> 654837e8 Andrew Murray 2014-02-25 689 if (range.cpu_addr == OF_BAD_ADDR || range.size == 0)
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 690 continue;
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 691
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 692 /* Act based on address space type */
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 693 res = NULL;
> 654837e8 Andrew Murray 2014-02-25 694 switch (range.flags & IORESOURCE_TYPE_BITS) {
> 654837e8 Andrew Murray 2014-02-25 695 case IORESOURCE_IO:
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 696 printk(KERN_INFO
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 697 " IO 0x%016llx..0x%016llx -> 0x%016llx\n",
> 654837e8 Andrew Murray 2014-02-25 698 range.cpu_addr, range.cpu_addr + range.size - 1,
> 654837e8 Andrew Murray 2014-02-25 699 range.pci_addr);
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 700
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 701 /* We support only one IO range */
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 702 if (hose->pci_io_size) {
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 703 printk(KERN_INFO
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 704 " \\--> Skipped (too many) !\n");
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 705 continue;
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 706 }
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 707 #ifdef CONFIG_PPC32
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 708 /* On 32 bits, limit I/O space to 16MB */
> 654837e8 Andrew Murray 2014-02-25 709 if (range.size > 0x01000000)
> 654837e8 Andrew Murray 2014-02-25 710 range.size = 0x01000000;
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 711
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 712 /* 32 bits needs to map IOs here */
> 654837e8 Andrew Murray 2014-02-25 713 hose->io_base_virt = ioremap(range.cpu_addr,
> 654837e8 Andrew Murray 2014-02-25 714 range.size);
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 715
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 716 /* Expect trouble if pci_addr is not 0 */
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 717 if (primary)
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 718 isa_io_base =
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 719 (unsigned long)hose->io_base_virt;
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 720 #endif /* CONFIG_PPC32 */
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 721 /* pci_io_size and io_base_phys always represent IO
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 722 * space starting at 0 so we factor in pci_addr
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 723 */
> 654837e8 Andrew Murray 2014-02-25 724 hose->pci_io_size = range.pci_addr + range.size;
> 654837e8 Andrew Murray 2014-02-25 725 hose->io_base_phys = range.cpu_addr - range.pci_addr;
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 726
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 727 /* Build resource */
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 728 res = &hose->io_resource;
> 654837e8 Andrew Murray 2014-02-25 729 range.cpu_addr = range.pci_addr;
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 730 break;
> 654837e8 Andrew Murray 2014-02-25 731 case IORESOURCE_MEM:
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 732 printk(KERN_INFO
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 733 " MEM 0x%016llx..0x%016llx -> 0x%016llx %s\n",
> 654837e8 Andrew Murray 2014-02-25 734 range.cpu_addr, range.cpu_addr + range.size - 1,
> 654837e8 Andrew Murray 2014-02-25 735 range.pci_addr,
> 654837e8 Andrew Murray 2014-02-25 736 (range.pci_space & 0x40000000) ?
> 654837e8 Andrew Murray 2014-02-25 737 "Prefetch" : "");
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 738
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 739 /* We support only 3 memory ranges */
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 740 if (memno >= 3) {
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 741 printk(KERN_INFO
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 742 " \\--> Skipped (too many) !\n");
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 743 continue;
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 744 }
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 745 /* Handles ISA memory hole space here */
> 654837e8 Andrew Murray 2014-02-25 746 if (range.pci_addr == 0) {
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 747 if (primary || isa_mem_base == 0)
> 654837e8 Andrew Murray 2014-02-25 748 isa_mem_base = range.cpu_addr;
> 654837e8 Andrew Murray 2014-02-25 749 hose->isa_mem_phys = range.cpu_addr;
> 654837e8 Andrew Murray 2014-02-25 750 hose->isa_mem_size = range.size;
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 751 }
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 752
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 753 /* Build resource */
> 654837e8 Andrew Murray 2014-02-25 754 hose->mem_offset[memno] = range.cpu_addr -
> 654837e8 Andrew Murray 2014-02-25 755 range.pci_addr;
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 756 res = &hose->mem_resources[memno++];
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 757 break;
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 758 }
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 759 if (res != NULL) {
> aeba3731 Michael Ellerman 2014-10-16 760 res->name = dev->full_name;
> aeba3731 Michael Ellerman 2014-10-16 761 res->flags = range.flags;
> aeba3731 Michael Ellerman 2014-10-16 762 res->start = range.cpu_addr;
> aeba3731 Michael Ellerman 2014-10-16 763 res->end = range.cpu_addr + range.size - 1;
> aeba3731 Michael Ellerman 2014-10-16 @764 res->parent = res->child = res->sibling = NULL;
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 765 }
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 766 }
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 767 }
> fa462f2d Benjamin Herrenschmidt 2007-12-20 768
>
> :::::: The code at line 764 was first introduced by commit
> :::::: aeba3731b150188685225b510886f1370d8814de powerpc/pci: Fix IO space breakage after of_pci_range_to_resource() change
>
> :::::: TO: Michael Ellerman <mpe@ellerman.id.au>
> :::::: CC: Michael Ellerman <mpe@ellerman.id.au>
>
> ---
> 0-DAY kernel test infrastructure Open Source Technology Center
> https://lists.01.org/pipermail/kbuild-all Intel Corporation
_______________________________________________
Linux-nvdimm mailing list
Linux-nvdimm@lists.01.org
https://lists.01.org/mailman/listinfo/linux-nvdimm
^ permalink raw reply related [flat|nested] 42+ messages in thread
* Re: [PATCH v4 1/3] resource: Use list_head to link sibling resource
@ 2018-05-09 2:08 ` Baoquan He
0 siblings, 0 replies; 42+ messages in thread
From: Baoquan He @ 2018-05-09 2:08 UTC (permalink / raw)
To: kbuild test robot
Cc: nicolas.pitre, brijesh.singh, devicetree, airlied, linux-pci,
richard.weiyang, keith.busch, jcmvbkbc, baiyaowei, kys,
frowand.list, dan.j.williams, lorenzo.pieralisi, sthemmin,
linux-nvdimm, patrik.r.jakobsson, linux-input, gustavo, bp,
dyoung, vgoyal, ebiederm, thomas.lendacky, haiyangz,
maarten.lankhorst, josh, jglisse, robh+dt, seanpaul, bhelgaas,
tglx, yinghai, jonathan.derrick, chris, monstr, linux-parisc,
gregkh, dmitry.torokhov, kexec, linux-kernel, kbuild-all, devel,
akpm, fengguang.wu, davem
On 05/07/18 at 07:42pm, kbuild test robot wrote:
> Hi Baoquan,
>
> I love your patch! Yet something to improve:
>
> [auto build test ERROR on linus/master]
> [also build test ERROR on v4.17-rc4 next-20180504]
> [if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
>
> url: https://github.com/0day-ci/linux/commits/Baoquan-He/resource-Use-list_head-to-link-sibling-resource/20180507-144345
> config: powerpc-defconfig (attached as .config)
> compiler: powerpc64-linux-gnu-gcc (Debian 7.2.0-11) 7.2.0
> reproduce:
> wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
> chmod +x ~/bin/make.cross
> # save the attached .config to linux build tree
> make.cross ARCH=powerpc
>
> All errors (new ones prefixed by >>):
>
> arch/powerpc/kernel/pci-common.c: In function 'pci_process_bridge_OF_ranges':
> >> arch/powerpc/kernel/pci-common.c:764:44: error: incompatible types when assigning to type 'struct list_head' from type 'void *'
> res->parent = res->child = res->sibling = NULL;
Pasted code can fix above error.
diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c
index fe9733ffffaa..a7e68f6f9f24 100644
--- a/arch/powerpc/kernel/pci-common.c
+++ b/arch/powerpc/kernel/pci-common.c
@@ -761,7 +761,9 @@ void pci_process_bridge_OF_ranges(struct pci_controller *hose,
res->flags = range.flags;
res->start = range.cpu_addr;
res->end = range.cpu_addr + range.size - 1;
- res->parent = res->child = res->sibling = NULL;
+ res->parent = NULL;
+ INIT_LIST_HEAD(&res->child);
+ INIT_LIST_HEAD(&res->sibling);
}
}
}
> ^
> arch/powerpc/kernel/pci-common.c: In function 'reparent_resources':
> >> arch/powerpc/kernel/pci-common.c:1100:10: error: assignment from incompatible pointer type [-Werror=incompatible-pointer-types]
> for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) {
> ^
This reparent_resources() function is duplicated with the one in
arch/microblaze/pci/pci-common.c which has been fixed in v4. I planned
to move it to kernel/resource.c in a separate patch since it's shared by
different ARCH, then fix it in this patch.
> arch/powerpc/kernel/pci-common.c:1100:50: error: assignment from incompatible pointer type [-Werror=incompatible-pointer-types]
> for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) {
> ^
> >> arch/powerpc/kernel/pci-common.c:1113:13: error: incompatible types when assigning to type 'struct list_head' from type 'struct resource *'
> res->child = *firstpp;
> ^
> arch/powerpc/kernel/pci-common.c:1114:15: error: incompatible types when assigning to type 'struct list_head' from type 'struct resource *'
> res->sibling = *pp;
> ^
> >> arch/powerpc/kernel/pci-common.c:1117:9: error: incompatible types when assigning to type 'struct resource *' from type 'struct list_head'
> for (p = res->child; p != NULL; p = p->sibling) {
> ^
> arch/powerpc/kernel/pci-common.c:1117:36: error: incompatible types when assigning to type 'struct resource *' from type 'struct list_head'
> for (p = res->child; p != NULL; p = p->sibling) {
> ^
> cc1: all warnings being treated as errors
>
> vim +764 arch/powerpc/kernel/pci-common.c
>
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 642
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 643 /**
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 644 * pci_process_bridge_OF_ranges - Parse PCI bridge resources from device tree
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 645 * @hose: newly allocated pci_controller to be setup
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 646 * @dev: device node of the host bridge
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 647 * @primary: set if primary bus (32 bits only, soon to be deprecated)
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 648 *
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 649 * This function will parse the "ranges" property of a PCI host bridge device
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 650 * node and setup the resource mapping of a pci controller based on its
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 651 * content.
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 652 *
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 653 * Life would be boring if it wasn't for a few issues that we have to deal
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 654 * with here:
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 655 *
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 656 * - We can only cope with one IO space range and up to 3 Memory space
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 657 * ranges. However, some machines (thanks Apple !) tend to split their
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 658 * space into lots of small contiguous ranges. So we have to coalesce.
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 659 *
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 660 * - Some busses have IO space not starting at 0, which causes trouble with
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 661 * the way we do our IO resource renumbering. The code somewhat deals with
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 662 * it for 64 bits but I would expect problems on 32 bits.
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 663 *
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 664 * - Some 32 bits platforms such as 4xx can have physical space larger than
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 665 * 32 bits so we need to use 64 bits values for the parsing
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 666 */
> cad5cef6 Greg Kroah-Hartman 2012-12-21 667 void pci_process_bridge_OF_ranges(struct pci_controller *hose,
> cad5cef6 Greg Kroah-Hartman 2012-12-21 668 struct device_node *dev, int primary)
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 669 {
> 858957ab Kevin Hao 2013-05-16 670 int memno = 0;
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 671 struct resource *res;
> 654837e8 Andrew Murray 2014-02-25 672 struct of_pci_range range;
> 654837e8 Andrew Murray 2014-02-25 673 struct of_pci_range_parser parser;
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 674
> b7c670d6 Rob Herring 2017-08-21 675 printk(KERN_INFO "PCI host bridge %pOF %s ranges:\n",
> b7c670d6 Rob Herring 2017-08-21 676 dev, primary ? "(primary)" : "");
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 677
> 654837e8 Andrew Murray 2014-02-25 678 /* Check for ranges property */
> 654837e8 Andrew Murray 2014-02-25 679 if (of_pci_range_parser_init(&parser, dev))
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 680 return;
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 681
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 682 /* Parse it */
> 654837e8 Andrew Murray 2014-02-25 683 for_each_of_pci_range(&parser, &range) {
> e9f82cb7 Benjamin Herrenschmidt 2008-10-14 684 /* If we failed translation or got a zero-sized region
> e9f82cb7 Benjamin Herrenschmidt 2008-10-14 685 * (some FW try to feed us with non sensical zero sized regions
> e9f82cb7 Benjamin Herrenschmidt 2008-10-14 686 * such as power3 which look like some kind of attempt at exposing
> e9f82cb7 Benjamin Herrenschmidt 2008-10-14 687 * the VGA memory hole)
> e9f82cb7 Benjamin Herrenschmidt 2008-10-14 688 */
> 654837e8 Andrew Murray 2014-02-25 689 if (range.cpu_addr == OF_BAD_ADDR || range.size == 0)
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 690 continue;
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 691
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 692 /* Act based on address space type */
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 693 res = NULL;
> 654837e8 Andrew Murray 2014-02-25 694 switch (range.flags & IORESOURCE_TYPE_BITS) {
> 654837e8 Andrew Murray 2014-02-25 695 case IORESOURCE_IO:
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 696 printk(KERN_INFO
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 697 " IO 0x%016llx..0x%016llx -> 0x%016llx\n",
> 654837e8 Andrew Murray 2014-02-25 698 range.cpu_addr, range.cpu_addr + range.size - 1,
> 654837e8 Andrew Murray 2014-02-25 699 range.pci_addr);
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 700
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 701 /* We support only one IO range */
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 702 if (hose->pci_io_size) {
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 703 printk(KERN_INFO
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 704 " \\--> Skipped (too many) !\n");
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 705 continue;
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 706 }
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 707 #ifdef CONFIG_PPC32
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 708 /* On 32 bits, limit I/O space to 16MB */
> 654837e8 Andrew Murray 2014-02-25 709 if (range.size > 0x01000000)
> 654837e8 Andrew Murray 2014-02-25 710 range.size = 0x01000000;
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 711
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 712 /* 32 bits needs to map IOs here */
> 654837e8 Andrew Murray 2014-02-25 713 hose->io_base_virt = ioremap(range.cpu_addr,
> 654837e8 Andrew Murray 2014-02-25 714 range.size);
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 715
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 716 /* Expect trouble if pci_addr is not 0 */
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 717 if (primary)
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 718 isa_io_base =
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 719 (unsigned long)hose->io_base_virt;
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 720 #endif /* CONFIG_PPC32 */
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 721 /* pci_io_size and io_base_phys always represent IO
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 722 * space starting at 0 so we factor in pci_addr
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 723 */
> 654837e8 Andrew Murray 2014-02-25 724 hose->pci_io_size = range.pci_addr + range.size;
> 654837e8 Andrew Murray 2014-02-25 725 hose->io_base_phys = range.cpu_addr - range.pci_addr;
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 726
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 727 /* Build resource */
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 728 res = &hose->io_resource;
> 654837e8 Andrew Murray 2014-02-25 729 range.cpu_addr = range.pci_addr;
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 730 break;
> 654837e8 Andrew Murray 2014-02-25 731 case IORESOURCE_MEM:
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 732 printk(KERN_INFO
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 733 " MEM 0x%016llx..0x%016llx -> 0x%016llx %s\n",
> 654837e8 Andrew Murray 2014-02-25 734 range.cpu_addr, range.cpu_addr + range.size - 1,
> 654837e8 Andrew Murray 2014-02-25 735 range.pci_addr,
> 654837e8 Andrew Murray 2014-02-25 736 (range.pci_space & 0x40000000) ?
> 654837e8 Andrew Murray 2014-02-25 737 "Prefetch" : "");
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 738
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 739 /* We support only 3 memory ranges */
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 740 if (memno >= 3) {
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 741 printk(KERN_INFO
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 742 " \\--> Skipped (too many) !\n");
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 743 continue;
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 744 }
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 745 /* Handles ISA memory hole space here */
> 654837e8 Andrew Murray 2014-02-25 746 if (range.pci_addr == 0) {
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 747 if (primary || isa_mem_base == 0)
> 654837e8 Andrew Murray 2014-02-25 748 isa_mem_base = range.cpu_addr;
> 654837e8 Andrew Murray 2014-02-25 749 hose->isa_mem_phys = range.cpu_addr;
> 654837e8 Andrew Murray 2014-02-25 750 hose->isa_mem_size = range.size;
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 751 }
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 752
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 753 /* Build resource */
> 654837e8 Andrew Murray 2014-02-25 754 hose->mem_offset[memno] = range.cpu_addr -
> 654837e8 Andrew Murray 2014-02-25 755 range.pci_addr;
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 756 res = &hose->mem_resources[memno++];
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 757 break;
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 758 }
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 759 if (res != NULL) {
> aeba3731 Michael Ellerman 2014-10-16 760 res->name = dev->full_name;
> aeba3731 Michael Ellerman 2014-10-16 761 res->flags = range.flags;
> aeba3731 Michael Ellerman 2014-10-16 762 res->start = range.cpu_addr;
> aeba3731 Michael Ellerman 2014-10-16 763 res->end = range.cpu_addr + range.size - 1;
> aeba3731 Michael Ellerman 2014-10-16 @764 res->parent = res->child = res->sibling = NULL;
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 765 }
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 766 }
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 767 }
> fa462f2d Benjamin Herrenschmidt 2007-12-20 768
>
> :::::: The code at line 764 was first introduced by commit
> :::::: aeba3731b150188685225b510886f1370d8814de powerpc/pci: Fix IO space breakage after of_pci_range_to_resource() change
>
> :::::: TO: Michael Ellerman <mpe@ellerman.id.au>
> :::::: CC: Michael Ellerman <mpe@ellerman.id.au>
>
> ---
> 0-DAY kernel test infrastructure Open Source Technology Center
> https://lists.01.org/pipermail/kbuild-all Intel Corporation
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply related [flat|nested] 42+ messages in thread
* Re: [PATCH v4 1/3] resource: Use list_head to link sibling resource
@ 2018-05-09 2:08 ` Baoquan He
0 siblings, 0 replies; 42+ messages in thread
From: Baoquan He @ 2018-05-09 2:08 UTC (permalink / raw)
To: kbuild test robot
Cc: kbuild-all, linux-kernel, akpm, robh+dt, dan.j.williams,
nicolas.pitre, josh, fengguang.wu, bp, patrik.r.jakobsson,
airlied, kys, haiyangz, sthemmin, dmitry.torokhov, frowand.list,
keith.busch, jonathan.derrick, lorenzo.pieralisi, bhelgaas, tglx,
brijesh.singh, jglisse, thomas.lendacky, gregkh, baiyaowei,
richard.weiyang, devel, linux-input, linux-nvdimm, devicetree,
linux-pci, ebiederm, vgoyal, dyoung, yinghai, kexec, monstr,
davem, chris, jcmvbkbc, gustavo, maarten.lankhorst, seanpaul,
linux-parisc
On 05/07/18 at 07:42pm, kbuild test robot wrote:
> Hi Baoquan,
>
> I love your patch! Yet something to improve:
>
> [auto build test ERROR on linus/master]
> [also build test ERROR on v4.17-rc4 next-20180504]
> [if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
>
> url: https://github.com/0day-ci/linux/commits/Baoquan-He/resource-Use-list_head-to-link-sibling-resource/20180507-144345
> config: powerpc-defconfig (attached as .config)
> compiler: powerpc64-linux-gnu-gcc (Debian 7.2.0-11) 7.2.0
> reproduce:
> wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
> chmod +x ~/bin/make.cross
> # save the attached .config to linux build tree
> make.cross ARCH=powerpc
>
> All errors (new ones prefixed by >>):
>
> arch/powerpc/kernel/pci-common.c: In function 'pci_process_bridge_OF_ranges':
> >> arch/powerpc/kernel/pci-common.c:764:44: error: incompatible types when assigning to type 'struct list_head' from type 'void *'
> res->parent = res->child = res->sibling = NULL;
Pasted code can fix above error.
diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c
index fe9733ffffaa..a7e68f6f9f24 100644
--- a/arch/powerpc/kernel/pci-common.c
+++ b/arch/powerpc/kernel/pci-common.c
@@ -761,7 +761,9 @@ void pci_process_bridge_OF_ranges(struct pci_controller *hose,
res->flags = range.flags;
res->start = range.cpu_addr;
res->end = range.cpu_addr + range.size - 1;
- res->parent = res->child = res->sibling = NULL;
+ res->parent = NULL;
+ INIT_LIST_HEAD(&res->child);
+ INIT_LIST_HEAD(&res->sibling);
}
}
}
> ^
> arch/powerpc/kernel/pci-common.c: In function 'reparent_resources':
> >> arch/powerpc/kernel/pci-common.c:1100:10: error: assignment from incompatible pointer type [-Werror=incompatible-pointer-types]
> for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) {
> ^
This reparent_resources() function is duplicated with the one in
arch/microblaze/pci/pci-common.c which has been fixed in v4. I planned
to move it to kernel/resource.c in a separate patch since it's shared by
different ARCH, then fix it in this patch.
> arch/powerpc/kernel/pci-common.c:1100:50: error: assignment from incompatible pointer type [-Werror=incompatible-pointer-types]
> for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) {
> ^
> >> arch/powerpc/kernel/pci-common.c:1113:13: error: incompatible types when assigning to type 'struct list_head' from type 'struct resource *'
> res->child = *firstpp;
> ^
> arch/powerpc/kernel/pci-common.c:1114:15: error: incompatible types when assigning to type 'struct list_head' from type 'struct resource *'
> res->sibling = *pp;
> ^
> >> arch/powerpc/kernel/pci-common.c:1117:9: error: incompatible types when assigning to type 'struct resource *' from type 'struct list_head'
> for (p = res->child; p != NULL; p = p->sibling) {
> ^
> arch/powerpc/kernel/pci-common.c:1117:36: error: incompatible types when assigning to type 'struct resource *' from type 'struct list_head'
> for (p = res->child; p != NULL; p = p->sibling) {
> ^
> cc1: all warnings being treated as errors
>
> vim +764 arch/powerpc/kernel/pci-common.c
>
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 642
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 643 /**
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 644 * pci_process_bridge_OF_ranges - Parse PCI bridge resources from device tree
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 645 * @hose: newly allocated pci_controller to be setup
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 646 * @dev: device node of the host bridge
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 647 * @primary: set if primary bus (32 bits only, soon to be deprecated)
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 648 *
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 649 * This function will parse the "ranges" property of a PCI host bridge device
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 650 * node and setup the resource mapping of a pci controller based on its
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 651 * content.
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 652 *
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 653 * Life would be boring if it wasn't for a few issues that we have to deal
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 654 * with here:
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 655 *
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 656 * - We can only cope with one IO space range and up to 3 Memory space
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 657 * ranges. However, some machines (thanks Apple !) tend to split their
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 658 * space into lots of small contiguous ranges. So we have to coalesce.
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 659 *
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 660 * - Some busses have IO space not starting at 0, which causes trouble with
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 661 * the way we do our IO resource renumbering. The code somewhat deals with
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 662 * it for 64 bits but I would expect problems on 32 bits.
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 663 *
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 664 * - Some 32 bits platforms such as 4xx can have physical space larger than
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 665 * 32 bits so we need to use 64 bits values for the parsing
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 666 */
> cad5cef6 Greg Kroah-Hartman 2012-12-21 667 void pci_process_bridge_OF_ranges(struct pci_controller *hose,
> cad5cef6 Greg Kroah-Hartman 2012-12-21 668 struct device_node *dev, int primary)
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 669 {
> 858957ab Kevin Hao 2013-05-16 670 int memno = 0;
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 671 struct resource *res;
> 654837e8 Andrew Murray 2014-02-25 672 struct of_pci_range range;
> 654837e8 Andrew Murray 2014-02-25 673 struct of_pci_range_parser parser;
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 674
> b7c670d6 Rob Herring 2017-08-21 675 printk(KERN_INFO "PCI host bridge %pOF %s ranges:\n",
> b7c670d6 Rob Herring 2017-08-21 676 dev, primary ? "(primary)" : "");
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 677
> 654837e8 Andrew Murray 2014-02-25 678 /* Check for ranges property */
> 654837e8 Andrew Murray 2014-02-25 679 if (of_pci_range_parser_init(&parser, dev))
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 680 return;
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 681
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 682 /* Parse it */
> 654837e8 Andrew Murray 2014-02-25 683 for_each_of_pci_range(&parser, &range) {
> e9f82cb7 Benjamin Herrenschmidt 2008-10-14 684 /* If we failed translation or got a zero-sized region
> e9f82cb7 Benjamin Herrenschmidt 2008-10-14 685 * (some FW try to feed us with non sensical zero sized regions
> e9f82cb7 Benjamin Herrenschmidt 2008-10-14 686 * such as power3 which look like some kind of attempt at exposing
> e9f82cb7 Benjamin Herrenschmidt 2008-10-14 687 * the VGA memory hole)
> e9f82cb7 Benjamin Herrenschmidt 2008-10-14 688 */
> 654837e8 Andrew Murray 2014-02-25 689 if (range.cpu_addr == OF_BAD_ADDR || range.size == 0)
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 690 continue;
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 691
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 692 /* Act based on address space type */
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 693 res = NULL;
> 654837e8 Andrew Murray 2014-02-25 694 switch (range.flags & IORESOURCE_TYPE_BITS) {
> 654837e8 Andrew Murray 2014-02-25 695 case IORESOURCE_IO:
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 696 printk(KERN_INFO
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 697 " IO 0x%016llx..0x%016llx -> 0x%016llx\n",
> 654837e8 Andrew Murray 2014-02-25 698 range.cpu_addr, range.cpu_addr + range.size - 1,
> 654837e8 Andrew Murray 2014-02-25 699 range.pci_addr);
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 700
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 701 /* We support only one IO range */
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 702 if (hose->pci_io_size) {
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 703 printk(KERN_INFO
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 704 " \\--> Skipped (too many) !\n");
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 705 continue;
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 706 }
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 707 #ifdef CONFIG_PPC32
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 708 /* On 32 bits, limit I/O space to 16MB */
> 654837e8 Andrew Murray 2014-02-25 709 if (range.size > 0x01000000)
> 654837e8 Andrew Murray 2014-02-25 710 range.size = 0x01000000;
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 711
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 712 /* 32 bits needs to map IOs here */
> 654837e8 Andrew Murray 2014-02-25 713 hose->io_base_virt = ioremap(range.cpu_addr,
> 654837e8 Andrew Murray 2014-02-25 714 range.size);
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 715
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 716 /* Expect trouble if pci_addr is not 0 */
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 717 if (primary)
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 718 isa_io_base =
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 719 (unsigned long)hose->io_base_virt;
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 720 #endif /* CONFIG_PPC32 */
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 721 /* pci_io_size and io_base_phys always represent IO
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 722 * space starting at 0 so we factor in pci_addr
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 723 */
> 654837e8 Andrew Murray 2014-02-25 724 hose->pci_io_size = range.pci_addr + range.size;
> 654837e8 Andrew Murray 2014-02-25 725 hose->io_base_phys = range.cpu_addr - range.pci_addr;
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 726
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 727 /* Build resource */
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 728 res = &hose->io_resource;
> 654837e8 Andrew Murray 2014-02-25 729 range.cpu_addr = range.pci_addr;
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 730 break;
> 654837e8 Andrew Murray 2014-02-25 731 case IORESOURCE_MEM:
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 732 printk(KERN_INFO
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 733 " MEM 0x%016llx..0x%016llx -> 0x%016llx %s\n",
> 654837e8 Andrew Murray 2014-02-25 734 range.cpu_addr, range.cpu_addr + range.size - 1,
> 654837e8 Andrew Murray 2014-02-25 735 range.pci_addr,
> 654837e8 Andrew Murray 2014-02-25 736 (range.pci_space & 0x40000000) ?
> 654837e8 Andrew Murray 2014-02-25 737 "Prefetch" : "");
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 738
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 739 /* We support only 3 memory ranges */
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 740 if (memno >= 3) {
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 741 printk(KERN_INFO
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 742 " \\--> Skipped (too many) !\n");
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 743 continue;
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 744 }
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 745 /* Handles ISA memory hole space here */
> 654837e8 Andrew Murray 2014-02-25 746 if (range.pci_addr == 0) {
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 747 if (primary || isa_mem_base == 0)
> 654837e8 Andrew Murray 2014-02-25 748 isa_mem_base = range.cpu_addr;
> 654837e8 Andrew Murray 2014-02-25 749 hose->isa_mem_phys = range.cpu_addr;
> 654837e8 Andrew Murray 2014-02-25 750 hose->isa_mem_size = range.size;
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 751 }
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 752
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 753 /* Build resource */
> 654837e8 Andrew Murray 2014-02-25 754 hose->mem_offset[memno] = range.cpu_addr -
> 654837e8 Andrew Murray 2014-02-25 755 range.pci_addr;
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 756 res = &hose->mem_resources[memno++];
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 757 break;
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 758 }
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 759 if (res != NULL) {
> aeba3731 Michael Ellerman 2014-10-16 760 res->name = dev->full_name;
> aeba3731 Michael Ellerman 2014-10-16 761 res->flags = range.flags;
> aeba3731 Michael Ellerman 2014-10-16 762 res->start = range.cpu_addr;
> aeba3731 Michael Ellerman 2014-10-16 763 res->end = range.cpu_addr + range.size - 1;
> aeba3731 Michael Ellerman 2014-10-16 @764 res->parent = res->child = res->sibling = NULL;
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 765 }
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 766 }
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 767 }
> fa462f2d Benjamin Herrenschmidt 2007-12-20 768
>
> :::::: The code at line 764 was first introduced by commit
> :::::: aeba3731b150188685225b510886f1370d8814de powerpc/pci: Fix IO space breakage after of_pci_range_to_resource() change
>
> :::::: TO: Michael Ellerman <mpe@ellerman.id.au>
> :::::: CC: Michael Ellerman <mpe@ellerman.id.au>
>
> ---
> 0-DAY kernel test infrastructure Open Source Technology Center
> https://lists.01.org/pipermail/kbuild-all Intel Corporation
^ permalink raw reply related [flat|nested] 42+ messages in thread
* Re: [PATCH v4 1/3] resource: Use list_head to link sibling resource
@ 2018-05-09 2:08 ` Baoquan He
0 siblings, 0 replies; 42+ messages in thread
From: Baoquan He @ 2018-05-09 2:08 UTC (permalink / raw)
To: kbuild test robot
Cc: nicolas.pitre-QSEj5FYQhm4dnm+yROfE0A, brijesh.singh-5C7GfCeVMHo,
devicetree-u79uwXL29TY76Z2rM5mHXA, airlied-cv59FeDIM0c,
linux-pci-u79uwXL29TY76Z2rM5mHXA,
richard.weiyang-Re5JQEeQqe8AvxtiuMwx3w,
keith.busch-ral2JQCrhuEAvxtiuMwx3w,
jcmvbkbc-Re5JQEeQqe8AvxtiuMwx3w,
baiyaowei-0p4V/sDNsUmm0O/7XYngnFaTQe2KTcn/,
kys-0li6OtcxBFHby3iVrkZq2A, frowand.list-Re5JQEeQqe8AvxtiuMwx3w,
lorenzo.pieralisi-5wv7dgnIgG8, sthemmin-0li6OtcxBFHby3iVrkZq2A,
linux-nvdimm-hn68Rpc1hR1g9hUCZPvPmw,
patrik.r.jakobsson-Re5JQEeQqe8AvxtiuMwx3w,
linux-input-u79uwXL29TY76Z2rM5mHXA,
gustavo-THi1TnShQwVAfugRpC6u6w, bp-l3A5Bk7waGM,
dyoung-H+wXaHxf7aLQT0dZR+AlfA, ebiederm-aS9lmoZGLiVWk0Htik3J/w,
thomas.lendacky-5C7GfCeVMHo, haiyangz-0li6OtcxBFHby3iVrkZq2A,
maarten.lankhorst-VuQAYsv1563Yd54FQh9/CA,
josh-iaAMLnmF4UmaiuxdJuQwMA, jglisse-H+wXaHxf7aLQT0dZR+AlfA,
robh+dt-DgEjT+Ai2ygdnm+yROfE0A, seanpaul-F7+t8E8rja9g9hUCZPvPmw,
bhelgaas-hpIqsD4AKlfQT0dZR+AlfA, tglx-hfZtesqFncYOwBW4kG4KsQ,
yinghai-DgEjT+Ai2ygdnm+yROfE0A,
jonathan.derrick-ral2JQCrhuEAvxtiuMwx3w,
chris-YvXeqwSYzG2sTnJN9+BGXg, monstr-pSz03upnqPeHXe+LvDLADg,
linux-parisc-u79uwXL29TY76Z2rM5mHXA,
gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r,
dmitry.torokhov-Re5JQEeQqe8AvxtiuMwx3w,
kexec-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r
On 05/07/18 at 07:42pm, kbuild test robot wrote:
> Hi Baoquan,
>
> I love your patch! Yet something to improve:
>
> [auto build test ERROR on linus/master]
> [also build test ERROR on v4.17-rc4 next-20180504]
> [if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
>
> url: https://github.com/0day-ci/linux/commits/Baoquan-He/resource-Use-list_head-to-link-sibling-resource/20180507-144345
> config: powerpc-defconfig (attached as .config)
> compiler: powerpc64-linux-gnu-gcc (Debian 7.2.0-11) 7.2.0
> reproduce:
> wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
> chmod +x ~/bin/make.cross
> # save the attached .config to linux build tree
> make.cross ARCH=powerpc
>
> All errors (new ones prefixed by >>):
>
> arch/powerpc/kernel/pci-common.c: In function 'pci_process_bridge_OF_ranges':
> >> arch/powerpc/kernel/pci-common.c:764:44: error: incompatible types when assigning to type 'struct list_head' from type 'void *'
> res->parent = res->child = res->sibling = NULL;
Pasted code can fix above error.
diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c
index fe9733ffffaa..a7e68f6f9f24 100644
--- a/arch/powerpc/kernel/pci-common.c
+++ b/arch/powerpc/kernel/pci-common.c
@@ -761,7 +761,9 @@ void pci_process_bridge_OF_ranges(struct pci_controller *hose,
res->flags = range.flags;
res->start = range.cpu_addr;
res->end = range.cpu_addr + range.size - 1;
- res->parent = res->child = res->sibling = NULL;
+ res->parent = NULL;
+ INIT_LIST_HEAD(&res->child);
+ INIT_LIST_HEAD(&res->sibling);
}
}
}
> ^
> arch/powerpc/kernel/pci-common.c: In function 'reparent_resources':
> >> arch/powerpc/kernel/pci-common.c:1100:10: error: assignment from incompatible pointer type [-Werror=incompatible-pointer-types]
> for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) {
> ^
This reparent_resources() function is duplicated with the one in
arch/microblaze/pci/pci-common.c which has been fixed in v4. I planned
to move it to kernel/resource.c in a separate patch since it's shared by
different ARCH, then fix it in this patch.
> arch/powerpc/kernel/pci-common.c:1100:50: error: assignment from incompatible pointer type [-Werror=incompatible-pointer-types]
> for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) {
> ^
> >> arch/powerpc/kernel/pci-common.c:1113:13: error: incompatible types when assigning to type 'struct list_head' from type 'struct resource *'
> res->child = *firstpp;
> ^
> arch/powerpc/kernel/pci-common.c:1114:15: error: incompatible types when assigning to type 'struct list_head' from type 'struct resource *'
> res->sibling = *pp;
> ^
> >> arch/powerpc/kernel/pci-common.c:1117:9: error: incompatible types when assigning to type 'struct resource *' from type 'struct list_head'
> for (p = res->child; p != NULL; p = p->sibling) {
> ^
> arch/powerpc/kernel/pci-common.c:1117:36: error: incompatible types when assigning to type 'struct resource *' from type 'struct list_head'
> for (p = res->child; p != NULL; p = p->sibling) {
> ^
> cc1: all warnings being treated as errors
>
> vim +764 arch/powerpc/kernel/pci-common.c
>
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 642
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 643 /**
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 644 * pci_process_bridge_OF_ranges - Parse PCI bridge resources from device tree
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 645 * @hose: newly allocated pci_controller to be setup
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 646 * @dev: device node of the host bridge
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 647 * @primary: set if primary bus (32 bits only, soon to be deprecated)
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 648 *
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 649 * This function will parse the "ranges" property of a PCI host bridge device
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 650 * node and setup the resource mapping of a pci controller based on its
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 651 * content.
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 652 *
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 653 * Life would be boring if it wasn't for a few issues that we have to deal
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 654 * with here:
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 655 *
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 656 * - We can only cope with one IO space range and up to 3 Memory space
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 657 * ranges. However, some machines (thanks Apple !) tend to split their
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 658 * space into lots of small contiguous ranges. So we have to coalesce.
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 659 *
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 660 * - Some busses have IO space not starting at 0, which causes trouble with
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 661 * the way we do our IO resource renumbering. The code somewhat deals with
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 662 * it for 64 bits but I would expect problems on 32 bits.
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 663 *
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 664 * - Some 32 bits platforms such as 4xx can have physical space larger than
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 665 * 32 bits so we need to use 64 bits values for the parsing
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 666 */
> cad5cef6 Greg Kroah-Hartman 2012-12-21 667 void pci_process_bridge_OF_ranges(struct pci_controller *hose,
> cad5cef6 Greg Kroah-Hartman 2012-12-21 668 struct device_node *dev, int primary)
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 669 {
> 858957ab Kevin Hao 2013-05-16 670 int memno = 0;
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 671 struct resource *res;
> 654837e8 Andrew Murray 2014-02-25 672 struct of_pci_range range;
> 654837e8 Andrew Murray 2014-02-25 673 struct of_pci_range_parser parser;
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 674
> b7c670d6 Rob Herring 2017-08-21 675 printk(KERN_INFO "PCI host bridge %pOF %s ranges:\n",
> b7c670d6 Rob Herring 2017-08-21 676 dev, primary ? "(primary)" : "");
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 677
> 654837e8 Andrew Murray 2014-02-25 678 /* Check for ranges property */
> 654837e8 Andrew Murray 2014-02-25 679 if (of_pci_range_parser_init(&parser, dev))
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 680 return;
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 681
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 682 /* Parse it */
> 654837e8 Andrew Murray 2014-02-25 683 for_each_of_pci_range(&parser, &range) {
> e9f82cb7 Benjamin Herrenschmidt 2008-10-14 684 /* If we failed translation or got a zero-sized region
> e9f82cb7 Benjamin Herrenschmidt 2008-10-14 685 * (some FW try to feed us with non sensical zero sized regions
> e9f82cb7 Benjamin Herrenschmidt 2008-10-14 686 * such as power3 which look like some kind of attempt at exposing
> e9f82cb7 Benjamin Herrenschmidt 2008-10-14 687 * the VGA memory hole)
> e9f82cb7 Benjamin Herrenschmidt 2008-10-14 688 */
> 654837e8 Andrew Murray 2014-02-25 689 if (range.cpu_addr == OF_BAD_ADDR || range.size == 0)
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 690 continue;
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 691
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 692 /* Act based on address space type */
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 693 res = NULL;
> 654837e8 Andrew Murray 2014-02-25 694 switch (range.flags & IORESOURCE_TYPE_BITS) {
> 654837e8 Andrew Murray 2014-02-25 695 case IORESOURCE_IO:
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 696 printk(KERN_INFO
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 697 " IO 0x%016llx..0x%016llx -> 0x%016llx\n",
> 654837e8 Andrew Murray 2014-02-25 698 range.cpu_addr, range.cpu_addr + range.size - 1,
> 654837e8 Andrew Murray 2014-02-25 699 range.pci_addr);
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 700
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 701 /* We support only one IO range */
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 702 if (hose->pci_io_size) {
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 703 printk(KERN_INFO
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 704 " \\--> Skipped (too many) !\n");
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 705 continue;
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 706 }
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 707 #ifdef CONFIG_PPC32
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 708 /* On 32 bits, limit I/O space to 16MB */
> 654837e8 Andrew Murray 2014-02-25 709 if (range.size > 0x01000000)
> 654837e8 Andrew Murray 2014-02-25 710 range.size = 0x01000000;
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 711
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 712 /* 32 bits needs to map IOs here */
> 654837e8 Andrew Murray 2014-02-25 713 hose->io_base_virt = ioremap(range.cpu_addr,
> 654837e8 Andrew Murray 2014-02-25 714 range.size);
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 715
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 716 /* Expect trouble if pci_addr is not 0 */
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 717 if (primary)
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 718 isa_io_base =
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 719 (unsigned long)hose->io_base_virt;
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 720 #endif /* CONFIG_PPC32 */
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 721 /* pci_io_size and io_base_phys always represent IO
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 722 * space starting at 0 so we factor in pci_addr
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 723 */
> 654837e8 Andrew Murray 2014-02-25 724 hose->pci_io_size = range.pci_addr + range.size;
> 654837e8 Andrew Murray 2014-02-25 725 hose->io_base_phys = range.cpu_addr - range.pci_addr;
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 726
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 727 /* Build resource */
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 728 res = &hose->io_resource;
> 654837e8 Andrew Murray 2014-02-25 729 range.cpu_addr = range.pci_addr;
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 730 break;
> 654837e8 Andrew Murray 2014-02-25 731 case IORESOURCE_MEM:
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 732 printk(KERN_INFO
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 733 " MEM 0x%016llx..0x%016llx -> 0x%016llx %s\n",
> 654837e8 Andrew Murray 2014-02-25 734 range.cpu_addr, range.cpu_addr + range.size - 1,
> 654837e8 Andrew Murray 2014-02-25 735 range.pci_addr,
> 654837e8 Andrew Murray 2014-02-25 736 (range.pci_space & 0x40000000) ?
> 654837e8 Andrew Murray 2014-02-25 737 "Prefetch" : "");
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 738
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 739 /* We support only 3 memory ranges */
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 740 if (memno >= 3) {
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 741 printk(KERN_INFO
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 742 " \\--> Skipped (too many) !\n");
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 743 continue;
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 744 }
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 745 /* Handles ISA memory hole space here */
> 654837e8 Andrew Murray 2014-02-25 746 if (range.pci_addr == 0) {
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 747 if (primary || isa_mem_base == 0)
> 654837e8 Andrew Murray 2014-02-25 748 isa_mem_base = range.cpu_addr;
> 654837e8 Andrew Murray 2014-02-25 749 hose->isa_mem_phys = range.cpu_addr;
> 654837e8 Andrew Murray 2014-02-25 750 hose->isa_mem_size = range.size;
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 751 }
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 752
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 753 /* Build resource */
> 654837e8 Andrew Murray 2014-02-25 754 hose->mem_offset[memno] = range.cpu_addr -
> 654837e8 Andrew Murray 2014-02-25 755 range.pci_addr;
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 756 res = &hose->mem_resources[memno++];
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 757 break;
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 758 }
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 759 if (res != NULL) {
> aeba3731 Michael Ellerman 2014-10-16 760 res->name = dev->full_name;
> aeba3731 Michael Ellerman 2014-10-16 761 res->flags = range.flags;
> aeba3731 Michael Ellerman 2014-10-16 762 res->start = range.cpu_addr;
> aeba3731 Michael Ellerman 2014-10-16 763 res->end = range.cpu_addr + range.size - 1;
> aeba3731 Michael Ellerman 2014-10-16 @764 res->parent = res->child = res->sibling = NULL;
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 765 }
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 766 }
> 13dccb9e Benjamin Herrenschmidt 2007-12-11 767 }
> fa462f2d Benjamin Herrenschmidt 2007-12-20 768
>
> :::::: The code at line 764 was first introduced by commit
> :::::: aeba3731b150188685225b510886f1370d8814de powerpc/pci: Fix IO space breakage after of_pci_range_to_resource() change
>
> :::::: TO: Michael Ellerman <mpe-Gsx/Oe8HsFggBc27wqDAHg@public.gmane.org>
> :::::: CC: Michael Ellerman <mpe-Gsx/Oe8HsFggBc27wqDAHg@public.gmane.org>
>
> ---
> 0-DAY kernel test infrastructure Open Source Technology Center
> https://lists.01.org/pipermail/kbuild-all Intel Corporation
^ permalink raw reply related [flat|nested] 42+ messages in thread
* Re: [PATCH v4 1/3] resource: Use list_head to link sibling resource
@ 2018-05-07 15:50 ` kbuild test robot
0 siblings, 0 replies; 42+ messages in thread
From: kbuild test robot @ 2018-05-07 15:50 UTC (permalink / raw)
To: Baoquan He
Cc: nicolas.pitre, brijesh.singh, devicetree, airlied, linux-pci,
richard.weiyang, keith.busch, jcmvbkbc, baiyaowei, kys,
frowand.list, lorenzo.pieralisi, sthemmin, linux-nvdimm,
patrik.r.jakobsson, linux-input, gustavo, bp, dyoung, ebiederm,
thomas.lendacky, haiyangz, maarten.lankhorst, josh, jglisse,
robh+dt, seanpaul, bhelgaas, tglx, yinghai, jonathan.derrick,
chris, monstr, linux-parisc, gregkh, dmitry.torokhov, kexec,
linux-kernel, kbuild-all, devel, akpm, fengguang.wu, davem
Hi Baoquan,
I love your patch! Yet something to improve:
[auto build test ERROR on linus/master]
[also build test ERROR on v4.17-rc4 next-20180504]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
url: https://github.com/0day-ci/linux/commits/Baoquan-He/resource-Use-list_head-to-link-sibling-resource/20180507-144345
config: arm-allmodconfig (attached as .config)
compiler: arm-linux-gnueabi-gcc (Debian 7.2.0-11) 7.2.0
reproduce:
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
make.cross ARCH=arm
All errors (new ones prefixed by >>):
arch/arm/plat-samsung/pm-check.c: In function 's3c_pm_run_res':
>> arch/arm/plat-samsung/pm-check.c:49:18: error: invalid operands to binary != (have 'struct list_head' and 'void *')
if (ptr->child != NULL)
~~~~~~~~~~ ^~
>> arch/arm/plat-samsung/pm-check.c:50:19: error: incompatible type for argument 1 of 's3c_pm_run_res'
s3c_pm_run_res(ptr->child, fn, arg);
^~~
arch/arm/plat-samsung/pm-check.c:46:13: note: expected 'struct resource *' but argument is of type 'struct list_head'
static void s3c_pm_run_res(struct resource *ptr, run_fn_t fn, u32 *arg)
^~~~~~~~~~~~~~
>> arch/arm/plat-samsung/pm-check.c:60:7: error: incompatible types when assigning to type 'struct resource *' from type 'struct list_head'
ptr = ptr->sibling;
^
vim +49 arch/arm/plat-samsung/pm-check.c
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 45
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 46 static void s3c_pm_run_res(struct resource *ptr, run_fn_t fn, u32 *arg)
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 47 {
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 48 while (ptr != NULL) {
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 @49 if (ptr->child != NULL)
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 @50 s3c_pm_run_res(ptr->child, fn, arg);
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 51
05fee7cf arch/arm/plat-samsung/pm-check.c Toshi Kani 2016-01-26 52 if ((ptr->flags & IORESOURCE_SYSTEM_RAM)
05fee7cf arch/arm/plat-samsung/pm-check.c Toshi Kani 2016-01-26 53 == IORESOURCE_SYSTEM_RAM) {
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 54 S3C_PMDBG("Found system RAM at %08lx..%08lx\n",
840eeeb8 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 55 (unsigned long)ptr->start,
840eeeb8 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 56 (unsigned long)ptr->end);
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 57 arg = (fn)(ptr, arg);
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 58 }
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 59
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 @60 ptr = ptr->sibling;
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 61 }
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 62 }
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 63
:::::: The code at line 49 was first introduced by commit
:::::: 549c7e33aeb9bfe441ecf68639d2227bb90978e7 [ARM] S3C: Split the resume memory check code from pm.c
:::::: TO: Ben Dooks <ben-linux@fluff.org>
:::::: CC: Ben Dooks <ben-linux@fluff.org>
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
_______________________________________________
Linux-nvdimm mailing list
Linux-nvdimm@lists.01.org
https://lists.01.org/mailman/listinfo/linux-nvdimm
^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: [PATCH v4 1/3] resource: Use list_head to link sibling resource
@ 2018-05-07 15:50 ` kbuild test robot
0 siblings, 0 replies; 42+ messages in thread
From: kbuild test robot @ 2018-05-07 15:50 UTC (permalink / raw)
To: Baoquan He
Cc: nicolas.pitre, brijesh.singh, devicetree, airlied, linux-pci,
richard.weiyang, keith.busch, jcmvbkbc, baiyaowei, kys,
frowand.list, dan.j.williams, lorenzo.pieralisi, sthemmin,
Baoquan He, linux-nvdimm, patrik.r.jakobsson, linux-input,
gustavo, bp, dyoung, vgoyal, ebiederm, thomas.lendacky, haiyangz,
maarten.lankhorst, josh, jglisse, robh+dt, seanpaul, bhelgaas,
tglx, yinghai, jonathan.derrick, chris, monstr, linux-parisc,
gregkh, dmitry.torokhov, kexec, linux-kernel, kbuild-all, devel,
akpm, fengguang.wu, davem
[-- Attachment #1: Type: text/plain, Size: 3751 bytes --]
Hi Baoquan,
I love your patch! Yet something to improve:
[auto build test ERROR on linus/master]
[also build test ERROR on v4.17-rc4 next-20180504]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
url: https://github.com/0day-ci/linux/commits/Baoquan-He/resource-Use-list_head-to-link-sibling-resource/20180507-144345
config: arm-allmodconfig (attached as .config)
compiler: arm-linux-gnueabi-gcc (Debian 7.2.0-11) 7.2.0
reproduce:
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
make.cross ARCH=arm
All errors (new ones prefixed by >>):
arch/arm/plat-samsung/pm-check.c: In function 's3c_pm_run_res':
>> arch/arm/plat-samsung/pm-check.c:49:18: error: invalid operands to binary != (have 'struct list_head' and 'void *')
if (ptr->child != NULL)
~~~~~~~~~~ ^~
>> arch/arm/plat-samsung/pm-check.c:50:19: error: incompatible type for argument 1 of 's3c_pm_run_res'
s3c_pm_run_res(ptr->child, fn, arg);
^~~
arch/arm/plat-samsung/pm-check.c:46:13: note: expected 'struct resource *' but argument is of type 'struct list_head'
static void s3c_pm_run_res(struct resource *ptr, run_fn_t fn, u32 *arg)
^~~~~~~~~~~~~~
>> arch/arm/plat-samsung/pm-check.c:60:7: error: incompatible types when assigning to type 'struct resource *' from type 'struct list_head'
ptr = ptr->sibling;
^
vim +49 arch/arm/plat-samsung/pm-check.c
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 45
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 46 static void s3c_pm_run_res(struct resource *ptr, run_fn_t fn, u32 *arg)
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 47 {
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 48 while (ptr != NULL) {
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 @49 if (ptr->child != NULL)
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 @50 s3c_pm_run_res(ptr->child, fn, arg);
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 51
05fee7cf arch/arm/plat-samsung/pm-check.c Toshi Kani 2016-01-26 52 if ((ptr->flags & IORESOURCE_SYSTEM_RAM)
05fee7cf arch/arm/plat-samsung/pm-check.c Toshi Kani 2016-01-26 53 == IORESOURCE_SYSTEM_RAM) {
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 54 S3C_PMDBG("Found system RAM at %08lx..%08lx\n",
840eeeb8 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 55 (unsigned long)ptr->start,
840eeeb8 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 56 (unsigned long)ptr->end);
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 57 arg = (fn)(ptr, arg);
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 58 }
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 59
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 @60 ptr = ptr->sibling;
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 61 }
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 62 }
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 63
:::::: The code at line 49 was first introduced by commit
:::::: 549c7e33aeb9bfe441ecf68639d2227bb90978e7 [ARM] S3C: Split the resume memory check code from pm.c
:::::: TO: Ben Dooks <ben-linux@fluff.org>
:::::: CC: Ben Dooks <ben-linux@fluff.org>
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 65199 bytes --]
[-- Attachment #3: Type: text/plain, Size: 143 bytes --]
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: [PATCH v4 1/3] resource: Use list_head to link sibling resource
@ 2018-05-07 15:50 ` kbuild test robot
0 siblings, 0 replies; 42+ messages in thread
From: kbuild test robot @ 2018-05-07 15:50 UTC (permalink / raw)
To: Baoquan He
Cc: kbuild-all, linux-kernel, akpm, robh+dt, dan.j.williams,
nicolas.pitre, josh, fengguang.wu, bp, patrik.r.jakobsson,
airlied, kys, haiyangz, sthemmin, dmitry.torokhov, frowand.list,
keith.busch, jonathan.derrick, lorenzo.pieralisi, bhelgaas, tglx,
brijesh.singh, jglisse, thomas.lendacky, gregkh, baiyaowei,
richard.weiyang, devel, linux-input, linux-nvdimm, devicetree,
linux-pci, ebiederm, vgoyal, dyoung, yinghai, kexec, monstr,
davem, chris, jcmvbkbc, gustavo, maarten.lankhorst, seanpaul,
linux-parisc, Baoquan He
[-- Attachment #1: Type: text/plain, Size: 3751 bytes --]
Hi Baoquan,
I love your patch! Yet something to improve:
[auto build test ERROR on linus/master]
[also build test ERROR on v4.17-rc4 next-20180504]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
url: https://github.com/0day-ci/linux/commits/Baoquan-He/resource-Use-list_head-to-link-sibling-resource/20180507-144345
config: arm-allmodconfig (attached as .config)
compiler: arm-linux-gnueabi-gcc (Debian 7.2.0-11) 7.2.0
reproduce:
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
make.cross ARCH=arm
All errors (new ones prefixed by >>):
arch/arm/plat-samsung/pm-check.c: In function 's3c_pm_run_res':
>> arch/arm/plat-samsung/pm-check.c:49:18: error: invalid operands to binary != (have 'struct list_head' and 'void *')
if (ptr->child != NULL)
~~~~~~~~~~ ^~
>> arch/arm/plat-samsung/pm-check.c:50:19: error: incompatible type for argument 1 of 's3c_pm_run_res'
s3c_pm_run_res(ptr->child, fn, arg);
^~~
arch/arm/plat-samsung/pm-check.c:46:13: note: expected 'struct resource *' but argument is of type 'struct list_head'
static void s3c_pm_run_res(struct resource *ptr, run_fn_t fn, u32 *arg)
^~~~~~~~~~~~~~
>> arch/arm/plat-samsung/pm-check.c:60:7: error: incompatible types when assigning to type 'struct resource *' from type 'struct list_head'
ptr = ptr->sibling;
^
vim +49 arch/arm/plat-samsung/pm-check.c
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 45
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 46 static void s3c_pm_run_res(struct resource *ptr, run_fn_t fn, u32 *arg)
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 47 {
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 48 while (ptr != NULL) {
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 @49 if (ptr->child != NULL)
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 @50 s3c_pm_run_res(ptr->child, fn, arg);
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 51
05fee7cf arch/arm/plat-samsung/pm-check.c Toshi Kani 2016-01-26 52 if ((ptr->flags & IORESOURCE_SYSTEM_RAM)
05fee7cf arch/arm/plat-samsung/pm-check.c Toshi Kani 2016-01-26 53 == IORESOURCE_SYSTEM_RAM) {
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 54 S3C_PMDBG("Found system RAM at %08lx..%08lx\n",
840eeeb8 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 55 (unsigned long)ptr->start,
840eeeb8 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 56 (unsigned long)ptr->end);
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 57 arg = (fn)(ptr, arg);
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 58 }
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 59
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 @60 ptr = ptr->sibling;
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 61 }
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 62 }
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 63
:::::: The code at line 49 was first introduced by commit
:::::: 549c7e33aeb9bfe441ecf68639d2227bb90978e7 [ARM] S3C: Split the resume memory check code from pm.c
:::::: TO: Ben Dooks <ben-linux@fluff.org>
:::::: CC: Ben Dooks <ben-linux@fluff.org>
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 65199 bytes --]
^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: [PATCH v4 1/3] resource: Use list_head to link sibling resource
@ 2018-05-07 15:50 ` kbuild test robot
0 siblings, 0 replies; 42+ messages in thread
From: kbuild test robot @ 2018-05-07 15:50 UTC (permalink / raw)
Cc: nicolas.pitre-QSEj5FYQhm4dnm+yROfE0A, brijesh.singh-5C7GfCeVMHo,
devicetree-u79uwXL29TY76Z2rM5mHXA, airlied-cv59FeDIM0c,
linux-pci-u79uwXL29TY76Z2rM5mHXA,
richard.weiyang-Re5JQEeQqe8AvxtiuMwx3w,
keith.busch-ral2JQCrhuEAvxtiuMwx3w,
jcmvbkbc-Re5JQEeQqe8AvxtiuMwx3w,
baiyaowei-0p4V/sDNsUmm0O/7XYngnFaTQe2KTcn/,
kys-0li6OtcxBFHby3iVrkZq2A, frowand.list-Re5JQEeQqe8AvxtiuMwx3w,
lorenzo.pieralisi-5wv7dgnIgG8, sthemmin-0li6OtcxBFHby3iVrkZq2A,
Baoquan He, linux-nvdimm-hn68Rpc1hR1g9hUCZPvPmw,
patrik.r.jakobsson-Re5JQEeQqe8AvxtiuMwx3w,
linux-input-u79uwXL29TY76Z2rM5mHXA,
gustavo-THi1TnShQwVAfugRpC6u6w, bp-l3A5Bk7waGM,
dyoung-H+wXaHxf7aLQT0dZR+AlfA, ebiederm-aS9lmoZGLiVWk0Htik3J/w,
thomas.lendacky-5C7GfCeVMHo, haiyangz-0li6OtcxBFHby3iVrkZq2A,
maarten.lankhorst-VuQAYsv1563Yd54FQh9/CA,
josh-iaAMLnmF4UmaiuxdJuQwMA, jglisse-H+wXaHxf7aLQT0dZR+AlfA,
robh+dt-DgEjT+Ai2ygdnm+yROfE0A, seanpaul-F7+t8E8rja9g9hUCZPvPmw,
bhelgaas-hpIqsD4AKlfQT0dZR+AlfA, tglx-hfZtesqFncYOwBW4kG4KsQ,
yinghai-DgEjT+Ai2ygdnm+yROfE0A,
jonathan.derrick-ral2JQCrhuEAvxtiuMwx3w,
chris-YvXeqwSYzG2sTnJN9+BGXg, monstr-pSz03upnqPeHXe+LvDLADg,
linux-parisc-u79uwXL29TY76Z2rM5mHXA,
gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r, dmitry.torokhov
Hi Baoquan,
I love your patch! Yet something to improve:
[auto build test ERROR on linus/master]
[also build test ERROR on v4.17-rc4 next-20180504]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
url: https://github.com/0day-ci/linux/commits/Baoquan-He/resource-Use-list_head-to-link-sibling-resource/20180507-144345
config: arm-allmodconfig (attached as .config)
compiler: arm-linux-gnueabi-gcc (Debian 7.2.0-11) 7.2.0
reproduce:
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
make.cross ARCH=arm
All errors (new ones prefixed by >>):
arch/arm/plat-samsung/pm-check.c: In function 's3c_pm_run_res':
>> arch/arm/plat-samsung/pm-check.c:49:18: error: invalid operands to binary != (have 'struct list_head' and 'void *')
if (ptr->child != NULL)
~~~~~~~~~~ ^~
>> arch/arm/plat-samsung/pm-check.c:50:19: error: incompatible type for argument 1 of 's3c_pm_run_res'
s3c_pm_run_res(ptr->child, fn, arg);
^~~
arch/arm/plat-samsung/pm-check.c:46:13: note: expected 'struct resource *' but argument is of type 'struct list_head'
static void s3c_pm_run_res(struct resource *ptr, run_fn_t fn, u32 *arg)
^~~~~~~~~~~~~~
>> arch/arm/plat-samsung/pm-check.c:60:7: error: incompatible types when assigning to type 'struct resource *' from type 'struct list_head'
ptr = ptr->sibling;
^
vim +49 arch/arm/plat-samsung/pm-check.c
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 45
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 46 static void s3c_pm_run_res(struct resource *ptr, run_fn_t fn, u32 *arg)
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 47 {
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 48 while (ptr != NULL) {
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 @49 if (ptr->child != NULL)
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 @50 s3c_pm_run_res(ptr->child, fn, arg);
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 51
05fee7cf arch/arm/plat-samsung/pm-check.c Toshi Kani 2016-01-26 52 if ((ptr->flags & IORESOURCE_SYSTEM_RAM)
05fee7cf arch/arm/plat-samsung/pm-check.c Toshi Kani 2016-01-26 53 == IORESOURCE_SYSTEM_RAM) {
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 54 S3C_PMDBG("Found system RAM at %08lx..%08lx\n",
840eeeb8 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 55 (unsigned long)ptr->start,
840eeeb8 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 56 (unsigned long)ptr->end);
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 57 arg = (fn)(ptr, arg);
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 58 }
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 59
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 @60 ptr = ptr->sibling;
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 61 }
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 62 }
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 63
:::::: The code at line 49 was first introduced by commit
:::::: 549c7e33aeb9bfe441ecf68639d2227bb90978e7 [ARM] S3C: Split the resume memory check code from pm.c
:::::: TO: Ben Dooks <ben-linux-elnMNo+KYs3YtjvyW6yDsg@public.gmane.org>
:::::: CC: Ben Dooks <ben-linux-elnMNo+KYs3YtjvyW6yDsg@public.gmane.org>
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: [PATCH v4 1/3] resource: Use list_head to link sibling resource
@ 2018-05-07 15:50 ` kbuild test robot
0 siblings, 0 replies; 42+ messages in thread
From: kbuild test robot @ 2018-05-07 15:50 UTC (permalink / raw)
To: Baoquan He
Cc: nicolas.pitre, brijesh.singh, devicetree, airlied, linux-pci,
richard.weiyang, keith.busch, jcmvbkbc, baiyaowei, frowand.list,
dan.j.williams, lorenzo.pieralisi, sthemmin, Baoquan He,
linux-nvdimm, patrik.r.jakobsson, linux-input, gustavo, bp,
dyoung, vgoyal, ebiederm, thomas.lendacky, haiyangz,
maarten.lankhorst, josh, jglisse, robh+dt, seanpaul, bhelgaas,
tglx, yinghai, jonathan.derrick, chris, monstr, linux-parisc,
gregkh, dmitry.torokhov, kexec, linux-kernel, kbuild-all, devel,
akpm, fengguang.wu, davem
[-- Attachment #1: Type: text/plain, Size: 3751 bytes --]
Hi Baoquan,
I love your patch! Yet something to improve:
[auto build test ERROR on linus/master]
[also build test ERROR on v4.17-rc4 next-20180504]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
url: https://github.com/0day-ci/linux/commits/Baoquan-He/resource-Use-list_head-to-link-sibling-resource/20180507-144345
config: arm-allmodconfig (attached as .config)
compiler: arm-linux-gnueabi-gcc (Debian 7.2.0-11) 7.2.0
reproduce:
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
make.cross ARCH=arm
All errors (new ones prefixed by >>):
arch/arm/plat-samsung/pm-check.c: In function 's3c_pm_run_res':
>> arch/arm/plat-samsung/pm-check.c:49:18: error: invalid operands to binary != (have 'struct list_head' and 'void *')
if (ptr->child != NULL)
~~~~~~~~~~ ^~
>> arch/arm/plat-samsung/pm-check.c:50:19: error: incompatible type for argument 1 of 's3c_pm_run_res'
s3c_pm_run_res(ptr->child, fn, arg);
^~~
arch/arm/plat-samsung/pm-check.c:46:13: note: expected 'struct resource *' but argument is of type 'struct list_head'
static void s3c_pm_run_res(struct resource *ptr, run_fn_t fn, u32 *arg)
^~~~~~~~~~~~~~
>> arch/arm/plat-samsung/pm-check.c:60:7: error: incompatible types when assigning to type 'struct resource *' from type 'struct list_head'
ptr = ptr->sibling;
^
vim +49 arch/arm/plat-samsung/pm-check.c
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 45
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 46 static void s3c_pm_run_res(struct resource *ptr, run_fn_t fn, u32 *arg)
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 47 {
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 48 while (ptr != NULL) {
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 @49 if (ptr->child != NULL)
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 @50 s3c_pm_run_res(ptr->child, fn, arg);
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 51
05fee7cf arch/arm/plat-samsung/pm-check.c Toshi Kani 2016-01-26 52 if ((ptr->flags & IORESOURCE_SYSTEM_RAM)
05fee7cf arch/arm/plat-samsung/pm-check.c Toshi Kani 2016-01-26 53 == IORESOURCE_SYSTEM_RAM) {
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 54 S3C_PMDBG("Found system RAM at %08lx..%08lx\n",
840eeeb8 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 55 (unsigned long)ptr->start,
840eeeb8 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 56 (unsigned long)ptr->end);
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 57 arg = (fn)(ptr, arg);
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 58 }
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 59
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 @60 ptr = ptr->sibling;
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 61 }
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 62 }
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 63
:::::: The code at line 49 was first introduced by commit
:::::: 549c7e33aeb9bfe441ecf68639d2227bb90978e7 [ARM] S3C: Split the resume memory check code from pm.c
:::::: TO: Ben Dooks <ben-linux@fluff.org>
:::::: CC: Ben Dooks <ben-linux@fluff.org>
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 65199 bytes --]
[-- Attachment #3: Type: text/plain, Size: 169 bytes --]
_______________________________________________
devel mailing list
devel@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: [PATCH v4 1/3] resource: Use list_head to link sibling resource
@ 2018-05-07 15:50 ` kbuild test robot
0 siblings, 0 replies; 42+ messages in thread
From: kbuild test robot @ 2018-05-07 15:50 UTC (permalink / raw)
To: Baoquan He
Cc: nicolas.pitre-QSEj5FYQhm4dnm+yROfE0A, brijesh.singh-5C7GfCeVMHo,
devicetree-u79uwXL29TY76Z2rM5mHXA, airlied-cv59FeDIM0c,
linux-pci-u79uwXL29TY76Z2rM5mHXA,
richard.weiyang-Re5JQEeQqe8AvxtiuMwx3w,
keith.busch-ral2JQCrhuEAvxtiuMwx3w,
jcmvbkbc-Re5JQEeQqe8AvxtiuMwx3w,
baiyaowei-0p4V/sDNsUmm0O/7XYngnFaTQe2KTcn/,
kys-0li6OtcxBFHby3iVrkZq2A, frowand.list-Re5JQEeQqe8AvxtiuMwx3w,
lorenzo.pieralisi-5wv7dgnIgG8, sthemmin-0li6OtcxBFHby3iVrkZq2A,
Baoquan He, linux-nvdimm-hn68Rpc1hR1g9hUCZPvPmw,
patrik.r.jakobsson-Re5JQEeQqe8AvxtiuMwx3w,
linux-input-u79uwXL29TY76Z2rM5mHXA,
gustavo-THi1TnShQwVAfugRpC6u6w, bp-l3A5Bk7waGM,
dyoung-H+wXaHxf7aLQT0dZR+AlfA, ebiederm-aS9lmoZGLiVWk0Htik3J/w,
thomas.lendacky-5C7GfCeVMHo, haiyangz-0li6OtcxBFHby3iVrkZq2A,
maarten.lankhorst-VuQAYsv1563Yd54FQh9/CA,
josh-iaAMLnmF4UmaiuxdJuQwMA, jglisse-H+wXaHxf7aLQT0dZR+AlfA,
robh+dt-DgEjT+Ai2ygdnm+yROfE0A, seanpaul-F7+t8E8rja9g9hUCZPvPmw,
bhelgaas-hpIqsD4AKlfQT0dZR+AlfA, tglx-hfZtesqFncYOwBW4kG4KsQ,
yinghai-DgEjT+Ai2ygdnm+yROfE0A,
jonathan.derrick-ral2JQCrhuEAvxtiuMwx3w,
chris-YvXeqwSYzG2sTnJN9+BGXg, monstr-pSz03upnqPeHXe+LvDLADg,
linux-parisc-u79uwXL29TY76Z2rM5mHXA,
gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r, dmitry.torokhov
Hi Baoquan,
I love your patch! Yet something to improve:
[auto build test ERROR on linus/master]
[also build test ERROR on v4.17-rc4 next-20180504]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
url: https://github.com/0day-ci/linux/commits/Baoquan-He/resource-Use-list_head-to-link-sibling-resource/20180507-144345
config: arm-allmodconfig (attached as .config)
compiler: arm-linux-gnueabi-gcc (Debian 7.2.0-11) 7.2.0
reproduce:
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
make.cross ARCH=arm
All errors (new ones prefixed by >>):
arch/arm/plat-samsung/pm-check.c: In function 's3c_pm_run_res':
>> arch/arm/plat-samsung/pm-check.c:49:18: error: invalid operands to binary != (have 'struct list_head' and 'void *')
if (ptr->child != NULL)
~~~~~~~~~~ ^~
>> arch/arm/plat-samsung/pm-check.c:50:19: error: incompatible type for argument 1 of 's3c_pm_run_res'
s3c_pm_run_res(ptr->child, fn, arg);
^~~
arch/arm/plat-samsung/pm-check.c:46:13: note: expected 'struct resource *' but argument is of type 'struct list_head'
static void s3c_pm_run_res(struct resource *ptr, run_fn_t fn, u32 *arg)
^~~~~~~~~~~~~~
>> arch/arm/plat-samsung/pm-check.c:60:7: error: incompatible types when assigning to type 'struct resource *' from type 'struct list_head'
ptr = ptr->sibling;
^
vim +49 arch/arm/plat-samsung/pm-check.c
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 45
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 46 static void s3c_pm_run_res(struct resource *ptr, run_fn_t fn, u32 *arg)
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 47 {
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 48 while (ptr != NULL) {
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 @49 if (ptr->child != NULL)
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 @50 s3c_pm_run_res(ptr->child, fn, arg);
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 51
05fee7cf arch/arm/plat-samsung/pm-check.c Toshi Kani 2016-01-26 52 if ((ptr->flags & IORESOURCE_SYSTEM_RAM)
05fee7cf arch/arm/plat-samsung/pm-check.c Toshi Kani 2016-01-26 53 == IORESOURCE_SYSTEM_RAM) {
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 54 S3C_PMDBG("Found system RAM at %08lx..%08lx\n",
840eeeb8 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 55 (unsigned long)ptr->start,
840eeeb8 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 56 (unsigned long)ptr->end);
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 57 arg = (fn)(ptr, arg);
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 58 }
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 59
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 @60 ptr = ptr->sibling;
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 61 }
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 62 }
549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 63
:::::: The code at line 49 was first introduced by commit
:::::: 549c7e33aeb9bfe441ecf68639d2227bb90978e7 [ARM] S3C: Split the resume memory check code from pm.c
:::::: TO: Ben Dooks <ben-linux-elnMNo+KYs3YtjvyW6yDsg@public.gmane.org>
:::::: CC: Ben Dooks <ben-linux-elnMNo+KYs3YtjvyW6yDsg@public.gmane.org>
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
^ permalink raw reply [flat|nested] 42+ messages in thread
* Re: [PATCH v4 1/3] resource: Use list_head to link sibling resource
@ 2018-05-08 12:12 ` Baoquan He
0 siblings, 0 replies; 42+ messages in thread
From: Baoquan He @ 2018-05-08 12:12 UTC (permalink / raw)
To: kbuild test robot
Cc: nicolas.pitre, brijesh.singh, devicetree, airlied, linux-pci,
richard.weiyang, keith.busch, jcmvbkbc, baiyaowei, kys,
frowand.list, lorenzo.pieralisi, sthemmin, linux-nvdimm,
patrik.r.jakobsson, linux-input, gustavo, bp, dyoung, ebiederm,
thomas.lendacky, haiyangz, maarten.lankhorst, josh, jglisse,
robh+dt, seanpaul, bhelgaas, tglx, yinghai, jonathan.derrick,
chris, monstr, linux-parisc, gregkh, dmitry.torokhov, kexec,
linux-kernel, kbuild-all, devel, akpm, fengguang.wu, davem
On 05/07/18 at 11:50pm, kbuild test robot wrote:
> Hi Baoquan,
>
> I love your patch! Yet something to improve:
>
> [auto build test ERROR on linus/master]
> [also build test ERROR on v4.17-rc4 next-20180504]
> [if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
>
> url: https://github.com/0day-ci/linux/commits/Baoquan-He/resource-Use-list_head-to-link-sibling-resource/20180507-144345
> config: arm-allmodconfig (attached as .config)
> compiler: arm-linux-gnueabi-gcc (Debian 7.2.0-11) 7.2.0
> reproduce:
> wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
> chmod +x ~/bin/make.cross
> # save the attached .config to linux build tree
> make.cross ARCH=arm
>
> All errors (new ones prefixed by >>):
Thanks, below patch can fix it:
diff --git a/arch/arm/plat-samsung/pm-check.c b/arch/arm/plat-samsung/pm-check.c
index cd2c02c68bc3..5494355b1c49 100644
--- a/arch/arm/plat-samsung/pm-check.c
+++ b/arch/arm/plat-samsung/pm-check.c
@@ -46,8 +46,8 @@ typedef u32 *(run_fn_t)(struct resource *ptr, u32 *arg);
static void s3c_pm_run_res(struct resource *ptr, run_fn_t fn, u32 *arg)
{
while (ptr != NULL) {
- if (ptr->child != NULL)
- s3c_pm_run_res(ptr->child, fn, arg);
+ if (!list_empty(&ptr->child))
+ s3c_pm_run_res(resource_first_child(&ptr->child), fn, arg);
if ((ptr->flags & IORESOURCE_SYSTEM_RAM)
== IORESOURCE_SYSTEM_RAM) {
@@ -57,7 +57,7 @@ static void s3c_pm_run_res(struct resource *ptr, run_fn_t fn, u32 *arg)
arg = (fn)(ptr, arg);
}
- ptr = ptr->sibling;
+ ptr = resource_sibling(ptr);
}
}
>
> arch/arm/plat-samsung/pm-check.c: In function 's3c_pm_run_res':
> >> arch/arm/plat-samsung/pm-check.c:49:18: error: invalid operands to binary != (have 'struct list_head' and 'void *')
> if (ptr->child != NULL)
> ~~~~~~~~~~ ^~
> >> arch/arm/plat-samsung/pm-check.c:50:19: error: incompatible type for argument 1 of 's3c_pm_run_res'
> s3c_pm_run_res(ptr->child, fn, arg);
> ^~~
> arch/arm/plat-samsung/pm-check.c:46:13: note: expected 'struct resource *' but argument is of type 'struct list_head'
> static void s3c_pm_run_res(struct resource *ptr, run_fn_t fn, u32 *arg)
> ^~~~~~~~~~~~~~
> >> arch/arm/plat-samsung/pm-check.c:60:7: error: incompatible types when assigning to type 'struct resource *' from type 'struct list_head'
> ptr = ptr->sibling;
> ^
>
> vim +49 arch/arm/plat-samsung/pm-check.c
>
> 549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 45
> 549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 46 static void s3c_pm_run_res(struct resource *ptr, run_fn_t fn, u32 *arg)
> 549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 47 {
> 549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 48 while (ptr != NULL) {
> 549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 @49 if (ptr->child != NULL)
> 549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 @50 s3c_pm_run_res(ptr->child, fn, arg);
> 549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 51
> 05fee7cf arch/arm/plat-samsung/pm-check.c Toshi Kani 2016-01-26 52 if ((ptr->flags & IORESOURCE_SYSTEM_RAM)
> 05fee7cf arch/arm/plat-samsung/pm-check.c Toshi Kani 2016-01-26 53 == IORESOURCE_SYSTEM_RAM) {
> 549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 54 S3C_PMDBG("Found system RAM at %08lx..%08lx\n",
> 840eeeb8 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 55 (unsigned long)ptr->start,
> 840eeeb8 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 56 (unsigned long)ptr->end);
> 549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 57 arg = (fn)(ptr, arg);
> 549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 58 }
> 549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 59
> 549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 @60 ptr = ptr->sibling;
> 549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 61 }
> 549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 62 }
> 549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 63
>
> :::::: The code at line 49 was first introduced by commit
> :::::: 549c7e33aeb9bfe441ecf68639d2227bb90978e7 [ARM] S3C: Split the resume memory check code from pm.c
>
> :::::: TO: Ben Dooks <ben-linux@fluff.org>
> :::::: CC: Ben Dooks <ben-linux@fluff.org>
>
> ---
> 0-DAY kernel test infrastructure Open Source Technology Center
> https://lists.01.org/pipermail/kbuild-all Intel Corporation
_______________________________________________
Linux-nvdimm mailing list
Linux-nvdimm@lists.01.org
https://lists.01.org/mailman/listinfo/linux-nvdimm
^ permalink raw reply related [flat|nested] 42+ messages in thread
* Re: [PATCH v4 1/3] resource: Use list_head to link sibling resource
@ 2018-05-08 12:12 ` Baoquan He
0 siblings, 0 replies; 42+ messages in thread
From: Baoquan He @ 2018-05-08 12:12 UTC (permalink / raw)
To: kbuild test robot
Cc: nicolas.pitre, brijesh.singh, devicetree, airlied, linux-pci,
richard.weiyang, keith.busch, jcmvbkbc, baiyaowei, kys,
frowand.list, dan.j.williams, lorenzo.pieralisi, sthemmin,
linux-nvdimm, patrik.r.jakobsson, linux-input, gustavo, bp,
dyoung, vgoyal, ebiederm, thomas.lendacky, haiyangz,
maarten.lankhorst, josh, jglisse, robh+dt, seanpaul, bhelgaas,
tglx, yinghai, jonathan.derrick, chris, monstr, linux-parisc,
gregkh, dmitry.torokhov, kexec, linux-kernel, kbuild-all, devel,
akpm, fengguang.wu, davem
On 05/07/18 at 11:50pm, kbuild test robot wrote:
> Hi Baoquan,
>
> I love your patch! Yet something to improve:
>
> [auto build test ERROR on linus/master]
> [also build test ERROR on v4.17-rc4 next-20180504]
> [if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
>
> url: https://github.com/0day-ci/linux/commits/Baoquan-He/resource-Use-list_head-to-link-sibling-resource/20180507-144345
> config: arm-allmodconfig (attached as .config)
> compiler: arm-linux-gnueabi-gcc (Debian 7.2.0-11) 7.2.0
> reproduce:
> wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
> chmod +x ~/bin/make.cross
> # save the attached .config to linux build tree
> make.cross ARCH=arm
>
> All errors (new ones prefixed by >>):
Thanks, below patch can fix it:
diff --git a/arch/arm/plat-samsung/pm-check.c b/arch/arm/plat-samsung/pm-check.c
index cd2c02c68bc3..5494355b1c49 100644
--- a/arch/arm/plat-samsung/pm-check.c
+++ b/arch/arm/plat-samsung/pm-check.c
@@ -46,8 +46,8 @@ typedef u32 *(run_fn_t)(struct resource *ptr, u32 *arg);
static void s3c_pm_run_res(struct resource *ptr, run_fn_t fn, u32 *arg)
{
while (ptr != NULL) {
- if (ptr->child != NULL)
- s3c_pm_run_res(ptr->child, fn, arg);
+ if (!list_empty(&ptr->child))
+ s3c_pm_run_res(resource_first_child(&ptr->child), fn, arg);
if ((ptr->flags & IORESOURCE_SYSTEM_RAM)
== IORESOURCE_SYSTEM_RAM) {
@@ -57,7 +57,7 @@ static void s3c_pm_run_res(struct resource *ptr, run_fn_t fn, u32 *arg)
arg = (fn)(ptr, arg);
}
- ptr = ptr->sibling;
+ ptr = resource_sibling(ptr);
}
}
>
> arch/arm/plat-samsung/pm-check.c: In function 's3c_pm_run_res':
> >> arch/arm/plat-samsung/pm-check.c:49:18: error: invalid operands to binary != (have 'struct list_head' and 'void *')
> if (ptr->child != NULL)
> ~~~~~~~~~~ ^~
> >> arch/arm/plat-samsung/pm-check.c:50:19: error: incompatible type for argument 1 of 's3c_pm_run_res'
> s3c_pm_run_res(ptr->child, fn, arg);
> ^~~
> arch/arm/plat-samsung/pm-check.c:46:13: note: expected 'struct resource *' but argument is of type 'struct list_head'
> static void s3c_pm_run_res(struct resource *ptr, run_fn_t fn, u32 *arg)
> ^~~~~~~~~~~~~~
> >> arch/arm/plat-samsung/pm-check.c:60:7: error: incompatible types when assigning to type 'struct resource *' from type 'struct list_head'
> ptr = ptr->sibling;
> ^
>
> vim +49 arch/arm/plat-samsung/pm-check.c
>
> 549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 45
> 549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 46 static void s3c_pm_run_res(struct resource *ptr, run_fn_t fn, u32 *arg)
> 549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 47 {
> 549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 48 while (ptr != NULL) {
> 549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 @49 if (ptr->child != NULL)
> 549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 @50 s3c_pm_run_res(ptr->child, fn, arg);
> 549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 51
> 05fee7cf arch/arm/plat-samsung/pm-check.c Toshi Kani 2016-01-26 52 if ((ptr->flags & IORESOURCE_SYSTEM_RAM)
> 05fee7cf arch/arm/plat-samsung/pm-check.c Toshi Kani 2016-01-26 53 == IORESOURCE_SYSTEM_RAM) {
> 549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 54 S3C_PMDBG("Found system RAM at %08lx..%08lx\n",
> 840eeeb8 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 55 (unsigned long)ptr->start,
> 840eeeb8 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 56 (unsigned long)ptr->end);
> 549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 57 arg = (fn)(ptr, arg);
> 549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 58 }
> 549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 59
> 549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 @60 ptr = ptr->sibling;
> 549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 61 }
> 549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 62 }
> 549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 63
>
> :::::: The code at line 49 was first introduced by commit
> :::::: 549c7e33aeb9bfe441ecf68639d2227bb90978e7 [ARM] S3C: Split the resume memory check code from pm.c
>
> :::::: TO: Ben Dooks <ben-linux@fluff.org>
> :::::: CC: Ben Dooks <ben-linux@fluff.org>
>
> ---
> 0-DAY kernel test infrastructure Open Source Technology Center
> https://lists.01.org/pipermail/kbuild-all Intel Corporation
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply related [flat|nested] 42+ messages in thread
* Re: [PATCH v4 1/3] resource: Use list_head to link sibling resource
@ 2018-05-08 12:12 ` Baoquan He
0 siblings, 0 replies; 42+ messages in thread
From: Baoquan He @ 2018-05-08 12:12 UTC (permalink / raw)
To: kbuild test robot
Cc: kbuild-all, linux-kernel, akpm, robh+dt, dan.j.williams,
nicolas.pitre, josh, fengguang.wu, bp, patrik.r.jakobsson,
airlied, kys, haiyangz, sthemmin, dmitry.torokhov, frowand.list,
keith.busch, jonathan.derrick, lorenzo.pieralisi, bhelgaas, tglx,
brijesh.singh, jglisse, thomas.lendacky, gregkh, baiyaowei,
richard.weiyang, devel, linux-input, linux-nvdimm, devicetree,
linux-pci, ebiederm, vgoyal, dyoung, yinghai, kexec, monstr,
davem, chris, jcmvbkbc, gustavo, maarten.lankhorst, seanpaul,
linux-parisc
On 05/07/18 at 11:50pm, kbuild test robot wrote:
> Hi Baoquan,
>
> I love your patch! Yet something to improve:
>
> [auto build test ERROR on linus/master]
> [also build test ERROR on v4.17-rc4 next-20180504]
> [if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
>
> url: https://github.com/0day-ci/linux/commits/Baoquan-He/resource-Use-list_head-to-link-sibling-resource/20180507-144345
> config: arm-allmodconfig (attached as .config)
> compiler: arm-linux-gnueabi-gcc (Debian 7.2.0-11) 7.2.0
> reproduce:
> wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
> chmod +x ~/bin/make.cross
> # save the attached .config to linux build tree
> make.cross ARCH=arm
>
> All errors (new ones prefixed by >>):
Thanks, below patch can fix it:
diff --git a/arch/arm/plat-samsung/pm-check.c b/arch/arm/plat-samsung/pm-check.c
index cd2c02c68bc3..5494355b1c49 100644
--- a/arch/arm/plat-samsung/pm-check.c
+++ b/arch/arm/plat-samsung/pm-check.c
@@ -46,8 +46,8 @@ typedef u32 *(run_fn_t)(struct resource *ptr, u32 *arg);
static void s3c_pm_run_res(struct resource *ptr, run_fn_t fn, u32 *arg)
{
while (ptr != NULL) {
- if (ptr->child != NULL)
- s3c_pm_run_res(ptr->child, fn, arg);
+ if (!list_empty(&ptr->child))
+ s3c_pm_run_res(resource_first_child(&ptr->child), fn, arg);
if ((ptr->flags & IORESOURCE_SYSTEM_RAM)
== IORESOURCE_SYSTEM_RAM) {
@@ -57,7 +57,7 @@ static void s3c_pm_run_res(struct resource *ptr, run_fn_t fn, u32 *arg)
arg = (fn)(ptr, arg);
}
- ptr = ptr->sibling;
+ ptr = resource_sibling(ptr);
}
}
>
> arch/arm/plat-samsung/pm-check.c: In function 's3c_pm_run_res':
> >> arch/arm/plat-samsung/pm-check.c:49:18: error: invalid operands to binary != (have 'struct list_head' and 'void *')
> if (ptr->child != NULL)
> ~~~~~~~~~~ ^~
> >> arch/arm/plat-samsung/pm-check.c:50:19: error: incompatible type for argument 1 of 's3c_pm_run_res'
> s3c_pm_run_res(ptr->child, fn, arg);
> ^~~
> arch/arm/plat-samsung/pm-check.c:46:13: note: expected 'struct resource *' but argument is of type 'struct list_head'
> static void s3c_pm_run_res(struct resource *ptr, run_fn_t fn, u32 *arg)
> ^~~~~~~~~~~~~~
> >> arch/arm/plat-samsung/pm-check.c:60:7: error: incompatible types when assigning to type 'struct resource *' from type 'struct list_head'
> ptr = ptr->sibling;
> ^
>
> vim +49 arch/arm/plat-samsung/pm-check.c
>
> 549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 45
> 549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 46 static void s3c_pm_run_res(struct resource *ptr, run_fn_t fn, u32 *arg)
> 549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 47 {
> 549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 48 while (ptr != NULL) {
> 549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 @49 if (ptr->child != NULL)
> 549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 @50 s3c_pm_run_res(ptr->child, fn, arg);
> 549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 51
> 05fee7cf arch/arm/plat-samsung/pm-check.c Toshi Kani 2016-01-26 52 if ((ptr->flags & IORESOURCE_SYSTEM_RAM)
> 05fee7cf arch/arm/plat-samsung/pm-check.c Toshi Kani 2016-01-26 53 == IORESOURCE_SYSTEM_RAM) {
> 549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 54 S3C_PMDBG("Found system RAM at %08lx..%08lx\n",
> 840eeeb8 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 55 (unsigned long)ptr->start,
> 840eeeb8 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 56 (unsigned long)ptr->end);
> 549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 57 arg = (fn)(ptr, arg);
> 549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 58 }
> 549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 59
> 549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 @60 ptr = ptr->sibling;
> 549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 61 }
> 549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 62 }
> 549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 63
>
> :::::: The code at line 49 was first introduced by commit
> :::::: 549c7e33aeb9bfe441ecf68639d2227bb90978e7 [ARM] S3C: Split the resume memory check code from pm.c
>
> :::::: TO: Ben Dooks <ben-linux@fluff.org>
> :::::: CC: Ben Dooks <ben-linux@fluff.org>
>
> ---
> 0-DAY kernel test infrastructure Open Source Technology Center
> https://lists.01.org/pipermail/kbuild-all Intel Corporation
^ permalink raw reply related [flat|nested] 42+ messages in thread
* Re: [PATCH v4 1/3] resource: Use list_head to link sibling resource
@ 2018-05-08 12:12 ` Baoquan He
0 siblings, 0 replies; 42+ messages in thread
From: Baoquan He @ 2018-05-08 12:12 UTC (permalink / raw)
To: kbuild test robot
Cc: nicolas.pitre-QSEj5FYQhm4dnm+yROfE0A, brijesh.singh-5C7GfCeVMHo,
devicetree-u79uwXL29TY76Z2rM5mHXA, airlied-cv59FeDIM0c,
linux-pci-u79uwXL29TY76Z2rM5mHXA,
richard.weiyang-Re5JQEeQqe8AvxtiuMwx3w,
keith.busch-ral2JQCrhuEAvxtiuMwx3w,
jcmvbkbc-Re5JQEeQqe8AvxtiuMwx3w,
baiyaowei-0p4V/sDNsUmm0O/7XYngnFaTQe2KTcn/,
kys-0li6OtcxBFHby3iVrkZq2A, frowand.list-Re5JQEeQqe8AvxtiuMwx3w,
lorenzo.pieralisi-5wv7dgnIgG8, sthemmin-0li6OtcxBFHby3iVrkZq2A,
linux-nvdimm-hn68Rpc1hR1g9hUCZPvPmw,
patrik.r.jakobsson-Re5JQEeQqe8AvxtiuMwx3w,
linux-input-u79uwXL29TY76Z2rM5mHXA,
gustavo-THi1TnShQwVAfugRpC6u6w, bp-l3A5Bk7waGM,
dyoung-H+wXaHxf7aLQT0dZR+AlfA, ebiederm-aS9lmoZGLiVWk0Htik3J/w,
thomas.lendacky-5C7GfCeVMHo, haiyangz-0li6OtcxBFHby3iVrkZq2A,
maarten.lankhorst-VuQAYsv1563Yd54FQh9/CA,
josh-iaAMLnmF4UmaiuxdJuQwMA, jglisse-H+wXaHxf7aLQT0dZR+AlfA,
robh+dt-DgEjT+Ai2ygdnm+yROfE0A, seanpaul-F7+t8E8rja9g9hUCZPvPmw,
bhelgaas-hpIqsD4AKlfQT0dZR+AlfA, tglx-hfZtesqFncYOwBW4kG4KsQ,
yinghai-DgEjT+Ai2ygdnm+yROfE0A,
jonathan.derrick-ral2JQCrhuEAvxtiuMwx3w,
chris-YvXeqwSYzG2sTnJN9+BGXg, monstr-pSz03upnqPeHXe+LvDLADg,
linux-parisc-u79uwXL29TY76Z2rM5mHXA,
gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r,
dmitry.torokhov-Re5JQEeQqe8AvxtiuMwx3w,
kexec-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r
On 05/07/18 at 11:50pm, kbuild test robot wrote:
> Hi Baoquan,
>
> I love your patch! Yet something to improve:
>
> [auto build test ERROR on linus/master]
> [also build test ERROR on v4.17-rc4 next-20180504]
> [if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
>
> url: https://github.com/0day-ci/linux/commits/Baoquan-He/resource-Use-list_head-to-link-sibling-resource/20180507-144345
> config: arm-allmodconfig (attached as .config)
> compiler: arm-linux-gnueabi-gcc (Debian 7.2.0-11) 7.2.0
> reproduce:
> wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
> chmod +x ~/bin/make.cross
> # save the attached .config to linux build tree
> make.cross ARCH=arm
>
> All errors (new ones prefixed by >>):
Thanks, below patch can fix it:
diff --git a/arch/arm/plat-samsung/pm-check.c b/arch/arm/plat-samsung/pm-check.c
index cd2c02c68bc3..5494355b1c49 100644
--- a/arch/arm/plat-samsung/pm-check.c
+++ b/arch/arm/plat-samsung/pm-check.c
@@ -46,8 +46,8 @@ typedef u32 *(run_fn_t)(struct resource *ptr, u32 *arg);
static void s3c_pm_run_res(struct resource *ptr, run_fn_t fn, u32 *arg)
{
while (ptr != NULL) {
- if (ptr->child != NULL)
- s3c_pm_run_res(ptr->child, fn, arg);
+ if (!list_empty(&ptr->child))
+ s3c_pm_run_res(resource_first_child(&ptr->child), fn, arg);
if ((ptr->flags & IORESOURCE_SYSTEM_RAM)
== IORESOURCE_SYSTEM_RAM) {
@@ -57,7 +57,7 @@ static void s3c_pm_run_res(struct resource *ptr, run_fn_t fn, u32 *arg)
arg = (fn)(ptr, arg);
}
- ptr = ptr->sibling;
+ ptr = resource_sibling(ptr);
}
}
>
> arch/arm/plat-samsung/pm-check.c: In function 's3c_pm_run_res':
> >> arch/arm/plat-samsung/pm-check.c:49:18: error: invalid operands to binary != (have 'struct list_head' and 'void *')
> if (ptr->child != NULL)
> ~~~~~~~~~~ ^~
> >> arch/arm/plat-samsung/pm-check.c:50:19: error: incompatible type for argument 1 of 's3c_pm_run_res'
> s3c_pm_run_res(ptr->child, fn, arg);
> ^~~
> arch/arm/plat-samsung/pm-check.c:46:13: note: expected 'struct resource *' but argument is of type 'struct list_head'
> static void s3c_pm_run_res(struct resource *ptr, run_fn_t fn, u32 *arg)
> ^~~~~~~~~~~~~~
> >> arch/arm/plat-samsung/pm-check.c:60:7: error: incompatible types when assigning to type 'struct resource *' from type 'struct list_head'
> ptr = ptr->sibling;
> ^
>
> vim +49 arch/arm/plat-samsung/pm-check.c
>
> 549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 45
> 549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 46 static void s3c_pm_run_res(struct resource *ptr, run_fn_t fn, u32 *arg)
> 549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 47 {
> 549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 48 while (ptr != NULL) {
> 549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 @49 if (ptr->child != NULL)
> 549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 @50 s3c_pm_run_res(ptr->child, fn, arg);
> 549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 51
> 05fee7cf arch/arm/plat-samsung/pm-check.c Toshi Kani 2016-01-26 52 if ((ptr->flags & IORESOURCE_SYSTEM_RAM)
> 05fee7cf arch/arm/plat-samsung/pm-check.c Toshi Kani 2016-01-26 53 == IORESOURCE_SYSTEM_RAM) {
> 549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 54 S3C_PMDBG("Found system RAM at %08lx..%08lx\n",
> 840eeeb8 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 55 (unsigned long)ptr->start,
> 840eeeb8 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 56 (unsigned long)ptr->end);
> 549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 57 arg = (fn)(ptr, arg);
> 549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 58 }
> 549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 59
> 549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 @60 ptr = ptr->sibling;
> 549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 61 }
> 549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 62 }
> 549c7e33 arch/arm/plat-s3c/pm-check.c Ben Dooks 2008-12-12 63
>
> :::::: The code at line 49 was first introduced by commit
> :::::: 549c7e33aeb9bfe441ecf68639d2227bb90978e7 [ARM] S3C: Split the resume memory check code from pm.c
>
> :::::: TO: Ben Dooks <ben-linux-elnMNo+KYs3YtjvyW6yDsg@public.gmane.org>
> :::::: CC: Ben Dooks <ben-linux-elnMNo+KYs3YtjvyW6yDsg@public.gmane.org>
>
> ---
> 0-DAY kernel test infrastructure Open Source Technology Center
> https://lists.01.org/pipermail/kbuild-all Intel Corporation
^ permalink raw reply related [flat|nested] 42+ messages in thread