diff options
author | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2010-07-06 18:39:01 -0400 |
---|---|---|
committer | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2010-08-04 22:56:07 -0400 |
commit | e63075a3c9377536d085bc013cd3fe6323162449 (patch) | |
tree | 28fde124dde6df867947882fc686d228502846df /include/linux/memblock.h | |
parent | 27f574c223d2c09610058b3ec7a29582d63a3e06 (diff) |
memblock: Introduce default allocation limit and use it to replace explicit ones
This introduce memblock.current_limit which is used to limit allocations
from memblock_alloc() or memblock_alloc_base(..., MEMBLOCK_ALLOC_ACCESSIBLE).
The old MEMBLOCK_ALLOC_ANYWHERE changes value from 0 to ~(u64)0 and can still
be used with memblock_alloc_base() to allocate really anywhere.
It is -no-longer- cropped to MEMBLOCK_REAL_LIMIT which disappears.
Note to archs: I'm leaving the default limit to MEMBLOCK_ALLOC_ANYWHERE. I
strongly recommend that you ensure that you set an appropriate limit
during boot in order to guarantee that an memblock_alloc() at any time
results in something that is accessible with a simple __va().
The reason is that a subsequent patch will introduce the ability for
the array to resize itself by reallocating itself. The MEMBLOCK core will
honor the current limit when performing those allocations.
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Diffstat (limited to 'include/linux/memblock.h')
-rw-r--r-- | include/linux/memblock.h | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/include/linux/memblock.h b/include/linux/memblock.h index 3cf3304e901d..c4f6e53264ed 100644 --- a/include/linux/memblock.h +++ b/include/linux/memblock.h | |||
@@ -34,6 +34,7 @@ struct memblock_type { | |||
34 | struct memblock { | 34 | struct memblock { |
35 | unsigned long debug; | 35 | unsigned long debug; |
36 | u64 rmo_size; | 36 | u64 rmo_size; |
37 | u64 current_limit; | ||
37 | struct memblock_type memory; | 38 | struct memblock_type memory; |
38 | struct memblock_type reserved; | 39 | struct memblock_type reserved; |
39 | }; | 40 | }; |
@@ -46,11 +47,16 @@ extern long memblock_add(u64 base, u64 size); | |||
46 | extern long memblock_remove(u64 base, u64 size); | 47 | extern long memblock_remove(u64 base, u64 size); |
47 | extern long __init memblock_free(u64 base, u64 size); | 48 | extern long __init memblock_free(u64 base, u64 size); |
48 | extern long __init memblock_reserve(u64 base, u64 size); | 49 | extern long __init memblock_reserve(u64 base, u64 size); |
50 | |||
49 | extern u64 __init memblock_alloc_nid(u64 size, u64 align, int nid); | 51 | extern u64 __init memblock_alloc_nid(u64 size, u64 align, int nid); |
50 | extern u64 __init memblock_alloc(u64 size, u64 align); | 52 | extern u64 __init memblock_alloc(u64 size, u64 align); |
53 | |||
54 | /* Flags for memblock_alloc_base() amd __memblock_alloc_base() */ | ||
55 | #define MEMBLOCK_ALLOC_ANYWHERE (~(u64)0) | ||
56 | #define MEMBLOCK_ALLOC_ACCESSIBLE 0 | ||
57 | |||
51 | extern u64 __init memblock_alloc_base(u64 size, | 58 | extern u64 __init memblock_alloc_base(u64 size, |
52 | u64, u64 max_addr); | 59 | u64, u64 max_addr); |
53 | #define MEMBLOCK_ALLOC_ANYWHERE 0 | ||
54 | extern u64 __init __memblock_alloc_base(u64 size, | 60 | extern u64 __init __memblock_alloc_base(u64 size, |
55 | u64 align, u64 max_addr); | 61 | u64 align, u64 max_addr); |
56 | extern u64 __init memblock_phys_mem_size(void); | 62 | extern u64 __init memblock_phys_mem_size(void); |
@@ -66,6 +72,14 @@ extern void memblock_dump_all(void); | |||
66 | /* Provided by the architecture */ | 72 | /* Provided by the architecture */ |
67 | extern u64 memblock_nid_range(u64 start, u64 end, int *nid); | 73 | extern u64 memblock_nid_range(u64 start, u64 end, int *nid); |
68 | 74 | ||
75 | /** | ||
76 | * memblock_set_current_limit - Set the current allocation limit to allow | ||
77 | * limiting allocations to what is currently | ||
78 | * accessible during boot | ||
79 | * @limit: New limit value (physical address) | ||
80 | */ | ||
81 | extern void memblock_set_current_limit(u64 limit); | ||
82 | |||
69 | 83 | ||
70 | /* | 84 | /* |
71 | * pfn conversion functions | 85 | * pfn conversion functions |