memblock: add align parameter to memblock_alloc_node()
[linux-2.6-block.git] / include / linux / bootmem.h
CommitLineData
b2441318 1/* SPDX-License-Identifier: GPL-2.0 */
1da177e4
LT
2/*
3 * Discontiguous memory support, Kanoj Sarcar, SGI, Nov 1999
4 */
5#ifndef _LINUX_BOOTMEM_H
6#define _LINUX_BOOTMEM_H
7
1da177e4 8#include <linux/mmzone.h>
26f09e9b 9#include <linux/mm_types.h>
e786e86a 10#include <asm/dma.h>
2382705f 11#include <asm/processor.h>
1da177e4
LT
12
13/*
14 * simple boot-time physical memory area allocator.
15 */
16
17extern unsigned long max_low_pfn;
18extern unsigned long min_low_pfn;
19
20/*
21 * highest page
22 */
23extern unsigned long max_pfn;
8dd33030
IM
24/*
25 * highest possible page
26 */
27extern unsigned long long max_possible_pfn;
1da177e4 28
223e8dc9 29extern unsigned long free_all_bootmem(void);
f784a3f1 30extern void reset_node_managed_pages(pg_data_t *pgdat);
7b4b2a0d 31extern void reset_all_zones_managed_pages(void);
223e8dc9
JW
32
33extern void free_bootmem_node(pg_data_t *pgdat,
34 unsigned long addr,
35 unsigned long size);
81df9bff
JK
36extern void free_bootmem(unsigned long physaddr, unsigned long size);
37extern void free_bootmem_late(unsigned long physaddr, unsigned long size);
223e8dc9 38
2d0aae41 39extern void *__alloc_bootmem(unsigned long size,
f71bf0ca
FBH
40 unsigned long align,
41 unsigned long goal);
2d0aae41 42extern void *__alloc_bootmem_nopanic(unsigned long size,
f71bf0ca 43 unsigned long align,
48a27055 44 unsigned long goal) __malloc;
223e8dc9
JW
45extern void *__alloc_bootmem_node(pg_data_t *pgdat,
46 unsigned long size,
47 unsigned long align,
48a27055 48 unsigned long goal) __malloc;
08677214
YL
49void *__alloc_bootmem_node_high(pg_data_t *pgdat,
50 unsigned long size,
51 unsigned long align,
48a27055 52 unsigned long goal) __malloc;
223e8dc9
JW
53extern void *__alloc_bootmem_node_nopanic(pg_data_t *pgdat,
54 unsigned long size,
55 unsigned long align,
48a27055 56 unsigned long goal) __malloc;
99ab7b19
YL
57void *___alloc_bootmem_node_nopanic(pg_data_t *pgdat,
58 unsigned long size,
59 unsigned long align,
60 unsigned long goal,
48a27055 61 unsigned long limit) __malloc;
2d0aae41
TH
62extern void *__alloc_bootmem_low(unsigned long size,
63 unsigned long align,
48a27055 64 unsigned long goal) __malloc;
c1329375 65
8bba154e
YL
66/* We are using top down, so it is safe to use 0 here */
67#define BOOTMEM_LOW_LIMIT 0
8bba154e 68
2382705f 69#ifndef ARCH_LOW_ADDRESS_LIMIT
70#define ARCH_LOW_ADDRESS_LIMIT 0xffffffffUL
71#endif
72
1da177e4 73#define alloc_bootmem(x) \
8bba154e 74 __alloc_bootmem(x, SMP_CACHE_BYTES, BOOTMEM_LOW_LIMIT)
53dde5f3 75#define alloc_bootmem_align(x, align) \
8bba154e 76 __alloc_bootmem(x, align, BOOTMEM_LOW_LIMIT)
1da177e4 77#define alloc_bootmem_pages(x) \
8bba154e 78 __alloc_bootmem(x, PAGE_SIZE, BOOTMEM_LOW_LIMIT)
74768ed8 79#define alloc_bootmem_pages_nopanic(x) \
8bba154e 80 __alloc_bootmem_nopanic(x, PAGE_SIZE, BOOTMEM_LOW_LIMIT)
1da177e4 81#define alloc_bootmem_node(pgdat, x) \
8bba154e 82 __alloc_bootmem_node(pgdat, x, SMP_CACHE_BYTES, BOOTMEM_LOW_LIMIT)
8f389a99 83#define alloc_bootmem_node_nopanic(pgdat, x) \
8bba154e 84 __alloc_bootmem_node_nopanic(pgdat, x, SMP_CACHE_BYTES, BOOTMEM_LOW_LIMIT)
1da177e4 85#define alloc_bootmem_pages_node(pgdat, x) \
8bba154e 86 __alloc_bootmem_node(pgdat, x, PAGE_SIZE, BOOTMEM_LOW_LIMIT)
2d0aae41
TH
87
88#define alloc_bootmem_low(x) \
89 __alloc_bootmem_low(x, SMP_CACHE_BYTES, 0)
90#define alloc_bootmem_low_pages(x) \
91 __alloc_bootmem_low(x, PAGE_SIZE, 0)
c6af5e9f 92
26f09e9b
SS
93/* FIXME: use MEMBLOCK_ALLOC_* variants here */
94#define BOOTMEM_ALLOC_ACCESSIBLE 0
95#define BOOTMEM_ALLOC_ANYWHERE (~(phys_addr_t)0)
96
97/* FIXME: Move to memblock.h at a point where we remove nobootmem.c */
eb31d559 98void *memblock_alloc_try_nid_raw(phys_addr_t size, phys_addr_t align,
ea1f5f37
PT
99 phys_addr_t min_addr,
100 phys_addr_t max_addr, int nid);
eb31d559 101void *memblock_alloc_try_nid_nopanic(phys_addr_t size,
26f09e9b
SS
102 phys_addr_t align, phys_addr_t min_addr,
103 phys_addr_t max_addr, int nid);
eb31d559 104void *memblock_alloc_try_nid(phys_addr_t size, phys_addr_t align,
26f09e9b
SS
105 phys_addr_t min_addr, phys_addr_t max_addr, int nid);
106void __memblock_free_early(phys_addr_t base, phys_addr_t size);
107void __memblock_free_late(phys_addr_t base, phys_addr_t size);
108
eb31d559 109static inline void * __init memblock_alloc(
26f09e9b
SS
110 phys_addr_t size, phys_addr_t align)
111{
eb31d559 112 return memblock_alloc_try_nid(size, align, BOOTMEM_LOW_LIMIT,
26f09e9b
SS
113 BOOTMEM_ALLOC_ACCESSIBLE,
114 NUMA_NO_NODE);
115}
116
eb31d559 117static inline void * __init memblock_alloc_raw(
ea1f5f37
PT
118 phys_addr_t size, phys_addr_t align)
119{
eb31d559 120 return memblock_alloc_try_nid_raw(size, align, BOOTMEM_LOW_LIMIT,
ea1f5f37
PT
121 BOOTMEM_ALLOC_ACCESSIBLE,
122 NUMA_NO_NODE);
123}
124
eb31d559 125static inline void * __init memblock_alloc_nopanic(
26f09e9b
SS
126 phys_addr_t size, phys_addr_t align)
127{
eb31d559 128 return memblock_alloc_try_nid_nopanic(size, align,
26f09e9b
SS
129 BOOTMEM_LOW_LIMIT,
130 BOOTMEM_ALLOC_ACCESSIBLE,
131 NUMA_NO_NODE);
132}
133
eb31d559 134static inline void * __init memblock_alloc_low(
ad6492b8
YL
135 phys_addr_t size, phys_addr_t align)
136{
eb31d559 137 return memblock_alloc_try_nid(size, align,
ad6492b8
YL
138 BOOTMEM_LOW_LIMIT,
139 ARCH_LOW_ADDRESS_LIMIT,
140 NUMA_NO_NODE);
141}
eb31d559 142static inline void * __init memblock_alloc_low_nopanic(
ad6492b8
YL
143 phys_addr_t size, phys_addr_t align)
144{
eb31d559 145 return memblock_alloc_try_nid_nopanic(size, align,
ad6492b8
YL
146 BOOTMEM_LOW_LIMIT,
147 ARCH_LOW_ADDRESS_LIMIT,
148 NUMA_NO_NODE);
149}
150
eb31d559 151static inline void * __init memblock_alloc_from_nopanic(
26f09e9b
SS
152 phys_addr_t size, phys_addr_t align, phys_addr_t min_addr)
153{
eb31d559 154 return memblock_alloc_try_nid_nopanic(size, align, min_addr,
26f09e9b
SS
155 BOOTMEM_ALLOC_ACCESSIBLE,
156 NUMA_NO_NODE);
157}
158
eb31d559 159static inline void * __init memblock_alloc_node(
3913c8f9 160 phys_addr_t size, phys_addr_t align, int nid)
26f09e9b 161{
3913c8f9 162 return memblock_alloc_try_nid(size, align, BOOTMEM_LOW_LIMIT,
26f09e9b
SS
163 BOOTMEM_ALLOC_ACCESSIBLE, nid);
164}
165
eb31d559 166static inline void * __init memblock_alloc_node_nopanic(
26f09e9b
SS
167 phys_addr_t size, int nid)
168{
eb31d559 169 return memblock_alloc_try_nid_nopanic(size, 0, BOOTMEM_LOW_LIMIT,
26f09e9b
SS
170 BOOTMEM_ALLOC_ACCESSIBLE,
171 nid);
172}
173
174static inline void __init memblock_free_early(
175 phys_addr_t base, phys_addr_t size)
176{
177 __memblock_free_early(base, size);
178}
179
180static inline void __init memblock_free_early_nid(
181 phys_addr_t base, phys_addr_t size, int nid)
182{
183 __memblock_free_early(base, size);
184}
185
186static inline void __init memblock_free_late(
187 phys_addr_t base, phys_addr_t size)
188{
189 __memblock_free_late(base, size);
190}
191
f71bf0ca
FBH
192extern void *alloc_large_system_hash(const char *tablename,
193 unsigned long bucketsize,
194 unsigned long numentries,
195 int scale,
196 int flags,
197 unsigned int *_hash_shift,
198 unsigned int *_hash_mask,
31fe62b9
TB
199 unsigned long low_limit,
200 unsigned long high_limit);
1da177e4 201
04903664 202#define HASH_EARLY 0x00000001 /* Allocating during early boot? */
2c85f51d
JB
203#define HASH_SMALL 0x00000002 /* sub-page allocation allowed, min
204 * shift passed via *_hash_shift */
3749a8f0 205#define HASH_ZERO 0x00000004 /* Zero allocated hash table */
1da177e4 206
c2fdf3a9
AB
207/* Only NUMA needs hash distribution. 64bit NUMA architectures have
208 * sufficient vmalloc space.
1da177e4 209 */
a9919c79
RV
210#ifdef CONFIG_NUMA
211#define HASHDIST_DEFAULT IS_ENABLED(CONFIG_64BIT)
212extern int hashdist; /* Distribute hashes across NUMA nodes? */
1da177e4 213#else
a9919c79 214#define hashdist (0)
1da177e4 215#endif
1da177e4
LT
216
217
218#endif /* _LINUX_BOOTMEM_H */