Commit ff54250a authored by Linus Torvalds's avatar Linus Torvalds

Remove 'recurse into child resources' logic from 'reserve_region_with_split()'

This function is not actually used right now, since the original use
case for it was done with insert_resource_expand_to_fit() instead.

However, we now have another usage case that wants to basically do a
"reserve IO resource, splitting around existing resources", however that
one doesn't actually want the "recurse into the conflicting resource"
logic at all.

And since recursing into the conflicting resource was the most complex
part, and isn't wanted, just remove it.  Maybe we'll some day want both
versions, but we can just resurrect the logic then.
Tested-by: default avatarYinghai Lu <yinghai@kernel.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 8d4ab5da
...@@ -533,43 +533,21 @@ static void __init __reserve_region_with_split(struct resource *root, ...@@ -533,43 +533,21 @@ static void __init __reserve_region_with_split(struct resource *root,
res->end = end; res->end = end;
res->flags = IORESOURCE_BUSY; res->flags = IORESOURCE_BUSY;
for (;;) { conflict = __request_resource(parent, res);
conflict = __request_resource(parent, res); if (!conflict)
if (!conflict) return;
break;
if (conflict != parent) {
parent = conflict;
if (!(conflict->flags & IORESOURCE_BUSY))
continue;
}
/* Uhhuh, that didn't work out.. */
kfree(res);
res = NULL;
break;
}
if (!res) {
/* failed, split and try again */
/* conflict covered whole area */
if (conflict->start <= start && conflict->end >= end)
return;
if (conflict->start > start) /* failed, split and try again */
__reserve_region_with_split(root, start, conflict->start-1, name); kfree(res);
if (!(conflict->flags & IORESOURCE_BUSY)) {
resource_size_t common_start, common_end;
common_start = max(conflict->start, start); /* conflict covered whole area */
common_end = min(conflict->end, end); if (conflict->start <= start && conflict->end >= end)
if (common_start < common_end) return;
__reserve_region_with_split(root, common_start, common_end, name);
}
if (conflict->end < end)
__reserve_region_with_split(root, conflict->end+1, end, name);
}
if (conflict->start > start)
__reserve_region_with_split(root, start, conflict->start-1, name);
if (conflict->end < end)
__reserve_region_with_split(root, conflict->end+1, end, name);
} }
void __init reserve_region_with_split(struct resource *root, void __init reserve_region_with_split(struct resource *root,
......
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