|
@@ -533,43 +533,21 @@ 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;
|
|
|
- }
|
|
|
-
|
|
|
- if (!res) {
|
|
|
- /* failed, split and try again */
|
|
|
-
|
|
|
- /* conflict covered whole area */
|
|
|
- if (conflict->start <= start && conflict->end >= end)
|
|
|
- return;
|
|
|
+ conflict = __request_resource(parent, res);
|
|
|
+ if (!conflict)
|
|
|
+ return;
|
|
|
|
|
|
- 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;
|
|
|
+ /* failed, split and try again */
|
|
|
+ kfree(res);
|
|
|
|
|
|
- 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);
|
|
|
- }
|
|
|
+ /* conflict covered whole area */
|
|
|
+ if (conflict->start <= start && conflict->end >= end)
|
|
|
+ return;
|
|
|
|
|
|
+ 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,
|