Skip to content

Commit

Permalink
resource: Handle resource flags properly
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Borislav Petkov <[email protected]>
Cc: Andrew Morton <[email protected]>
Cc: Andy Lutomirski <[email protected]>
Cc: Borislav Petkov <[email protected]>
Cc: Brian Gerst <[email protected]>
Cc: Dan Williams <[email protected]>
Cc: Denys Vlasenko <[email protected]>
Cc: H. Peter Anvin <[email protected]>
Cc: Jakub Sitnicki <[email protected]>
Cc: Jiang Liu <[email protected]>
Cc: Linus Torvalds <[email protected]>
Cc: Luis R. Rodriguez <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Cc: Rafael J. Wysocki <[email protected]>
Cc: Thomas Gleixner <[email protected]>
Cc: Toshi Kani <[email protected]>
Cc: Vinod Koul <[email protected]>
Cc: [email protected]
Cc: linux-mm <[email protected]>
Link: http://lkml.kernel.org/r/[email protected]
Signed-off-by: Ingo Molnar <[email protected]>
  • Loading branch information
toshikani authored and Ingo Molnar committed Jan 30, 2016
1 parent 9babd5c commit a3650d5
Showing 1 changed file with 4 additions and 3 deletions.
7 changes: 4 additions & 3 deletions kernel/resource.c
Original file line number Diff line number Diff line change
Expand Up @@ -358,7 +358,7 @@ static int find_next_iomem_res(struct resource *res, char *name,
read_lock(&resource_lock);

for (p = iomem_resource.child; p; p = next_resource(p, sibling_only)) {
if (p->flags != res->flags)
if ((p->flags & res->flags) != res->flags)
continue;
if (name && strcmp(p->name, name))
continue;
Expand Down Expand Up @@ -519,7 +519,8 @@ int region_intersects(resource_size_t start, size_t size, const char *name)

read_lock(&resource_lock);
for (p = iomem_resource.child; p ; p = p->sibling) {
bool is_type = strcmp(p->name, name) == 0 && p->flags == flags;
bool is_type = strcmp(p->name, name) == 0 &&
((p->flags & flags) == flags);

if (start >= p->start && start <= p->end)
is_type ? type++ : other++;
Expand Down Expand Up @@ -1071,7 +1072,7 @@ struct resource * __request_region(struct resource *parent,
res->name = name;
res->start = start;
res->end = start + n - 1;
res->flags = resource_type(parent);
res->flags = resource_type(parent) | resource_ext_type(parent);
res->flags |= IORESOURCE_BUSY | flags;

write_lock(&resource_lock);
Expand Down

0 comments on commit a3650d5

Please sign in to comment.