| Greg Kroah-Hartman | b244131 | 2017-11-01 15:07:57 +0100 | [diff] [blame] | 1 | /* SPDX-License-Identifier: GPL-2.0 */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 2 | /* | 
|  | 3 | * Discontiguous memory support, Kanoj Sarcar, SGI, Nov 1999 | 
|  | 4 | */ | 
|  | 5 | #ifndef _LINUX_BOOTMEM_H | 
|  | 6 | #define _LINUX_BOOTMEM_H | 
|  | 7 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 8 | #include <linux/mmzone.h> | 
| Santosh Shilimkar | 26f09e9 | 2014-01-21 15:50:19 -0800 | [diff] [blame] | 9 | #include <linux/mm_types.h> | 
| Franck Bui-Huu | e786e86 | 2006-09-25 23:31:06 -0700 | [diff] [blame] | 10 | #include <asm/dma.h> | 
| zijun_hu | 2382705 | 2016-10-07 16:59:24 -0700 | [diff] [blame] | 11 | #include <asm/processor.h> | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 12 |  | 
|  | 13 | /* | 
|  | 14 | *  simple boot-time physical memory area allocator. | 
|  | 15 | */ | 
|  | 16 |  | 
|  | 17 | extern unsigned long max_low_pfn; | 
|  | 18 | extern unsigned long min_low_pfn; | 
|  | 19 |  | 
|  | 20 | /* | 
|  | 21 | * highest page | 
|  | 22 | */ | 
|  | 23 | extern unsigned long max_pfn; | 
| Igor Mammedov | 8dd3303 | 2015-12-04 14:07:05 +0100 | [diff] [blame] | 24 | /* | 
|  | 25 | * highest possible page | 
|  | 26 | */ | 
|  | 27 | extern unsigned long long max_possible_pfn; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 28 |  | 
| Yinghai Lu | 0867721 | 2010-02-10 01:20:20 -0800 | [diff] [blame] | 29 | #ifndef CONFIG_NO_BOOTMEM | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 30 | /* | 
|  | 31 | * node_bootmem_map is a map pointer - the bits represent all physical | 
|  | 32 | * memory pages (including holes) on the node. | 
|  | 33 | */ | 
|  | 34 | typedef struct bootmem_data { | 
| Johannes Weiner | 3560e24 | 2008-07-23 21:28:09 -0700 | [diff] [blame] | 35 | unsigned long node_min_pfn; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 36 | unsigned long node_low_pfn; | 
|  | 37 | void *node_bootmem_map; | 
| Johannes Weiner | 5f2809e | 2008-07-23 21:28:05 -0700 | [diff] [blame] | 38 | unsigned long last_end_off; | 
|  | 39 | unsigned long hint_idx; | 
| KAMEZAWA Hiroyuki | 679bc9f | 2006-03-27 01:15:58 -0800 | [diff] [blame] | 40 | struct list_head list; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 41 | } bootmem_data_t; | 
|  | 42 |  | 
| Johannes Weiner | b61bfa3 | 2008-07-23 21:26:55 -0700 | [diff] [blame] | 43 | extern bootmem_data_t bootmem_node_data[]; | 
| Yinghai Lu | 0867721 | 2010-02-10 01:20:20 -0800 | [diff] [blame] | 44 | #endif | 
| Johannes Weiner | b61bfa3 | 2008-07-23 21:26:55 -0700 | [diff] [blame] | 45 |  | 
| Franck Bui-Huu | f71bf0c | 2006-09-25 23:31:08 -0700 | [diff] [blame] | 46 | extern unsigned long bootmem_bootmap_pages(unsigned long); | 
| Johannes Weiner | 223e8dc | 2008-07-23 21:28:00 -0700 | [diff] [blame] | 47 |  | 
|  | 48 | extern unsigned long init_bootmem_node(pg_data_t *pgdat, | 
|  | 49 | unsigned long freepfn, | 
|  | 50 | unsigned long startpfn, | 
|  | 51 | unsigned long endpfn); | 
| Franck Bui-Huu | f71bf0c | 2006-09-25 23:31:08 -0700 | [diff] [blame] | 52 | extern unsigned long init_bootmem(unsigned long addr, unsigned long memend); | 
| Johannes Weiner | 223e8dc | 2008-07-23 21:28:00 -0700 | [diff] [blame] | 53 |  | 
| Johannes Weiner | 223e8dc | 2008-07-23 21:28:00 -0700 | [diff] [blame] | 54 | extern unsigned long free_all_bootmem(void); | 
| Tang Chen | f784a3f | 2014-11-13 15:19:39 -0800 | [diff] [blame] | 55 | extern void reset_node_managed_pages(pg_data_t *pgdat); | 
| Jiang Liu | 7b4b2a0 | 2013-07-03 15:03:11 -0700 | [diff] [blame] | 56 | extern void reset_all_zones_managed_pages(void); | 
| Johannes Weiner | 223e8dc | 2008-07-23 21:28:00 -0700 | [diff] [blame] | 57 |  | 
|  | 58 | extern void free_bootmem_node(pg_data_t *pgdat, | 
|  | 59 | unsigned long addr, | 
|  | 60 | unsigned long size); | 
| Joonsoo Kim | 81df9bf | 2012-12-11 16:03:10 -0800 | [diff] [blame] | 61 | extern void free_bootmem(unsigned long physaddr, unsigned long size); | 
|  | 62 | extern void free_bootmem_late(unsigned long physaddr, unsigned long size); | 
| Johannes Weiner | 223e8dc | 2008-07-23 21:28:00 -0700 | [diff] [blame] | 63 |  | 
|  | 64 | /* | 
|  | 65 | * Flags for reserve_bootmem (also if CONFIG_HAVE_ARCH_BOOTMEM_NODE, | 
|  | 66 | * the architecture-specific code should honor this). | 
|  | 67 | * | 
| Wang Sheng-Hui | 1754e44 | 2014-06-04 16:08:04 -0700 | [diff] [blame] | 68 | * If flags is BOOTMEM_DEFAULT, then the return value is always 0 (success). | 
|  | 69 | * If flags contains BOOTMEM_EXCLUSIVE, then -EBUSY is returned if the memory | 
|  | 70 | * already was reserved. | 
| Johannes Weiner | 223e8dc | 2008-07-23 21:28:00 -0700 | [diff] [blame] | 71 | */ | 
|  | 72 | #define BOOTMEM_DEFAULT		0 | 
|  | 73 | #define BOOTMEM_EXCLUSIVE	(1<<0) | 
|  | 74 |  | 
| Tejun Heo | c132937 | 2009-02-24 11:57:20 +0900 | [diff] [blame] | 75 | extern int reserve_bootmem(unsigned long addr, | 
|  | 76 | unsigned long size, | 
|  | 77 | int flags); | 
| Tejun Heo | 2d0aae4 | 2009-02-24 11:57:21 +0900 | [diff] [blame] | 78 | extern int reserve_bootmem_node(pg_data_t *pgdat, | 
|  | 79 | unsigned long physaddr, | 
|  | 80 | unsigned long size, | 
|  | 81 | int flags); | 
|  | 82 |  | 
|  | 83 | extern void *__alloc_bootmem(unsigned long size, | 
| Franck Bui-Huu | f71bf0c | 2006-09-25 23:31:08 -0700 | [diff] [blame] | 84 | unsigned long align, | 
|  | 85 | unsigned long goal); | 
| Tejun Heo | 2d0aae4 | 2009-02-24 11:57:21 +0900 | [diff] [blame] | 86 | extern void *__alloc_bootmem_nopanic(unsigned long size, | 
| Franck Bui-Huu | f71bf0c | 2006-09-25 23:31:08 -0700 | [diff] [blame] | 87 | unsigned long align, | 
| Rasmus Villemoes | 48a2705 | 2016-05-19 17:10:55 -0700 | [diff] [blame] | 88 | unsigned long goal) __malloc; | 
| Johannes Weiner | 223e8dc | 2008-07-23 21:28:00 -0700 | [diff] [blame] | 89 | extern void *__alloc_bootmem_node(pg_data_t *pgdat, | 
|  | 90 | unsigned long size, | 
|  | 91 | unsigned long align, | 
| Rasmus Villemoes | 48a2705 | 2016-05-19 17:10:55 -0700 | [diff] [blame] | 92 | unsigned long goal) __malloc; | 
| Yinghai Lu | 0867721 | 2010-02-10 01:20:20 -0800 | [diff] [blame] | 93 | void *__alloc_bootmem_node_high(pg_data_t *pgdat, | 
|  | 94 | unsigned long size, | 
|  | 95 | unsigned long align, | 
| Rasmus Villemoes | 48a2705 | 2016-05-19 17:10:55 -0700 | [diff] [blame] | 96 | unsigned long goal) __malloc; | 
| Johannes Weiner | 223e8dc | 2008-07-23 21:28:00 -0700 | [diff] [blame] | 97 | extern void *__alloc_bootmem_node_nopanic(pg_data_t *pgdat, | 
|  | 98 | unsigned long size, | 
|  | 99 | unsigned long align, | 
| Rasmus Villemoes | 48a2705 | 2016-05-19 17:10:55 -0700 | [diff] [blame] | 100 | unsigned long goal) __malloc; | 
| Yinghai Lu | 99ab7b1 | 2012-07-11 14:02:53 -0700 | [diff] [blame] | 101 | void *___alloc_bootmem_node_nopanic(pg_data_t *pgdat, | 
|  | 102 | unsigned long size, | 
|  | 103 | unsigned long align, | 
|  | 104 | unsigned long goal, | 
| Rasmus Villemoes | 48a2705 | 2016-05-19 17:10:55 -0700 | [diff] [blame] | 105 | unsigned long limit) __malloc; | 
| Tejun Heo | 2d0aae4 | 2009-02-24 11:57:21 +0900 | [diff] [blame] | 106 | extern void *__alloc_bootmem_low(unsigned long size, | 
|  | 107 | unsigned long align, | 
| Rasmus Villemoes | 48a2705 | 2016-05-19 17:10:55 -0700 | [diff] [blame] | 108 | unsigned long goal) __malloc; | 
| Yinghai Lu | 38fa417 | 2013-01-24 12:20:15 -0800 | [diff] [blame] | 109 | void *__alloc_bootmem_low_nopanic(unsigned long size, | 
|  | 110 | unsigned long align, | 
| Rasmus Villemoes | 48a2705 | 2016-05-19 17:10:55 -0700 | [diff] [blame] | 111 | unsigned long goal) __malloc; | 
| Franck Bui-Huu | f71bf0c | 2006-09-25 23:31:08 -0700 | [diff] [blame] | 112 | extern void *__alloc_bootmem_low_node(pg_data_t *pgdat, | 
|  | 113 | unsigned long size, | 
|  | 114 | unsigned long align, | 
| Rasmus Villemoes | 48a2705 | 2016-05-19 17:10:55 -0700 | [diff] [blame] | 115 | unsigned long goal) __malloc; | 
| Tejun Heo | c132937 | 2009-02-24 11:57:20 +0900 | [diff] [blame] | 116 |  | 
| Yinghai Lu | 8bba154 | 2011-05-24 17:12:37 -0700 | [diff] [blame] | 117 | #ifdef CONFIG_NO_BOOTMEM | 
|  | 118 | /* We are using top down, so it is safe to use 0 here */ | 
|  | 119 | #define BOOTMEM_LOW_LIMIT 0 | 
|  | 120 | #else | 
|  | 121 | #define BOOTMEM_LOW_LIMIT __pa(MAX_DMA_ADDRESS) | 
|  | 122 | #endif | 
|  | 123 |  | 
| zijun_hu | 2382705 | 2016-10-07 16:59:24 -0700 | [diff] [blame] | 124 | #ifndef ARCH_LOW_ADDRESS_LIMIT | 
|  | 125 | #define ARCH_LOW_ADDRESS_LIMIT  0xffffffffUL | 
|  | 126 | #endif | 
|  | 127 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 128 | #define alloc_bootmem(x) \ | 
| Yinghai Lu | 8bba154 | 2011-05-24 17:12:37 -0700 | [diff] [blame] | 129 | __alloc_bootmem(x, SMP_CACHE_BYTES, BOOTMEM_LOW_LIMIT) | 
| Suresh Siddha | 53dde5f | 2010-11-16 13:23:50 -0800 | [diff] [blame] | 130 | #define alloc_bootmem_align(x, align) \ | 
| Yinghai Lu | 8bba154 | 2011-05-24 17:12:37 -0700 | [diff] [blame] | 131 | __alloc_bootmem(x, align, BOOTMEM_LOW_LIMIT) | 
| Jan Beulich | 74768ed | 2008-08-12 15:08:39 -0700 | [diff] [blame] | 132 | #define alloc_bootmem_nopanic(x) \ | 
| Yinghai Lu | 8bba154 | 2011-05-24 17:12:37 -0700 | [diff] [blame] | 133 | __alloc_bootmem_nopanic(x, SMP_CACHE_BYTES, BOOTMEM_LOW_LIMIT) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 134 | #define alloc_bootmem_pages(x) \ | 
| Yinghai Lu | 8bba154 | 2011-05-24 17:12:37 -0700 | [diff] [blame] | 135 | __alloc_bootmem(x, PAGE_SIZE, BOOTMEM_LOW_LIMIT) | 
| Jan Beulich | 74768ed | 2008-08-12 15:08:39 -0700 | [diff] [blame] | 136 | #define alloc_bootmem_pages_nopanic(x) \ | 
| Yinghai Lu | 8bba154 | 2011-05-24 17:12:37 -0700 | [diff] [blame] | 137 | __alloc_bootmem_nopanic(x, PAGE_SIZE, BOOTMEM_LOW_LIMIT) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 138 | #define alloc_bootmem_node(pgdat, x) \ | 
| Yinghai Lu | 8bba154 | 2011-05-24 17:12:37 -0700 | [diff] [blame] | 139 | __alloc_bootmem_node(pgdat, x, SMP_CACHE_BYTES, BOOTMEM_LOW_LIMIT) | 
| Yinghai Lu | 8f389a99 | 2011-05-11 15:13:32 -0700 | [diff] [blame] | 140 | #define alloc_bootmem_node_nopanic(pgdat, x) \ | 
| Yinghai Lu | 8bba154 | 2011-05-24 17:12:37 -0700 | [diff] [blame] | 141 | __alloc_bootmem_node_nopanic(pgdat, x, SMP_CACHE_BYTES, BOOTMEM_LOW_LIMIT) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 142 | #define alloc_bootmem_pages_node(pgdat, x) \ | 
| Yinghai Lu | 8bba154 | 2011-05-24 17:12:37 -0700 | [diff] [blame] | 143 | __alloc_bootmem_node(pgdat, x, PAGE_SIZE, BOOTMEM_LOW_LIMIT) | 
| Tejun Heo | 2d0aae4 | 2009-02-24 11:57:21 +0900 | [diff] [blame] | 144 | #define alloc_bootmem_pages_node_nopanic(pgdat, x) \ | 
| Yinghai Lu | 8bba154 | 2011-05-24 17:12:37 -0700 | [diff] [blame] | 145 | __alloc_bootmem_node_nopanic(pgdat, x, PAGE_SIZE, BOOTMEM_LOW_LIMIT) | 
| Tejun Heo | 2d0aae4 | 2009-02-24 11:57:21 +0900 | [diff] [blame] | 146 |  | 
|  | 147 | #define alloc_bootmem_low(x) \ | 
|  | 148 | __alloc_bootmem_low(x, SMP_CACHE_BYTES, 0) | 
| Yinghai Lu | 38fa417 | 2013-01-24 12:20:15 -0800 | [diff] [blame] | 149 | #define alloc_bootmem_low_pages_nopanic(x) \ | 
|  | 150 | __alloc_bootmem_low_nopanic(x, PAGE_SIZE, 0) | 
| Tejun Heo | 2d0aae4 | 2009-02-24 11:57:21 +0900 | [diff] [blame] | 151 | #define alloc_bootmem_low_pages(x) \ | 
|  | 152 | __alloc_bootmem_low(x, PAGE_SIZE, 0) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 153 | #define alloc_bootmem_low_pages_node(pgdat, x) \ | 
| Franck Bui-Huu | 71fb2e8 | 2006-09-25 23:31:05 -0700 | [diff] [blame] | 154 | __alloc_bootmem_low_node(pgdat, x, PAGE_SIZE, 0) | 
| Johannes Weiner | c6af5e9 | 2008-07-25 15:48:04 +0200 | [diff] [blame] | 155 |  | 
| Santosh Shilimkar | 26f09e9 | 2014-01-21 15:50:19 -0800 | [diff] [blame] | 156 |  | 
|  | 157 | #if defined(CONFIG_HAVE_MEMBLOCK) && defined(CONFIG_NO_BOOTMEM) | 
|  | 158 |  | 
|  | 159 | /* FIXME: use MEMBLOCK_ALLOC_* variants here */ | 
|  | 160 | #define BOOTMEM_ALLOC_ACCESSIBLE	0 | 
|  | 161 | #define BOOTMEM_ALLOC_ANYWHERE		(~(phys_addr_t)0) | 
|  | 162 |  | 
|  | 163 | /* FIXME: Move to memblock.h at a point where we remove nobootmem.c */ | 
| Pavel Tatashin | ea1f5f3 | 2017-11-15 17:36:27 -0800 | [diff] [blame] | 164 | void *memblock_virt_alloc_try_nid_raw(phys_addr_t size, phys_addr_t align, | 
|  | 165 | phys_addr_t min_addr, | 
|  | 166 | phys_addr_t max_addr, int nid); | 
| Santosh Shilimkar | 26f09e9 | 2014-01-21 15:50:19 -0800 | [diff] [blame] | 167 | void *memblock_virt_alloc_try_nid_nopanic(phys_addr_t size, | 
|  | 168 | phys_addr_t align, phys_addr_t min_addr, | 
|  | 169 | phys_addr_t max_addr, int nid); | 
|  | 170 | void *memblock_virt_alloc_try_nid(phys_addr_t size, phys_addr_t align, | 
|  | 171 | phys_addr_t min_addr, phys_addr_t max_addr, int nid); | 
|  | 172 | void __memblock_free_early(phys_addr_t base, phys_addr_t size); | 
|  | 173 | void __memblock_free_late(phys_addr_t base, phys_addr_t size); | 
|  | 174 |  | 
|  | 175 | static inline void * __init memblock_virt_alloc( | 
|  | 176 | phys_addr_t size,  phys_addr_t align) | 
|  | 177 | { | 
|  | 178 | return memblock_virt_alloc_try_nid(size, align, BOOTMEM_LOW_LIMIT, | 
|  | 179 | BOOTMEM_ALLOC_ACCESSIBLE, | 
|  | 180 | NUMA_NO_NODE); | 
|  | 181 | } | 
|  | 182 |  | 
| Pavel Tatashin | ea1f5f3 | 2017-11-15 17:36:27 -0800 | [diff] [blame] | 183 | static inline void * __init memblock_virt_alloc_raw( | 
|  | 184 | phys_addr_t size,  phys_addr_t align) | 
|  | 185 | { | 
|  | 186 | return memblock_virt_alloc_try_nid_raw(size, align, BOOTMEM_LOW_LIMIT, | 
|  | 187 | BOOTMEM_ALLOC_ACCESSIBLE, | 
|  | 188 | NUMA_NO_NODE); | 
|  | 189 | } | 
|  | 190 |  | 
| Santosh Shilimkar | 26f09e9 | 2014-01-21 15:50:19 -0800 | [diff] [blame] | 191 | static inline void * __init memblock_virt_alloc_nopanic( | 
|  | 192 | phys_addr_t size, phys_addr_t align) | 
|  | 193 | { | 
|  | 194 | return memblock_virt_alloc_try_nid_nopanic(size, align, | 
|  | 195 | BOOTMEM_LOW_LIMIT, | 
|  | 196 | BOOTMEM_ALLOC_ACCESSIBLE, | 
|  | 197 | NUMA_NO_NODE); | 
|  | 198 | } | 
|  | 199 |  | 
| Yinghai Lu | ad6492b | 2014-01-27 17:06:49 -0800 | [diff] [blame] | 200 | static inline void * __init memblock_virt_alloc_low( | 
|  | 201 | phys_addr_t size, phys_addr_t align) | 
|  | 202 | { | 
|  | 203 | return memblock_virt_alloc_try_nid(size, align, | 
|  | 204 | BOOTMEM_LOW_LIMIT, | 
|  | 205 | ARCH_LOW_ADDRESS_LIMIT, | 
|  | 206 | NUMA_NO_NODE); | 
|  | 207 | } | 
|  | 208 | static inline void * __init memblock_virt_alloc_low_nopanic( | 
|  | 209 | phys_addr_t size, phys_addr_t align) | 
|  | 210 | { | 
|  | 211 | return memblock_virt_alloc_try_nid_nopanic(size, align, | 
|  | 212 | BOOTMEM_LOW_LIMIT, | 
|  | 213 | ARCH_LOW_ADDRESS_LIMIT, | 
|  | 214 | NUMA_NO_NODE); | 
|  | 215 | } | 
|  | 216 |  | 
| Santosh Shilimkar | 26f09e9 | 2014-01-21 15:50:19 -0800 | [diff] [blame] | 217 | static inline void * __init memblock_virt_alloc_from_nopanic( | 
|  | 218 | phys_addr_t size, phys_addr_t align, phys_addr_t min_addr) | 
|  | 219 | { | 
|  | 220 | return memblock_virt_alloc_try_nid_nopanic(size, align, min_addr, | 
|  | 221 | BOOTMEM_ALLOC_ACCESSIBLE, | 
|  | 222 | NUMA_NO_NODE); | 
|  | 223 | } | 
|  | 224 |  | 
|  | 225 | static inline void * __init memblock_virt_alloc_node( | 
|  | 226 | phys_addr_t size, int nid) | 
|  | 227 | { | 
|  | 228 | return memblock_virt_alloc_try_nid(size, 0, BOOTMEM_LOW_LIMIT, | 
|  | 229 | BOOTMEM_ALLOC_ACCESSIBLE, nid); | 
|  | 230 | } | 
|  | 231 |  | 
|  | 232 | static inline void * __init memblock_virt_alloc_node_nopanic( | 
|  | 233 | phys_addr_t size, int nid) | 
|  | 234 | { | 
|  | 235 | return memblock_virt_alloc_try_nid_nopanic(size, 0, BOOTMEM_LOW_LIMIT, | 
|  | 236 | BOOTMEM_ALLOC_ACCESSIBLE, | 
|  | 237 | nid); | 
|  | 238 | } | 
|  | 239 |  | 
|  | 240 | static inline void __init memblock_free_early( | 
|  | 241 | phys_addr_t base, phys_addr_t size) | 
|  | 242 | { | 
|  | 243 | __memblock_free_early(base, size); | 
|  | 244 | } | 
|  | 245 |  | 
|  | 246 | static inline void __init memblock_free_early_nid( | 
|  | 247 | phys_addr_t base, phys_addr_t size, int nid) | 
|  | 248 | { | 
|  | 249 | __memblock_free_early(base, size); | 
|  | 250 | } | 
|  | 251 |  | 
|  | 252 | static inline void __init memblock_free_late( | 
|  | 253 | phys_addr_t base, phys_addr_t size) | 
|  | 254 | { | 
|  | 255 | __memblock_free_late(base, size); | 
|  | 256 | } | 
|  | 257 |  | 
|  | 258 | #else | 
|  | 259 |  | 
|  | 260 | #define BOOTMEM_ALLOC_ACCESSIBLE	0 | 
|  | 261 |  | 
|  | 262 |  | 
|  | 263 | /* Fall back to all the existing bootmem APIs */ | 
|  | 264 | static inline void * __init memblock_virt_alloc( | 
|  | 265 | phys_addr_t size,  phys_addr_t align) | 
|  | 266 | { | 
|  | 267 | if (!align) | 
|  | 268 | align = SMP_CACHE_BYTES; | 
|  | 269 | return __alloc_bootmem(size, align, BOOTMEM_LOW_LIMIT); | 
|  | 270 | } | 
|  | 271 |  | 
| Pavel Tatashin | ea1f5f3 | 2017-11-15 17:36:27 -0800 | [diff] [blame] | 272 | static inline void * __init memblock_virt_alloc_raw( | 
|  | 273 | phys_addr_t size,  phys_addr_t align) | 
|  | 274 | { | 
|  | 275 | if (!align) | 
|  | 276 | align = SMP_CACHE_BYTES; | 
|  | 277 | return __alloc_bootmem_nopanic(size, align, BOOTMEM_LOW_LIMIT); | 
|  | 278 | } | 
|  | 279 |  | 
| Santosh Shilimkar | 26f09e9 | 2014-01-21 15:50:19 -0800 | [diff] [blame] | 280 | static inline void * __init memblock_virt_alloc_nopanic( | 
|  | 281 | phys_addr_t size, phys_addr_t align) | 
|  | 282 | { | 
|  | 283 | if (!align) | 
|  | 284 | align = SMP_CACHE_BYTES; | 
|  | 285 | return __alloc_bootmem_nopanic(size, align, BOOTMEM_LOW_LIMIT); | 
|  | 286 | } | 
|  | 287 |  | 
| Yinghai Lu | ad6492b | 2014-01-27 17:06:49 -0800 | [diff] [blame] | 288 | static inline void * __init memblock_virt_alloc_low( | 
|  | 289 | phys_addr_t size, phys_addr_t align) | 
|  | 290 | { | 
|  | 291 | if (!align) | 
|  | 292 | align = SMP_CACHE_BYTES; | 
| Yinghai Lu | 07bacb3 | 2014-01-30 15:45:44 -0800 | [diff] [blame] | 293 | return __alloc_bootmem_low(size, align, 0); | 
| Yinghai Lu | ad6492b | 2014-01-27 17:06:49 -0800 | [diff] [blame] | 294 | } | 
|  | 295 |  | 
|  | 296 | static inline void * __init memblock_virt_alloc_low_nopanic( | 
|  | 297 | phys_addr_t size, phys_addr_t align) | 
|  | 298 | { | 
|  | 299 | if (!align) | 
|  | 300 | align = SMP_CACHE_BYTES; | 
| Yinghai Lu | 07bacb3 | 2014-01-30 15:45:44 -0800 | [diff] [blame] | 301 | return __alloc_bootmem_low_nopanic(size, align, 0); | 
| Yinghai Lu | ad6492b | 2014-01-27 17:06:49 -0800 | [diff] [blame] | 302 | } | 
|  | 303 |  | 
| Santosh Shilimkar | 26f09e9 | 2014-01-21 15:50:19 -0800 | [diff] [blame] | 304 | static inline void * __init memblock_virt_alloc_from_nopanic( | 
|  | 305 | phys_addr_t size, phys_addr_t align, phys_addr_t min_addr) | 
|  | 306 | { | 
|  | 307 | return __alloc_bootmem_nopanic(size, align, min_addr); | 
|  | 308 | } | 
|  | 309 |  | 
|  | 310 | static inline void * __init memblock_virt_alloc_node( | 
|  | 311 | phys_addr_t size, int nid) | 
|  | 312 | { | 
|  | 313 | return __alloc_bootmem_node(NODE_DATA(nid), size, SMP_CACHE_BYTES, | 
|  | 314 | BOOTMEM_LOW_LIMIT); | 
|  | 315 | } | 
|  | 316 |  | 
|  | 317 | static inline void * __init memblock_virt_alloc_node_nopanic( | 
|  | 318 | phys_addr_t size, int nid) | 
|  | 319 | { | 
|  | 320 | return __alloc_bootmem_node_nopanic(NODE_DATA(nid), size, | 
|  | 321 | SMP_CACHE_BYTES, | 
|  | 322 | BOOTMEM_LOW_LIMIT); | 
|  | 323 | } | 
|  | 324 |  | 
|  | 325 | static inline void * __init memblock_virt_alloc_try_nid(phys_addr_t size, | 
|  | 326 | phys_addr_t align, phys_addr_t min_addr, phys_addr_t max_addr, int nid) | 
|  | 327 | { | 
|  | 328 | return __alloc_bootmem_node_high(NODE_DATA(nid), size, align, | 
|  | 329 | min_addr); | 
|  | 330 | } | 
|  | 331 |  | 
| Pavel Tatashin | ea1f5f3 | 2017-11-15 17:36:27 -0800 | [diff] [blame] | 332 | static inline void * __init memblock_virt_alloc_try_nid_raw( | 
|  | 333 | phys_addr_t size, phys_addr_t align, | 
|  | 334 | phys_addr_t min_addr, phys_addr_t max_addr, int nid) | 
|  | 335 | { | 
|  | 336 | return ___alloc_bootmem_node_nopanic(NODE_DATA(nid), size, align, | 
|  | 337 | min_addr, max_addr); | 
|  | 338 | } | 
|  | 339 |  | 
| Santosh Shilimkar | 26f09e9 | 2014-01-21 15:50:19 -0800 | [diff] [blame] | 340 | static inline void * __init memblock_virt_alloc_try_nid_nopanic( | 
|  | 341 | phys_addr_t size, phys_addr_t align, | 
|  | 342 | phys_addr_t min_addr, phys_addr_t max_addr, int nid) | 
|  | 343 | { | 
|  | 344 | return ___alloc_bootmem_node_nopanic(NODE_DATA(nid), size, align, | 
|  | 345 | min_addr, max_addr); | 
|  | 346 | } | 
|  | 347 |  | 
|  | 348 | static inline void __init memblock_free_early( | 
|  | 349 | phys_addr_t base, phys_addr_t size) | 
|  | 350 | { | 
|  | 351 | free_bootmem(base, size); | 
|  | 352 | } | 
|  | 353 |  | 
|  | 354 | static inline void __init memblock_free_early_nid( | 
|  | 355 | phys_addr_t base, phys_addr_t size, int nid) | 
|  | 356 | { | 
|  | 357 | free_bootmem_node(NODE_DATA(nid), base, size); | 
|  | 358 | } | 
|  | 359 |  | 
|  | 360 | static inline void __init memblock_free_late( | 
|  | 361 | phys_addr_t base, phys_addr_t size) | 
|  | 362 | { | 
|  | 363 | free_bootmem_late(base, size); | 
|  | 364 | } | 
|  | 365 | #endif /* defined(CONFIG_HAVE_MEMBLOCK) && defined(CONFIG_NO_BOOTMEM) */ | 
|  | 366 |  | 
| Franck Bui-Huu | f71bf0c | 2006-09-25 23:31:08 -0700 | [diff] [blame] | 367 | extern void *alloc_large_system_hash(const char *tablename, | 
|  | 368 | unsigned long bucketsize, | 
|  | 369 | unsigned long numentries, | 
|  | 370 | int scale, | 
|  | 371 | int flags, | 
|  | 372 | unsigned int *_hash_shift, | 
|  | 373 | unsigned int *_hash_mask, | 
| Tim Bird | 31fe62b | 2012-05-23 13:33:35 +0000 | [diff] [blame] | 374 | unsigned long low_limit, | 
|  | 375 | unsigned long high_limit); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 376 |  | 
| Andrew Morton | 0490366 | 2006-12-06 20:37:33 -0800 | [diff] [blame] | 377 | #define HASH_EARLY	0x00000001	/* Allocating during early boot? */ | 
| Jan Beulich | 2c85f51 | 2009-09-21 17:03:07 -0700 | [diff] [blame] | 378 | #define HASH_SMALL	0x00000002	/* sub-page allocation allowed, min | 
|  | 379 | * shift passed via *_hash_shift */ | 
| Pavel Tatashin | 3749a8f | 2017-07-06 15:39:08 -0700 | [diff] [blame] | 380 | #define HASH_ZERO	0x00000004	/* Zero allocated hash table */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 381 |  | 
| Anton Blanchard | c2fdf3a | 2009-03-31 15:23:19 -0700 | [diff] [blame] | 382 | /* Only NUMA needs hash distribution. 64bit NUMA architectures have | 
|  | 383 | * sufficient vmalloc space. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 384 | */ | 
| Rasmus Villemoes | a9919c7 | 2015-06-24 16:56:28 -0700 | [diff] [blame] | 385 | #ifdef CONFIG_NUMA | 
|  | 386 | #define HASHDIST_DEFAULT IS_ENABLED(CONFIG_64BIT) | 
| David S. Miller | f034b5d | 2006-08-24 03:08:07 -0700 | [diff] [blame] | 387 | extern int hashdist;		/* Distribute hashes across NUMA nodes? */ | 
| Rasmus Villemoes | a9919c7 | 2015-06-24 16:56:28 -0700 | [diff] [blame] | 388 | #else | 
|  | 389 | #define hashdist (0) | 
|  | 390 | #endif | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 391 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 392 |  | 
|  | 393 | #endif /* _LINUX_BOOTMEM_H */ |