diff options
author | Bjorn Helgaas <bjorn.helgaas@hp.com> | 2010-12-16 12:38:46 -0500 |
---|---|---|
committer | Jesse Barnes <jbarnes@virtuousgeek.org> | 2010-12-17 13:01:09 -0500 |
commit | fcb119183c73bf0781009713f303e28b1fb13d3e (patch) | |
tree | 94d739189963cecafae1b497845eb1e856558e49 /kernel | |
parent | c0f5ac5426f7fd82b23dd5c6a1e633b290294a08 (diff) |
resources: add arch hook for preventing allocation in reserved areas
This adds arch_remove_reservations(), which an arch can implement if it
needs to protect part of the address space from allocation.
Sometimes that can be done by just putting a region in the resource tree,
but there are cases where that doesn't work well. For example, x86 BIOS
E820 reservations are not related to devices, so they may overlap part of,
all of, or more than a device resource, so they may not end up at the
correct spot in the resource tree.
Acked-by: H. Peter Anvin <hpa@zytor.com>
Signed-off-by: Bjorn Helgaas <bjorn.helgaas@hp.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/resource.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/kernel/resource.c b/kernel/resource.c index 560659f7baef..798e2fae2a06 100644 --- a/kernel/resource.c +++ b/kernel/resource.c | |||
@@ -357,6 +357,10 @@ int __weak page_is_ram(unsigned long pfn) | |||
357 | return walk_system_ram_range(pfn, 1, NULL, __is_ram) == 1; | 357 | return walk_system_ram_range(pfn, 1, NULL, __is_ram) == 1; |
358 | } | 358 | } |
359 | 359 | ||
360 | void __weak arch_remove_reservations(struct resource *avail) | ||
361 | { | ||
362 | } | ||
363 | |||
360 | static resource_size_t simple_align_resource(void *data, | 364 | static resource_size_t simple_align_resource(void *data, |
361 | const struct resource *avail, | 365 | const struct resource *avail, |
362 | resource_size_t size, | 366 | resource_size_t size, |
@@ -394,6 +398,7 @@ static int find_resource(struct resource *root, struct resource *new, | |||
394 | struct resource *this = root->child; | 398 | struct resource *this = root->child; |
395 | struct resource tmp = *new, avail, alloc; | 399 | struct resource tmp = *new, avail, alloc; |
396 | 400 | ||
401 | tmp.flags = new->flags; | ||
397 | tmp.start = root->start; | 402 | tmp.start = root->start; |
398 | /* | 403 | /* |
399 | * Skip past an allocated resource that starts at 0, since the assignment | 404 | * Skip past an allocated resource that starts at 0, since the assignment |
@@ -410,6 +415,7 @@ static int find_resource(struct resource *root, struct resource *new, | |||
410 | tmp.end = root->end; | 415 | tmp.end = root->end; |
411 | 416 | ||
412 | resource_clip(&tmp, min, max); | 417 | resource_clip(&tmp, min, max); |
418 | arch_remove_reservations(&tmp); | ||
413 | 419 | ||
414 | /* Check for overflow after ALIGN() */ | 420 | /* Check for overflow after ALIGN() */ |
415 | avail = *new; | 421 | avail = *new; |