diff options
| -rw-r--r-- | include/linux/memblock.h | 2 | ||||
| -rw-r--r-- | mm/memblock.c | 21 |
2 files changed, 19 insertions, 4 deletions
diff --git a/include/linux/memblock.h b/include/linux/memblock.h index 73dc382e72d8..b660e05b63d4 100644 --- a/include/linux/memblock.h +++ b/include/linux/memblock.h | |||
| @@ -272,6 +272,8 @@ static inline bool memblock_bottom_up(void) { return false; } | |||
| 272 | #define MEMBLOCK_ALLOC_ANYWHERE (~(phys_addr_t)0) | 272 | #define MEMBLOCK_ALLOC_ANYWHERE (~(phys_addr_t)0) |
| 273 | #define MEMBLOCK_ALLOC_ACCESSIBLE 0 | 273 | #define MEMBLOCK_ALLOC_ACCESSIBLE 0 |
| 274 | 274 | ||
| 275 | phys_addr_t __init memblock_alloc_range(phys_addr_t size, phys_addr_t align, | ||
| 276 | phys_addr_t start, phys_addr_t end); | ||
| 275 | phys_addr_t memblock_alloc_base(phys_addr_t size, phys_addr_t align, | 277 | phys_addr_t memblock_alloc_base(phys_addr_t size, phys_addr_t align, |
| 276 | phys_addr_t max_addr); | 278 | phys_addr_t max_addr); |
| 277 | phys_addr_t __memblock_alloc_base(phys_addr_t size, phys_addr_t align, | 279 | phys_addr_t __memblock_alloc_base(phys_addr_t size, phys_addr_t align, |
diff --git a/mm/memblock.c b/mm/memblock.c index a810ba923cdd..146736411318 100644 --- a/mm/memblock.c +++ b/mm/memblock.c | |||
| @@ -1033,22 +1033,35 @@ int __init_memblock memblock_set_node(phys_addr_t base, phys_addr_t size, | |||
| 1033 | } | 1033 | } |
| 1034 | #endif /* CONFIG_HAVE_MEMBLOCK_NODE_MAP */ | 1034 | #endif /* CONFIG_HAVE_MEMBLOCK_NODE_MAP */ |
| 1035 | 1035 | ||
| 1036 | static phys_addr_t __init memblock_alloc_base_nid(phys_addr_t size, | 1036 | static phys_addr_t __init memblock_alloc_range_nid(phys_addr_t size, |
| 1037 | phys_addr_t align, phys_addr_t max_addr, | 1037 | phys_addr_t align, phys_addr_t start, |
| 1038 | int nid) | 1038 | phys_addr_t end, int nid) |
| 1039 | { | 1039 | { |
| 1040 | phys_addr_t found; | 1040 | phys_addr_t found; |
| 1041 | 1041 | ||
| 1042 | if (!align) | 1042 | if (!align) |
| 1043 | align = SMP_CACHE_BYTES; | 1043 | align = SMP_CACHE_BYTES; |
| 1044 | 1044 | ||
| 1045 | found = memblock_find_in_range_node(size, align, 0, max_addr, nid); | 1045 | found = memblock_find_in_range_node(size, align, start, end, nid); |
| 1046 | if (found && !memblock_reserve(found, size)) | 1046 | if (found && !memblock_reserve(found, size)) |
| 1047 | return found; | 1047 | return found; |
| 1048 | 1048 | ||
| 1049 | return 0; | 1049 | return 0; |
| 1050 | } | 1050 | } |
| 1051 | 1051 | ||
| 1052 | phys_addr_t __init memblock_alloc_range(phys_addr_t size, phys_addr_t align, | ||
| 1053 | phys_addr_t start, phys_addr_t end) | ||
| 1054 | { | ||
| 1055 | return memblock_alloc_range_nid(size, align, start, end, NUMA_NO_NODE); | ||
| 1056 | } | ||
| 1057 | |||
| 1058 | static phys_addr_t __init memblock_alloc_base_nid(phys_addr_t size, | ||
| 1059 | phys_addr_t align, phys_addr_t max_addr, | ||
| 1060 | int nid) | ||
| 1061 | { | ||
| 1062 | return memblock_alloc_range_nid(size, align, 0, max_addr, nid); | ||
| 1063 | } | ||
| 1064 | |||
| 1052 | phys_addr_t __init memblock_alloc_nid(phys_addr_t size, phys_addr_t align, int nid) | 1065 | phys_addr_t __init memblock_alloc_nid(phys_addr_t size, phys_addr_t align, int nid) |
| 1053 | { | 1066 | { |
| 1054 | return memblock_alloc_base_nid(size, align, MEMBLOCK_ALLOC_ACCESSIBLE, nid); | 1067 | return memblock_alloc_base_nid(size, align, MEMBLOCK_ALLOC_ACCESSIBLE, nid); |
