diff options
author | Toshi Kani <toshi.kani@hpe.com> | 2016-01-26 15:57:18 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2016-01-30 03:49:56 -0500 |
commit | a3650d53ba16ec412185abb98f231e9ba6bcdc65 (patch) | |
tree | d2faa1fa89c0b9a7d24b443aa1e45904add9901c /kernel/resource.c | |
parent | 9babd5c8caa6e62c116efc3a64a09f65af4112b0 (diff) |
resource: Handle resource flags properly
I/O resource flags consist of I/O resource types and modifier
bits. Therefore, checking an I/O resource type in 'flags' must
be performed with a bitwise operation.
Fix find_next_iomem_res() and region_intersects() that simply
compare 'flags' against a given value.
Also change __request_region() to set 'res->flags' from
resource_type() and resource_ext_type() of the parent, so that
children nodes will inherit the extended I/O resource type.
Signed-off-by: Toshi Kani <toshi.kani@hpe.com>
Signed-off-by: Borislav Petkov <bp@suse.de>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Andy Lutomirski <luto@amacapital.net>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Brian Gerst <brgerst@gmail.com>
Cc: Dan Williams <dan.j.williams@intel.com>
Cc: Denys Vlasenko <dvlasenk@redhat.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Jakub Sitnicki <jsitnicki@gmail.com>
Cc: Jiang Liu <jiang.liu@linux.intel.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Luis R. Rodriguez <mcgrof@suse.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Toshi Kani <toshi.kani@hp.com>
Cc: Vinod Koul <vinod.koul@intel.com>
Cc: linux-arch@vger.kernel.org
Cc: linux-mm <linux-mm@kvack.org>
Link: http://lkml.kernel.org/r/1453841853-11383-3-git-send-email-bp@alien8.de
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'kernel/resource.c')
-rw-r--r-- | kernel/resource.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/kernel/resource.c b/kernel/resource.c index 09c0597840b0..96afc8027487 100644 --- a/kernel/resource.c +++ b/kernel/resource.c | |||
@@ -358,7 +358,7 @@ static int find_next_iomem_res(struct resource *res, char *name, | |||
358 | read_lock(&resource_lock); | 358 | read_lock(&resource_lock); |
359 | 359 | ||
360 | for (p = iomem_resource.child; p; p = next_resource(p, sibling_only)) { | 360 | for (p = iomem_resource.child; p; p = next_resource(p, sibling_only)) { |
361 | if (p->flags != res->flags) | 361 | if ((p->flags & res->flags) != res->flags) |
362 | continue; | 362 | continue; |
363 | if (name && strcmp(p->name, name)) | 363 | if (name && strcmp(p->name, name)) |
364 | continue; | 364 | continue; |
@@ -519,7 +519,8 @@ int region_intersects(resource_size_t start, size_t size, const char *name) | |||
519 | 519 | ||
520 | read_lock(&resource_lock); | 520 | read_lock(&resource_lock); |
521 | for (p = iomem_resource.child; p ; p = p->sibling) { | 521 | for (p = iomem_resource.child; p ; p = p->sibling) { |
522 | bool is_type = strcmp(p->name, name) == 0 && p->flags == flags; | 522 | bool is_type = strcmp(p->name, name) == 0 && |
523 | ((p->flags & flags) == flags); | ||
523 | 524 | ||
524 | if (start >= p->start && start <= p->end) | 525 | if (start >= p->start && start <= p->end) |
525 | is_type ? type++ : other++; | 526 | is_type ? type++ : other++; |
@@ -1071,7 +1072,7 @@ struct resource * __request_region(struct resource *parent, | |||
1071 | res->name = name; | 1072 | res->name = name; |
1072 | res->start = start; | 1073 | res->start = start; |
1073 | res->end = start + n - 1; | 1074 | res->end = start + n - 1; |
1074 | res->flags = resource_type(parent); | 1075 | res->flags = resource_type(parent) | resource_ext_type(parent); |
1075 | res->flags |= IORESOURCE_BUSY | flags; | 1076 | res->flags |= IORESOURCE_BUSY | flags; |
1076 | 1077 | ||
1077 | write_lock(&resource_lock); | 1078 | write_lock(&resource_lock); |