1
2
3
4
5
6
7#ifndef _LINUX_SLAB_H
8#define _LINUX_SLAB_H
9
10#if defined(__KERNEL__)
11
12typedef struct kmem_cache kmem_cache_t;
13
14#include <linux/gfp.h>
15#include <linux/init.h>
16#include <linux/types.h>
17#include <asm/page.h>
18#include <asm/cache.h>
19
20
21#define SLAB_NOFS GFP_NOFS
22#define SLAB_NOIO GFP_NOIO
23#define SLAB_ATOMIC GFP_ATOMIC
24#define SLAB_USER GFP_USER
25#define SLAB_KERNEL GFP_KERNEL
26#define SLAB_DMA GFP_DMA
27
28#define SLAB_LEVEL_MASK GFP_LEVEL_MASK
29
30#define SLAB_NO_GROW __GFP_NO_GROW
31
32
33
34
35
36#define SLAB_DEBUG_FREE 0x00000100UL
37#define SLAB_DEBUG_INITIAL 0x00000200UL
38#define SLAB_RED_ZONE 0x00000400UL
39#define SLAB_POISON 0x00000800UL
40#define SLAB_HWCACHE_ALIGN 0x00002000UL
41#define SLAB_CACHE_DMA 0x00004000UL
42#define SLAB_MUST_HWCACHE_ALIGN 0x00008000UL
43#define SLAB_STORE_USER 0x00010000UL
44#define SLAB_RECLAIM_ACCOUNT 0x00020000UL
45
46#define SLAB_PANIC 0x00040000UL
47#define SLAB_DESTROY_BY_RCU 0x00080000UL
48#define SLAB_MEM_SPREAD 0x00100000UL
49
50
51#define SLAB_CTOR_CONSTRUCTOR 0x001UL
52#define SLAB_CTOR_ATOMIC 0x002UL
53#define SLAB_CTOR_VERIFY 0x004UL
54
55#ifndef CONFIG_SLOB
56
57
58extern void __init kmem_cache_init(void);
59
60extern kmem_cache_t *kmem_cache_create(const char *, size_t, size_t, unsigned long,
61 void (*)(void *, kmem_cache_t *, unsigned long),
62 void (*)(void *, kmem_cache_t *, unsigned long));
63extern int kmem_cache_destroy(kmem_cache_t *);
64extern int kmem_cache_shrink(kmem_cache_t *);
65extern void *kmem_cache_alloc(kmem_cache_t *, gfp_t);
66extern void *kmem_cache_zalloc(struct kmem_cache *, gfp_t);
67extern void kmem_cache_free(kmem_cache_t *, void *);
68extern unsigned int kmem_cache_size(kmem_cache_t *);
69extern const char *kmem_cache_name(kmem_cache_t *);
70extern kmem_cache_t *kmem_find_general_cachep(size_t size, gfp_t gfpflags);
71
72
73struct cache_sizes {
74 size_t cs_size;
75 kmem_cache_t *cs_cachep;
76 kmem_cache_t *cs_dmacachep;
77};
78extern struct cache_sizes malloc_sizes[];
79
80extern void *__kmalloc(size_t, gfp_t);
81#ifndef CONFIG_DEBUG_SLAB
82#define ____kmalloc(size, flags) __kmalloc(size, flags)
83#else
84extern void *__kmalloc_track_caller(size_t, gfp_t, void*);
85#define ____kmalloc(size, flags) \
86 __kmalloc_track_caller(size, flags, __builtin_return_address(0))
87#endif
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134static inline void *kmalloc(size_t size, gfp_t flags)
135{
136 if (__builtin_constant_p(size)) {
137 int i = 0;
138#define CACHE(x) \
139 if (size <= x) \
140 goto found; \
141 else \
142 i++;
143#include "kmalloc_sizes.h"
144#undef CACHE
145 {
146 extern void __you_cannot_kmalloc_that_much(void);
147 __you_cannot_kmalloc_that_much();
148 }
149found:
150 return kmem_cache_alloc((flags & GFP_DMA) ?
151 malloc_sizes[i].cs_dmacachep :
152 malloc_sizes[i].cs_cachep, flags);
153 }
154 return __kmalloc(size, flags);
155}
156
157extern void *__kzalloc(size_t, gfp_t);
158
159
160
161
162
163
164static inline void *kzalloc(size_t size, gfp_t flags)
165{
166 if (__builtin_constant_p(size)) {
167 int i = 0;
168#define CACHE(x) \
169 if (size <= x) \
170 goto found; \
171 else \
172 i++;
173#include "kmalloc_sizes.h"
174#undef CACHE
175 {
176 extern void __you_cannot_kzalloc_that_much(void);
177 __you_cannot_kzalloc_that_much();
178 }
179found:
180 return kmem_cache_zalloc((flags & GFP_DMA) ?
181 malloc_sizes[i].cs_dmacachep :
182 malloc_sizes[i].cs_cachep, flags);
183 }
184 return __kzalloc(size, flags);
185}
186
187
188
189
190
191
192
193static inline void *kcalloc(size_t n, size_t size, gfp_t flags)
194{
195 if (n != 0 && size > ULONG_MAX / n)
196 return NULL;
197 return kzalloc(n * size, flags);
198}
199
200extern void kfree(const void *);
201extern unsigned int ksize(const void *);
202extern int slab_is_available(void);
203
204#ifdef CONFIG_NUMA
205extern void *kmem_cache_alloc_node(kmem_cache_t *, gfp_t flags, int node);
206extern void *kmalloc_node(size_t size, gfp_t flags, int node);
207#else
208static inline void *kmem_cache_alloc_node(kmem_cache_t *cachep, gfp_t flags, int node)
209{
210 return kmem_cache_alloc(cachep, flags);
211}
212static inline void *kmalloc_node(size_t size, gfp_t flags, int node)
213{
214 return kmalloc(size, flags);
215}
216#endif
217
218extern int FASTCALL(kmem_cache_reap(int));
219extern int FASTCALL(kmem_ptr_validate(kmem_cache_t *cachep, void *ptr));
220
221#else
222
223
224
225void kmem_cache_init(void);
226struct kmem_cache *kmem_find_general_cachep(size_t, gfp_t gfpflags);
227struct kmem_cache *kmem_cache_create(const char *c, size_t, size_t,
228 unsigned long,
229 void (*)(void *, struct kmem_cache *, unsigned long),
230 void (*)(void *, struct kmem_cache *, unsigned long));
231int kmem_cache_destroy(struct kmem_cache *c);
232void *kmem_cache_alloc(struct kmem_cache *c, gfp_t flags);
233void *kmem_cache_zalloc(struct kmem_cache *, gfp_t);
234void kmem_cache_free(struct kmem_cache *c, void *b);
235const char *kmem_cache_name(struct kmem_cache *);
236void *kmalloc(size_t size, gfp_t flags);
237void *__kzalloc(size_t size, gfp_t flags);
238void kfree(const void *m);
239unsigned int ksize(const void *m);
240unsigned int kmem_cache_size(struct kmem_cache *c);
241
242static inline void *kcalloc(size_t n, size_t size, gfp_t flags)
243{
244 return __kzalloc(n * size, flags);
245}
246
247#define kmem_cache_shrink(d) (0)
248#define kmem_cache_reap(a)
249#define kmem_ptr_validate(a, b) (0)
250#define kmem_cache_alloc_node(c, f, n) kmem_cache_alloc(c, f)
251#define kmalloc_node(s, f, n) kmalloc(s, f)
252#define kzalloc(s, f) __kzalloc(s, f)
253#define ____kmalloc kmalloc
254
255#endif
256
257
258extern kmem_cache_t *vm_area_cachep;
259extern kmem_cache_t *names_cachep;
260extern kmem_cache_t *files_cachep;
261extern kmem_cache_t *filp_cachep;
262extern kmem_cache_t *fs_cachep;
263extern kmem_cache_t *sighand_cachep;
264extern kmem_cache_t *bio_cachep;
265
266extern atomic_t slab_reclaim_pages;
267
268#endif
269
270#endif
271