aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
authorBjorn Helgaas <bjorn.helgaas@hp.com>2010-12-16 12:38:46 -0500
committerJesse Barnes <jbarnes@virtuousgeek.org>2010-12-17 13:01:09 -0500
commitfcb119183c73bf0781009713f303e28b1fb13d3e (patch)
tree94d739189963cecafae1b497845eb1e856558e49 /kernel
parentc0f5ac5426f7fd82b23dd5c6a1e633b290294a08 (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.c6
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
360void __weak arch_remove_reservations(struct resource *avail)
361{
362}
363
360static resource_size_t simple_align_resource(void *data, 364static 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;