Commit 97523a4e authored by David Hildenbrand's avatar David Hildenbrand Committed by Linus Torvalds

kernel/resource: remove first_lvl / siblings_only logic

All functions that search for IORESOURCE_SYSTEM_RAM or IORESOURCE_MEM
resources now properly consider the whole resource tree, not just the
first level.  Let's drop the unused first_lvl / siblings_only logic.

Remove documentation that indicates that some functions behave differently,
all consider the full resource tree now.

Link: https://lkml.kernel.org/r/20210325115326.7826-4-david@redhat.comSigned-off-by: default avatarDavid Hildenbrand <david@redhat.com>
Reviewed-by: default avatarDan Williams <dan.j.williams@intel.com>
Reviewed-by: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Dan Williams <dan.j.williams@intel.com>
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Cc: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
Cc: Dave Young <dyoung@redhat.com>
Cc: Baoquan He <bhe@redhat.com>
Cc: Vivek Goyal <vgoyal@redhat.com>
Cc: Dave Hansen <dave.hansen@linux.intel.com>
Cc: Keith Busch <keith.busch@intel.com>
Cc: Michal Hocko <mhocko@suse.com>
Cc: Qian Cai <cai@lca.pw>
Cc: Oscar Salvador <osalvador@suse.de>
Cc: Eric Biederman <ebiederm@xmission.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Borislav Petkov <bp@alien8.de>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Tom Lendacky <thomas.lendacky@amd.com>
Cc: Brijesh Singh <brijesh.singh@amd.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 3c9c7975
...@@ -64,12 +64,8 @@ static DEFINE_RWLOCK(resource_lock); ...@@ -64,12 +64,8 @@ static DEFINE_RWLOCK(resource_lock);
static struct resource *bootmem_resource_free; static struct resource *bootmem_resource_free;
static DEFINE_SPINLOCK(bootmem_resource_lock); static DEFINE_SPINLOCK(bootmem_resource_lock);
static struct resource *next_resource(struct resource *p, bool sibling_only) static struct resource *next_resource(struct resource *p)
{ {
/* Caller wants to traverse through siblings only */
if (sibling_only)
return p->sibling;
if (p->child) if (p->child)
return p->child; return p->child;
while (!p->sibling && p->parent) while (!p->sibling && p->parent)
...@@ -81,7 +77,7 @@ static void *r_next(struct seq_file *m, void *v, loff_t *pos) ...@@ -81,7 +77,7 @@ static void *r_next(struct seq_file *m, void *v, loff_t *pos)
{ {
struct resource *p = v; struct resource *p = v;
(*pos)++; (*pos)++;
return (void *)next_resource(p, false); return (void *)next_resource(p);
} }
#ifdef CONFIG_PROC_FS #ifdef CONFIG_PROC_FS
...@@ -330,14 +326,10 @@ EXPORT_SYMBOL(release_resource); ...@@ -330,14 +326,10 @@ EXPORT_SYMBOL(release_resource);
* of the resource that's within [@start..@end]; if none is found, returns * of the resource that's within [@start..@end]; if none is found, returns
* -ENODEV. Returns -EINVAL for invalid parameters. * -ENODEV. Returns -EINVAL for invalid parameters.
* *
* This function walks the whole tree and not just first level children
* unless @first_lvl is true.
*
* @start: start address of the resource searched for * @start: start address of the resource searched for
* @end: end address of same resource * @end: end address of same resource
* @flags: flags which the resource must have * @flags: flags which the resource must have
* @desc: descriptor the resource must have * @desc: descriptor the resource must have
* @first_lvl: walk only the first level children, if set
* @res: return ptr, if resource found * @res: return ptr, if resource found
* *
* The caller must specify @start, @end, @flags, and @desc * The caller must specify @start, @end, @flags, and @desc
...@@ -345,9 +337,8 @@ EXPORT_SYMBOL(release_resource); ...@@ -345,9 +337,8 @@ EXPORT_SYMBOL(release_resource);
*/ */
static int find_next_iomem_res(resource_size_t start, resource_size_t end, static int find_next_iomem_res(resource_size_t start, resource_size_t end,
unsigned long flags, unsigned long desc, unsigned long flags, unsigned long desc,
bool first_lvl, struct resource *res) struct resource *res)
{ {
bool siblings_only = true;
struct resource *p; struct resource *p;
if (!res) if (!res)
...@@ -358,7 +349,7 @@ static int find_next_iomem_res(resource_size_t start, resource_size_t end, ...@@ -358,7 +349,7 @@ static int find_next_iomem_res(resource_size_t start, resource_size_t end,
read_lock(&resource_lock); read_lock(&resource_lock);
for (p = iomem_resource.child; p; p = next_resource(p, siblings_only)) { for (p = iomem_resource.child; p; p = next_resource(p)) {
/* If we passed the resource we are looking for, stop */ /* If we passed the resource we are looking for, stop */
if (p->start > end) { if (p->start > end) {
p = NULL; p = NULL;
...@@ -369,13 +360,6 @@ static int find_next_iomem_res(resource_size_t start, resource_size_t end, ...@@ -369,13 +360,6 @@ static int find_next_iomem_res(resource_size_t start, resource_size_t end,
if (p->end < start) if (p->end < start)
continue; continue;
/*
* Now that we found a range that matches what we look for,
* check the flags and the descriptor. If we were not asked to
* use only the first level, start looking at children as well.
*/
siblings_only = first_lvl;
if ((p->flags & flags) != flags) if ((p->flags & flags) != flags)
continue; continue;
if ((desc != IORES_DESC_NONE) && (desc != p->desc)) if ((desc != IORES_DESC_NONE) && (desc != p->desc))
...@@ -402,14 +386,14 @@ static int find_next_iomem_res(resource_size_t start, resource_size_t end, ...@@ -402,14 +386,14 @@ static int find_next_iomem_res(resource_size_t start, resource_size_t end,
static int __walk_iomem_res_desc(resource_size_t start, resource_size_t end, static int __walk_iomem_res_desc(resource_size_t start, resource_size_t end,
unsigned long flags, unsigned long desc, unsigned long flags, unsigned long desc,
bool first_lvl, void *arg, void *arg,
int (*func)(struct resource *, void *)) int (*func)(struct resource *, void *))
{ {
struct resource res; struct resource res;
int ret = -EINVAL; int ret = -EINVAL;
while (start < end && while (start < end &&
!find_next_iomem_res(start, end, flags, desc, first_lvl, &res)) { !find_next_iomem_res(start, end, flags, desc, &res)) {
ret = (*func)(&res, arg); ret = (*func)(&res, arg);
if (ret) if (ret)
break; break;
...@@ -431,7 +415,6 @@ static int __walk_iomem_res_desc(resource_size_t start, resource_size_t end, ...@@ -431,7 +415,6 @@ static int __walk_iomem_res_desc(resource_size_t start, resource_size_t end,
* @arg: function argument for the callback @func * @arg: function argument for the callback @func
* @func: callback function that is called for each qualifying resource area * @func: callback function that is called for each qualifying resource area
* *
* This walks through whole tree and not just first level children.
* All the memory ranges which overlap start,end and also match flags and * All the memory ranges which overlap start,end and also match flags and
* desc are valid candidates. * desc are valid candidates.
* *
...@@ -441,7 +424,7 @@ static int __walk_iomem_res_desc(resource_size_t start, resource_size_t end, ...@@ -441,7 +424,7 @@ static int __walk_iomem_res_desc(resource_size_t start, resource_size_t end,
int walk_iomem_res_desc(unsigned long desc, unsigned long flags, u64 start, int walk_iomem_res_desc(unsigned long desc, unsigned long flags, u64 start,
u64 end, void *arg, int (*func)(struct resource *, void *)) u64 end, void *arg, int (*func)(struct resource *, void *))
{ {
return __walk_iomem_res_desc(start, end, flags, desc, false, arg, func); return __walk_iomem_res_desc(start, end, flags, desc, arg, func);
} }
EXPORT_SYMBOL_GPL(walk_iomem_res_desc); EXPORT_SYMBOL_GPL(walk_iomem_res_desc);
...@@ -457,8 +440,8 @@ int walk_system_ram_res(u64 start, u64 end, void *arg, ...@@ -457,8 +440,8 @@ int walk_system_ram_res(u64 start, u64 end, void *arg,
{ {
unsigned long flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY; unsigned long flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY;
return __walk_iomem_res_desc(start, end, flags, IORES_DESC_NONE, false, return __walk_iomem_res_desc(start, end, flags, IORES_DESC_NONE, arg,
arg, func); func);
} }
/* /*
...@@ -470,17 +453,14 @@ int walk_mem_res(u64 start, u64 end, void *arg, ...@@ -470,17 +453,14 @@ int walk_mem_res(u64 start, u64 end, void *arg,
{ {
unsigned long flags = IORESOURCE_MEM | IORESOURCE_BUSY; unsigned long flags = IORESOURCE_MEM | IORESOURCE_BUSY;
return __walk_iomem_res_desc(start, end, flags, IORES_DESC_NONE, false, return __walk_iomem_res_desc(start, end, flags, IORES_DESC_NONE, arg,
arg, func); func);
} }
/* /*
* This function calls the @func callback against all memory ranges of type * This function calls the @func callback against all memory ranges of type
* System RAM which are marked as IORESOURCE_SYSTEM_RAM and IORESOUCE_BUSY. * System RAM which are marked as IORESOURCE_SYSTEM_RAM and IORESOUCE_BUSY.
* It is to be used only for System RAM. * It is to be used only for System RAM.
*
* This will find System RAM ranges that are children of top-level resources
* in addition to top-level System RAM resources.
*/ */
int walk_system_ram_range(unsigned long start_pfn, unsigned long nr_pages, int walk_system_ram_range(unsigned long start_pfn, unsigned long nr_pages,
void *arg, int (*func)(unsigned long, unsigned long, void *)) void *arg, int (*func)(unsigned long, unsigned long, void *))
...@@ -495,8 +475,7 @@ int walk_system_ram_range(unsigned long start_pfn, unsigned long nr_pages, ...@@ -495,8 +475,7 @@ int walk_system_ram_range(unsigned long start_pfn, unsigned long nr_pages,
end = ((u64)(start_pfn + nr_pages) << PAGE_SHIFT) - 1; end = ((u64)(start_pfn + nr_pages) << PAGE_SHIFT) - 1;
flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY; flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY;
while (start < end && while (start < end &&
!find_next_iomem_res(start, end, flags, IORES_DESC_NONE, !find_next_iomem_res(start, end, flags, IORES_DESC_NONE, &res)) {
false, &res)) {
pfn = PFN_UP(res.start); pfn = PFN_UP(res.start);
end_pfn = PFN_DOWN(res.end + 1); end_pfn = PFN_DOWN(res.end + 1);
if (end_pfn > pfn) if (end_pfn > pfn)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment