1#ifndef _LINUX_SLAB_DEF_H
2#define _LINUX_SLAB_DEF_H
3
4
5
6
7
8
9
10
11
12
13#include <linux/init.h>
14#include <asm/page.h>
15#include <asm/cache.h>
16#include <linux/compiler.h>
17
18
19
20
21
22
23
24struct kmem_cache {
25
26 unsigned int batchcount;
27 unsigned int limit;
28 unsigned int shared;
29
30 unsigned int buffer_size;
31 u32 reciprocal_buffer_size;
32
33
34 unsigned int flags;
35 unsigned int num;
36
37
38
39 unsigned int gfporder;
40
41
42 gfp_t gfpflags;
43
44 size_t colour;
45 unsigned int colour_off;
46 struct kmem_cache *slabp_cache;
47 unsigned int slab_size;
48 unsigned int dflags;
49
50
51 void (*ctor)(void *obj);
52
53
54 const char *name;
55 struct list_head next;
56
57
58#ifdef CONFIG_DEBUG_SLAB
59 unsigned long num_active;
60 unsigned long num_allocations;
61 unsigned long high_mark;
62 unsigned long grown;
63 unsigned long reaped;
64 unsigned long errors;
65 unsigned long max_freeable;
66 unsigned long node_allocs;
67 unsigned long node_frees;
68 unsigned long node_overflow;
69 atomic_t allochit;
70 atomic_t allocmiss;
71 atomic_t freehit;
72 atomic_t freemiss;
73
74
75
76
77
78
79
80 int obj_offset;
81 int obj_size;
82#endif
83
84
85
86
87
88
89
90
91
92 struct kmem_list3 **nodelists;
93 struct array_cache *array[NR_CPUS];
94
95
96
97};
98
99
100struct cache_sizes {
101 size_t cs_size;
102 struct kmem_cache *cs_cachep;
103#ifdef CONFIG_ZONE_DMA
104 struct kmem_cache *cs_dmacachep;
105#endif
106};
107extern struct cache_sizes malloc_sizes[];
108
109void *kmem_cache_alloc(struct kmem_cache *, gfp_t);
110void *__kmalloc(size_t size, gfp_t flags);
111
112#ifdef CONFIG_TRACING
113extern void *kmem_cache_alloc_trace(size_t size,
114 struct kmem_cache *cachep, gfp_t flags);
115extern size_t slab_buffer_size(struct kmem_cache *cachep);
116#else
117static __always_inline void *
118kmem_cache_alloc_trace(size_t size, struct kmem_cache *cachep, gfp_t flags)
119{
120 return kmem_cache_alloc(cachep, flags);
121}
122static inline size_t slab_buffer_size(struct kmem_cache *cachep)
123{
124 return 0;
125}
126#endif
127
128static __always_inline void *kmalloc(size_t size, gfp_t flags)
129{
130 struct kmem_cache *cachep;
131 void *ret;
132
133 if (__builtin_constant_p(size)) {
134 int i = 0;
135
136 if (!size)
137 return ZERO_SIZE_PTR;
138
139#define CACHE(x) \
140 if (size <= x) \
141 goto found; \
142 else \
143 i++;
144#include <linux/kmalloc_sizes.h>
145#undef CACHE
146 return NULL;
147found:
148#ifdef CONFIG_ZONE_DMA
149 if (flags & GFP_DMA)
150 cachep = malloc_sizes[i].cs_dmacachep;
151 else
152#endif
153 cachep = malloc_sizes[i].cs_cachep;
154
155 ret = kmem_cache_alloc_trace(size, cachep, flags);
156
157 return ret;
158 }
159 return __kmalloc(size, flags);
160}
161
162#ifdef CONFIG_NUMA
163extern void *__kmalloc_node(size_t size, gfp_t flags, int node);
164extern void *kmem_cache_alloc_node(struct kmem_cache *, gfp_t flags, int node);
165
166#ifdef CONFIG_TRACING
167extern void *kmem_cache_alloc_node_trace(size_t size,
168 struct kmem_cache *cachep,
169 gfp_t flags,
170 int nodeid);
171#else
172static __always_inline void *
173kmem_cache_alloc_node_trace(size_t size,
174 struct kmem_cache *cachep,
175 gfp_t flags,
176 int nodeid)
177{
178 return kmem_cache_alloc_node(cachep, flags, nodeid);
179}
180#endif
181
182static __always_inline void *kmalloc_node(size_t size, gfp_t flags, int node)
183{
184 struct kmem_cache *cachep;
185
186 if (__builtin_constant_p(size)) {
187 int i = 0;
188
189 if (!size)
190 return ZERO_SIZE_PTR;
191
192#define CACHE(x) \
193 if (size <= x) \
194 goto found; \
195 else \
196 i++;
197#include <linux/kmalloc_sizes.h>
198#undef CACHE
199 return NULL;
200found:
201#ifdef CONFIG_ZONE_DMA
202 if (flags & GFP_DMA)
203 cachep = malloc_sizes[i].cs_dmacachep;
204 else
205#endif
206 cachep = malloc_sizes[i].cs_cachep;
207
208 return kmem_cache_alloc_node_trace(size, cachep, flags, node);
209 }
210 return __kmalloc_node(size, flags, node);
211}
212
213#endif
214
215#endif
216