aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/memblock.h
diff options
context:
space:
mode:
authorBenjamin Herrenschmidt <benh@kernel.crashing.org>2010-07-06 18:39:01 -0400
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>2010-08-04 22:56:07 -0400
commite63075a3c9377536d085bc013cd3fe6323162449 (patch)
tree28fde124dde6df867947882fc686d228502846df /include/linux/memblock.h
parent27f574c223d2c09610058b3ec7a29582d63a3e06 (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.h16
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 {
34struct memblock { 34struct 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);
46extern long memblock_remove(u64 base, u64 size); 47extern long memblock_remove(u64 base, u64 size);
47extern long __init memblock_free(u64 base, u64 size); 48extern long __init memblock_free(u64 base, u64 size);
48extern long __init memblock_reserve(u64 base, u64 size); 49extern long __init memblock_reserve(u64 base, u64 size);
50
49extern u64 __init memblock_alloc_nid(u64 size, u64 align, int nid); 51extern u64 __init memblock_alloc_nid(u64 size, u64 align, int nid);
50extern u64 __init memblock_alloc(u64 size, u64 align); 52extern 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
51extern u64 __init memblock_alloc_base(u64 size, 58extern u64 __init memblock_alloc_base(u64 size,
52 u64, u64 max_addr); 59 u64, u64 max_addr);
53#define MEMBLOCK_ALLOC_ANYWHERE 0
54extern u64 __init __memblock_alloc_base(u64 size, 60extern u64 __init __memblock_alloc_base(u64 size,
55 u64 align, u64 max_addr); 61 u64 align, u64 max_addr);
56extern u64 __init memblock_phys_mem_size(void); 62extern 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 */
67extern u64 memblock_nid_range(u64 start, u64 end, int *nid); 73extern 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 */
81extern void memblock_set_current_limit(u64 limit);
82
69 83
70/* 84/*
71 * pfn conversion functions 85 * pfn conversion functions