slab.h 9.5 KB
Newer Older
L
Linus Torvalds 已提交
1
/*
2
 * linux/include/linux/slab.h
L
Linus Torvalds 已提交
3 4 5 6 7 8 9 10 11
 * Written by Mark Hemment, 1996.
 * (markhe@nextd.demon.co.uk)
 */

#ifndef _LINUX_SLAB_H
#define	_LINUX_SLAB_H

#if	defined(__KERNEL__)

12
/* kmem_cache_t exists for legacy reasons and is not used by code in mm */
13
typedef struct kmem_cache kmem_cache_t;
L
Linus Torvalds 已提交
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41

#include	<linux/gfp.h>
#include	<linux/init.h>
#include	<linux/types.h>
#include	<asm/page.h>		/* kmalloc_sizes.h needs PAGE_SIZE */
#include	<asm/cache.h>		/* kmalloc_sizes.h needs L1_CACHE_BYTES */

/* flags for kmem_cache_alloc() */
#define	SLAB_ATOMIC		GFP_ATOMIC
#define	SLAB_KERNEL		GFP_KERNEL
#define	SLAB_DMA		GFP_DMA

/* flags to pass to kmem_cache_create().
 * The first 3 are only valid when the allocator as been build
 * SLAB_DEBUG_SUPPORT.
 */
#define	SLAB_DEBUG_FREE		0x00000100UL	/* Peform (expensive) checks on free */
#define	SLAB_DEBUG_INITIAL	0x00000200UL	/* Call constructor (as verifier) */
#define	SLAB_RED_ZONE		0x00000400UL	/* Red zone objs in a cache */
#define	SLAB_POISON		0x00000800UL	/* Poison objects */
#define	SLAB_HWCACHE_ALIGN	0x00002000UL	/* align objs on a h/w cache lines */
#define SLAB_CACHE_DMA		0x00004000UL	/* use GFP_DMA memory */
#define SLAB_MUST_HWCACHE_ALIGN	0x00008000UL	/* force alignment */
#define SLAB_STORE_USER		0x00010000UL	/* store the last owner for bug hunting */
#define SLAB_RECLAIM_ACCOUNT	0x00020000UL	/* track pages allocated to indicate
						   what is reclaimable later*/
#define SLAB_PANIC		0x00040000UL	/* panic if kmem_cache_create() fails */
#define SLAB_DESTROY_BY_RCU	0x00080000UL	/* defer freeing pages to RCU */
42
#define SLAB_MEM_SPREAD		0x00100000UL	/* Spread some memory over cpuset */
L
Linus Torvalds 已提交
43 44 45 46 47 48

/* flags passed to a constructor func */
#define	SLAB_CTOR_CONSTRUCTOR	0x001UL		/* if not set, then deconstructor */
#define SLAB_CTOR_ATOMIC	0x002UL		/* tell constructor it can't sleep */
#define	SLAB_CTOR_VERIFY	0x004UL		/* tell constructor it's a verify call */

49 50
#ifndef CONFIG_SLOB

L
Linus Torvalds 已提交
51 52 53
/* prototypes */
extern void __init kmem_cache_init(void);

54 55 56 57 58 59 60
extern struct kmem_cache *kmem_cache_create(const char *, size_t, size_t,
			unsigned long,
			void (*)(void *, struct kmem_cache *, unsigned long),
			void (*)(void *, struct kmem_cache *, unsigned long));
extern void kmem_cache_destroy(struct kmem_cache *);
extern int kmem_cache_shrink(struct kmem_cache *);
extern void *kmem_cache_alloc(struct kmem_cache *, gfp_t);
61
extern void *kmem_cache_zalloc(struct kmem_cache *, gfp_t);
62 63 64
extern void kmem_cache_free(struct kmem_cache *, void *);
extern unsigned int kmem_cache_size(struct kmem_cache *);
extern const char *kmem_cache_name(struct kmem_cache *);
L
Linus Torvalds 已提交
65 66 67

/* Size description struct for general caches. */
struct cache_sizes {
68 69 70
	size_t		 	cs_size;
	struct kmem_cache	*cs_cachep;
	struct kmem_cache	*cs_dmacachep;
L
Linus Torvalds 已提交
71 72
};
extern struct cache_sizes malloc_sizes[];
73

A
Al Viro 已提交
74
extern void *__kmalloc(size_t, gfp_t);
L
Linus Torvalds 已提交
75

76 77 78 79 80 81 82 83 84 85 86 87 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
/**
 * kmalloc - allocate memory
 * @size: how many bytes of memory are required.
 * @flags: the type of memory to allocate.
 *
 * kmalloc is the normal method of allocating memory
 * in the kernel.
 *
 * The @flags argument may be one of:
 *
 * %GFP_USER - Allocate memory on behalf of user.  May sleep.
 *
 * %GFP_KERNEL - Allocate normal kernel ram.  May sleep.
 *
 * %GFP_ATOMIC - Allocation will not sleep.
 *   For example, use this inside interrupt handlers.
 *
 * %GFP_HIGHUSER - Allocate pages from high memory.
 *
 * %GFP_NOIO - Do not do any I/O at all while trying to get memory.
 *
 * %GFP_NOFS - Do not make any fs calls while trying to get memory.
 *
 * Also it is possible to set different flags by OR'ing
 * in one or more of the following additional @flags:
 *
 * %__GFP_COLD - Request cache-cold pages instead of
 *   trying to return cache-warm pages.
 *
 * %__GFP_DMA - Request memory from the DMA-capable zone.
 *
 * %__GFP_HIGH - This allocation has high priority and may use emergency pools.
 *
 * %__GFP_HIGHMEM - Allocated memory may be from highmem.
 *
 * %__GFP_NOFAIL - Indicate that this allocation is in no way allowed to fail
 *   (think twice before using).
 *
 * %__GFP_NORETRY - If memory is not immediately available,
 *   then give up at once.
 *
 * %__GFP_NOWARN - If allocation fails, don't issue any warnings.
 *
 * %__GFP_REPEAT - If allocation fails initially, try once more before failing.
 */
A
Al Viro 已提交
121
static inline void *kmalloc(size_t size, gfp_t flags)
L
Linus Torvalds 已提交
122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
{
	if (__builtin_constant_p(size)) {
		int i = 0;
#define CACHE(x) \
		if (size <= x) \
			goto found; \
		else \
			i++;
#include "kmalloc_sizes.h"
#undef CACHE
		{
			extern void __you_cannot_kmalloc_that_much(void);
			__you_cannot_kmalloc_that_much();
		}
found:
		return kmem_cache_alloc((flags & GFP_DMA) ?
			malloc_sizes[i].cs_dmacachep :
			malloc_sizes[i].cs_cachep, flags);
	}
	return __kmalloc(size, flags);
}

144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
/*
 * kmalloc_track_caller is a special version of kmalloc that records the
 * calling function of the routine calling it for slab leak tracking instead
 * of just the calling function (confusing, eh?).
 * It's useful when the call to kmalloc comes from a widely-used standard
 * allocator where we care about the real place the memory allocation
 * request comes from.
 */
#ifndef CONFIG_DEBUG_SLAB
#define kmalloc_track_caller(size, flags) \
	__kmalloc(size, flags)
#else
extern void *__kmalloc_track_caller(size_t, gfp_t, void*);
#define kmalloc_track_caller(size, flags) \
	__kmalloc_track_caller(size, flags, __builtin_return_address(0))
#endif

161 162
extern void *__kzalloc(size_t, gfp_t);

163 164 165 166 167
/**
 * kzalloc - allocate memory. The memory is set to zero.
 * @size: how many bytes of memory are required.
 * @flags: the type of memory to allocate (see kmalloc).
 */
168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189
static inline void *kzalloc(size_t size, gfp_t flags)
{
	if (__builtin_constant_p(size)) {
		int i = 0;
#define CACHE(x) \
		if (size <= x) \
			goto found; \
		else \
			i++;
#include "kmalloc_sizes.h"
#undef CACHE
		{
			extern void __you_cannot_kzalloc_that_much(void);
			__you_cannot_kzalloc_that_much();
		}
found:
		return kmem_cache_zalloc((flags & GFP_DMA) ?
			malloc_sizes[i].cs_dmacachep :
			malloc_sizes[i].cs_cachep, flags);
	}
	return __kzalloc(size, flags);
}
190 191 192 193 194 195 196

/**
 * kcalloc - allocate memory for an array. The memory is set to zero.
 * @n: number of elements.
 * @size: element size.
 * @flags: the type of memory to allocate.
 */
A
Al Viro 已提交
197
static inline void *kcalloc(size_t n, size_t size, gfp_t flags)
198
{
199
	if (n != 0 && size > ULONG_MAX / n)
200 201 202 203
		return NULL;
	return kzalloc(n * size, flags);
}

L
Linus Torvalds 已提交
204 205
extern void kfree(const void *);
extern unsigned int ksize(const void *);
206
extern int slab_is_available(void);
L
Linus Torvalds 已提交
207

208
#ifdef CONFIG_NUMA
209
extern void *kmem_cache_alloc_node(struct kmem_cache *, gfp_t flags, int node);
210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233
extern void *__kmalloc_node(size_t size, gfp_t flags, int node);

static inline void *kmalloc_node(size_t size, gfp_t flags, int node)
{
	if (__builtin_constant_p(size)) {
		int i = 0;
#define CACHE(x) \
		if (size <= x) \
			goto found; \
		else \
			i++;
#include "kmalloc_sizes.h"
#undef CACHE
		{
			extern void __you_cannot_kmalloc_that_much(void);
			__you_cannot_kmalloc_that_much();
		}
found:
		return kmem_cache_alloc_node((flags & GFP_DMA) ?
			malloc_sizes[i].cs_dmacachep :
			malloc_sizes[i].cs_cachep, flags, node);
	}
	return __kmalloc_node(size, flags, node);
}
234 235 236 237 238 239 240 241 242 243 244 245

/*
 * kmalloc_node_track_caller is a special version of kmalloc_node that
 * records the calling function of the routine calling it for slab leak
 * tracking instead of just the calling function (confusing, eh?).
 * It's useful when the call to kmalloc_node comes from a widely-used
 * standard allocator where we care about the real place the memory
 * allocation request comes from.
 */
#ifndef CONFIG_DEBUG_SLAB
#define kmalloc_node_track_caller(size, flags, node) \
	__kmalloc_node(size, flags, node)
246
#else
247 248 249 250 251 252
extern void *__kmalloc_node_track_caller(size_t, gfp_t, int, void *);
#define kmalloc_node_track_caller(size, flags, node) \
	__kmalloc_node_track_caller(size, flags, node, \
			__builtin_return_address(0))
#endif
#else /* CONFIG_NUMA */
253 254
static inline void *kmem_cache_alloc_node(struct kmem_cache *cachep,
					gfp_t flags, int node)
255 256 257
{
	return kmem_cache_alloc(cachep, flags);
}
A
Al Viro 已提交
258
static inline void *kmalloc_node(size_t size, gfp_t flags, int node)
259 260 261
{
	return kmalloc(size, flags);
}
262 263 264

#define kmalloc_node_track_caller(size, flags, node) \
	kmalloc_track_caller(size, flags)
265 266
#endif

L
Linus Torvalds 已提交
267
extern int FASTCALL(kmem_cache_reap(int));
268
extern int FASTCALL(kmem_ptr_validate(struct kmem_cache *cachep, void *ptr));
L
Linus Torvalds 已提交
269

270 271 272 273 274 275 276 277 278
#else /* CONFIG_SLOB */

/* SLOB allocator routines */

void kmem_cache_init(void);
struct kmem_cache *kmem_cache_create(const char *c, size_t, size_t,
	unsigned long,
	void (*)(void *, struct kmem_cache *, unsigned long),
	void (*)(void *, struct kmem_cache *, unsigned long));
279
void kmem_cache_destroy(struct kmem_cache *c);
280
void *kmem_cache_alloc(struct kmem_cache *c, gfp_t flags);
281
void *kmem_cache_zalloc(struct kmem_cache *, gfp_t);
282 283 284
void kmem_cache_free(struct kmem_cache *c, void *b);
const char *kmem_cache_name(struct kmem_cache *);
void *kmalloc(size_t size, gfp_t flags);
285
void *__kzalloc(size_t size, gfp_t flags);
286 287 288 289 290 291
void kfree(const void *m);
unsigned int ksize(const void *m);
unsigned int kmem_cache_size(struct kmem_cache *c);

static inline void *kcalloc(size_t n, size_t size, gfp_t flags)
{
292
	return __kzalloc(n * size, flags);
293 294 295 296 297 298 299
}

#define kmem_cache_shrink(d) (0)
#define kmem_cache_reap(a)
#define kmem_ptr_validate(a, b) (0)
#define kmem_cache_alloc_node(c, f, n) kmem_cache_alloc(c, f)
#define kmalloc_node(s, f, n) kmalloc(s, f)
300
#define kzalloc(s, f) __kzalloc(s, f)
301
#define kmalloc_track_caller kmalloc
302

303 304
#define kmalloc_node_track_caller kmalloc_node

305 306
#endif /* CONFIG_SLOB */

L
Linus Torvalds 已提交
307 308 309
#endif	/* __KERNEL__ */

#endif	/* _LINUX_SLAB_H */