diff options
-rw-r--r-- | kernel/resource.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/kernel/resource.c b/kernel/resource.c index 26e9f2546923..89d50412508c 100644 --- a/kernel/resource.c +++ b/kernel/resource.c | |||
@@ -374,6 +374,11 @@ static void resource_clip(struct resource *res, resource_size_t min, | |||
374 | res->end = max; | 374 | res->end = max; |
375 | } | 375 | } |
376 | 376 | ||
377 | static bool resource_contains(struct resource *res1, struct resource *res2) | ||
378 | { | ||
379 | return res1->start <= res2->start && res1->end >= res2->end; | ||
380 | } | ||
381 | |||
377 | /* | 382 | /* |
378 | * Find empty slot in the resource tree given range and alignment. | 383 | * Find empty slot in the resource tree given range and alignment. |
379 | */ | 384 | */ |
@@ -387,7 +392,7 @@ static int find_resource(struct resource *root, struct resource *new, | |||
387 | void *alignf_data) | 392 | void *alignf_data) |
388 | { | 393 | { |
389 | struct resource *this = root->child; | 394 | struct resource *this = root->child; |
390 | struct resource tmp = *new; | 395 | struct resource tmp = *new, alloc; |
391 | 396 | ||
392 | tmp.start = root->start; | 397 | tmp.start = root->start; |
393 | /* | 398 | /* |
@@ -407,10 +412,11 @@ static int find_resource(struct resource *root, struct resource *new, | |||
407 | resource_clip(&tmp, min, max); | 412 | resource_clip(&tmp, min, max); |
408 | tmp.start = ALIGN(tmp.start, align); | 413 | tmp.start = ALIGN(tmp.start, align); |
409 | 414 | ||
410 | tmp.start = alignf(alignf_data, &tmp, size, align); | 415 | alloc.start = alignf(alignf_data, &tmp, size, align); |
411 | if (tmp.start < tmp.end && tmp.end - tmp.start >= size - 1) { | 416 | alloc.end = alloc.start + size - 1; |
412 | new->start = tmp.start; | 417 | if (resource_contains(&tmp, &alloc)) { |
413 | new->end = tmp.start + size - 1; | 418 | new->start = alloc.start; |
419 | new->end = alloc.end; | ||
414 | return 0; | 420 | return 0; |
415 | } | 421 | } |
416 | if (!this) | 422 | if (!this) |