Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ff54250a authored by Linus Torvalds's avatar Linus Torvalds
Browse files

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
Loading
Loading
Loading
Loading
+12 −34
Original line number Diff line number Diff line
@@ -533,24 +533,12 @@ static void __init __reserve_region_with_split(struct resource *root,
	res->end = end;
	res->flags = IORESOURCE_BUSY;

	for (;;) {
	conflict = __request_resource(parent, res);
	if (!conflict)
			break;
		if (conflict != parent) {
			parent = conflict;
			if (!(conflict->flags & IORESOURCE_BUSY))
				continue;
		}

		/* Uhhuh, that didn't work out.. */
		kfree(res);
		res = NULL;
		break;
	}
		return;

	if (!res) {
	/* failed, split and try again */
	kfree(res);

	/* conflict covered whole area */
	if (conflict->start <= start && conflict->end >= end)
@@ -558,20 +546,10 @@ static void __init __reserve_region_with_split(struct resource *root,

	if (conflict->start > start)
		__reserve_region_with_split(root, start, conflict->start-1, name);
		if (!(conflict->flags & IORESOURCE_BUSY)) {
			resource_size_t common_start, common_end;

			common_start = max(conflict->start, start);
			common_end = min(conflict->end, end);
			if (common_start < common_end)
				__reserve_region_with_split(root, common_start, common_end, name);
		}
	if (conflict->end < end)
		__reserve_region_with_split(root, conflict->end+1, end, name);
}

}

void __init reserve_region_with_split(struct resource *root,
		resource_size_t start, resource_size_t end,
		const char *name)