aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/bootmem.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/linux/bootmem.h')
-rw-r--r--include/linux/bootmem.h190
1 files changed, 189 insertions, 1 deletions
diff --git a/include/linux/bootmem.h b/include/linux/bootmem.h
index f1f07d31a3af..db51fe4fe317 100644
--- a/include/linux/bootmem.h
+++ b/include/linux/bootmem.h
@@ -5,6 +5,7 @@
5#define _LINUX_BOOTMEM_H 5#define _LINUX_BOOTMEM_H
6 6
7#include <linux/mmzone.h> 7#include <linux/mmzone.h>
8#include <linux/mm_types.h>
8#include <asm/dma.h> 9#include <asm/dma.h>
9 10
10/* 11/*
@@ -52,7 +53,6 @@ extern void free_bootmem_node(pg_data_t *pgdat,
52 unsigned long size); 53 unsigned long size);
53extern void free_bootmem(unsigned long physaddr, unsigned long size); 54extern void free_bootmem(unsigned long physaddr, unsigned long size);
54extern void free_bootmem_late(unsigned long physaddr, unsigned long size); 55extern void free_bootmem_late(unsigned long physaddr, unsigned long size);
55extern void __free_pages_bootmem(struct page *page, unsigned int order);
56 56
57/* 57/*
58 * Flags for reserve_bootmem (also if CONFIG_HAVE_ARCH_BOOTMEM_NODE, 58 * Flags for reserve_bootmem (also if CONFIG_HAVE_ARCH_BOOTMEM_NODE,
@@ -142,6 +142,194 @@ extern void *__alloc_bootmem_low_node(pg_data_t *pgdat,
142#define alloc_bootmem_low_pages_node(pgdat, x) \ 142#define alloc_bootmem_low_pages_node(pgdat, x) \
143 __alloc_bootmem_low_node(pgdat, x, PAGE_SIZE, 0) 143 __alloc_bootmem_low_node(pgdat, x, PAGE_SIZE, 0)
144 144
145
146#if defined(CONFIG_HAVE_MEMBLOCK) && defined(CONFIG_NO_BOOTMEM)
147
148/* FIXME: use MEMBLOCK_ALLOC_* variants here */
149#define BOOTMEM_ALLOC_ACCESSIBLE 0
150#define BOOTMEM_ALLOC_ANYWHERE (~(phys_addr_t)0)
151
152/* FIXME: Move to memblock.h at a point where we remove nobootmem.c */
153void *memblock_virt_alloc_try_nid_nopanic(phys_addr_t size,
154 phys_addr_t align, phys_addr_t min_addr,
155 phys_addr_t max_addr, int nid);
156void *memblock_virt_alloc_try_nid(phys_addr_t size, phys_addr_t align,
157 phys_addr_t min_addr, phys_addr_t max_addr, int nid);
158void __memblock_free_early(phys_addr_t base, phys_addr_t size);
159void __memblock_free_late(phys_addr_t base, phys_addr_t size);
160
161static inline void * __init memblock_virt_alloc(
162 phys_addr_t size, phys_addr_t align)
163{
164 return memblock_virt_alloc_try_nid(size, align, BOOTMEM_LOW_LIMIT,
165 BOOTMEM_ALLOC_ACCESSIBLE,
166 NUMA_NO_NODE);
167}
168
169static inline void * __init memblock_virt_alloc_nopanic(
170 phys_addr_t size, phys_addr_t align)
171{
172 return memblock_virt_alloc_try_nid_nopanic(size, align,
173 BOOTMEM_LOW_LIMIT,
174 BOOTMEM_ALLOC_ACCESSIBLE,
175 NUMA_NO_NODE);
176}
177
178#ifndef ARCH_LOW_ADDRESS_LIMIT
179#define ARCH_LOW_ADDRESS_LIMIT 0xffffffffUL
180#endif
181
182static inline void * __init memblock_virt_alloc_low(
183 phys_addr_t size, phys_addr_t align)
184{
185 return memblock_virt_alloc_try_nid(size, align,
186 BOOTMEM_LOW_LIMIT,
187 ARCH_LOW_ADDRESS_LIMIT,
188 NUMA_NO_NODE);
189}
190static inline void * __init memblock_virt_alloc_low_nopanic(
191 phys_addr_t size, phys_addr_t align)
192{
193 return memblock_virt_alloc_try_nid_nopanic(size, align,
194 BOOTMEM_LOW_LIMIT,
195 ARCH_LOW_ADDRESS_LIMIT,
196 NUMA_NO_NODE);
197}
198
199static inline void * __init memblock_virt_alloc_from_nopanic(
200 phys_addr_t size, phys_addr_t align, phys_addr_t min_addr)
201{
202 return memblock_virt_alloc_try_nid_nopanic(size, align, min_addr,
203 BOOTMEM_ALLOC_ACCESSIBLE,
204 NUMA_NO_NODE);
205}
206
207static inline void * __init memblock_virt_alloc_node(
208 phys_addr_t size, int nid)
209{
210 return memblock_virt_alloc_try_nid(size, 0, BOOTMEM_LOW_LIMIT,
211 BOOTMEM_ALLOC_ACCESSIBLE, nid);
212}
213
214static inline void * __init memblock_virt_alloc_node_nopanic(
215 phys_addr_t size, int nid)
216{
217 return memblock_virt_alloc_try_nid_nopanic(size, 0, BOOTMEM_LOW_LIMIT,
218 BOOTMEM_ALLOC_ACCESSIBLE,
219 nid);
220}
221
222static inline void __init memblock_free_early(
223 phys_addr_t base, phys_addr_t size)
224{
225 __memblock_free_early(base, size);
226}
227
228static inline void __init memblock_free_early_nid(
229 phys_addr_t base, phys_addr_t size, int nid)
230{
231 __memblock_free_early(base, size);
232}
233
234static inline void __init memblock_free_late(
235 phys_addr_t base, phys_addr_t size)
236{
237 __memblock_free_late(base, size);
238}
239
240#else
241
242#define BOOTMEM_ALLOC_ACCESSIBLE 0
243
244
245/* Fall back to all the existing bootmem APIs */
246static inline void * __init memblock_virt_alloc(
247 phys_addr_t size, phys_addr_t align)
248{
249 if (!align)
250 align = SMP_CACHE_BYTES;
251 return __alloc_bootmem(size, align, BOOTMEM_LOW_LIMIT);
252}
253
254static inline void * __init memblock_virt_alloc_nopanic(
255 phys_addr_t size, phys_addr_t align)
256{
257 if (!align)
258 align = SMP_CACHE_BYTES;
259 return __alloc_bootmem_nopanic(size, align, BOOTMEM_LOW_LIMIT);
260}
261
262static inline void * __init memblock_virt_alloc_low(
263 phys_addr_t size, phys_addr_t align)
264{
265 if (!align)
266 align = SMP_CACHE_BYTES;
267 return __alloc_bootmem_low(size, align, 0);
268}
269
270static inline void * __init memblock_virt_alloc_low_nopanic(
271 phys_addr_t size, phys_addr_t align)
272{
273 if (!align)
274 align = SMP_CACHE_BYTES;
275 return __alloc_bootmem_low_nopanic(size, align, 0);
276}
277
278static inline void * __init memblock_virt_alloc_from_nopanic(
279 phys_addr_t size, phys_addr_t align, phys_addr_t min_addr)
280{
281 return __alloc_bootmem_nopanic(size, align, min_addr);
282}
283
284static inline void * __init memblock_virt_alloc_node(
285 phys_addr_t size, int nid)
286{
287 return __alloc_bootmem_node(NODE_DATA(nid), size, SMP_CACHE_BYTES,
288 BOOTMEM_LOW_LIMIT);
289}
290
291static inline void * __init memblock_virt_alloc_node_nopanic(
292 phys_addr_t size, int nid)
293{
294 return __alloc_bootmem_node_nopanic(NODE_DATA(nid), size,
295 SMP_CACHE_BYTES,
296 BOOTMEM_LOW_LIMIT);
297}
298
299static inline void * __init memblock_virt_alloc_try_nid(phys_addr_t size,
300 phys_addr_t align, phys_addr_t min_addr, phys_addr_t max_addr, int nid)
301{
302 return __alloc_bootmem_node_high(NODE_DATA(nid), size, align,
303 min_addr);
304}
305
306static inline void * __init memblock_virt_alloc_try_nid_nopanic(
307 phys_addr_t size, phys_addr_t align,
308 phys_addr_t min_addr, phys_addr_t max_addr, int nid)
309{
310 return ___alloc_bootmem_node_nopanic(NODE_DATA(nid), size, align,
311 min_addr, max_addr);
312}
313
314static inline void __init memblock_free_early(
315 phys_addr_t base, phys_addr_t size)
316{
317 free_bootmem(base, size);
318}
319
320static inline void __init memblock_free_early_nid(
321 phys_addr_t base, phys_addr_t size, int nid)
322{
323 free_bootmem_node(NODE_DATA(nid), base, size);
324}
325
326static inline void __init memblock_free_late(
327 phys_addr_t base, phys_addr_t size)
328{
329 free_bootmem_late(base, size);
330}
331#endif /* defined(CONFIG_HAVE_MEMBLOCK) && defined(CONFIG_NO_BOOTMEM) */
332
145#ifdef CONFIG_HAVE_ARCH_ALLOC_REMAP 333#ifdef CONFIG_HAVE_ARCH_ALLOC_REMAP
146extern void *alloc_remap(int nid, unsigned long size); 334extern void *alloc_remap(int nid, unsigned long size);
147#else 335#else