slab.h 7.9 KB
Newer Older
L
Linus Torvalds 已提交
1
/*
2 3 4 5 6
 * Written by Mark Hemment, 1996 (markhe@nextd.demon.co.uk).
 *
 * (C) SGI 2006, Christoph Lameter <clameter@sgi.com>
 * 	Cleaned up and restructured to ease the addition of alternative
 * 	implementations of SLAB allocators.
L
Linus Torvalds 已提交
7 8 9 10 11
 */

#ifndef _LINUX_SLAB_H
#define	_LINUX_SLAB_H

12
#ifdef __KERNEL__
L
Linus Torvalds 已提交
13

14 15
#include <linux/gfp.h>
#include <linux/types.h>
L
Linus Torvalds 已提交
16

17 18 19
/*
 * Flags to pass to kmem_cache_create().
 * The ones marked DEBUG are only valid if CONFIG_SLAB_DEBUG is set.
L
Linus Torvalds 已提交
20
 */
C
Christoph Lameter 已提交
21 22 23 24
#define SLAB_DEBUG_FREE		0x00000100UL	/* DEBUG: Perform (expensive) checks on free */
#define SLAB_RED_ZONE		0x00000400UL	/* DEBUG: Red zone objs in a cache */
#define SLAB_POISON		0x00000800UL	/* DEBUG: Poison objects */
#define SLAB_HWCACHE_ALIGN	0x00002000UL	/* Align objs on cache lines */
25 26 27 28 29
#define SLAB_CACHE_DMA		0x00004000UL	/* Use GFP_DMA memory */
#define SLAB_STORE_USER		0x00010000UL	/* DEBUG: Store the last owner for bug hunting */
#define SLAB_RECLAIM_ACCOUNT	0x00020000UL	/* Objects are reclaimable */
#define SLAB_PANIC		0x00040000UL	/* Panic if kmem_cache_create() fails */
#define SLAB_DESTROY_BY_RCU	0x00080000UL	/* Defer freeing slabs to RCU */
30
#define SLAB_MEM_SPREAD		0x00100000UL	/* Spread some memory over cpuset */
C
Christoph Lameter 已提交
31
#define SLAB_TRACE		0x00200000UL	/* Trace allocations and frees */
L
Linus Torvalds 已提交
32

33 34 35 36
/*
 * struct kmem_cache related prototypes
 */
void __init kmem_cache_init(void);
C
Christoph Lameter 已提交
37
int slab_is_available(void);
L
Linus Torvalds 已提交
38

39
struct kmem_cache *kmem_cache_create(const char *, size_t, size_t,
40 41 42
			unsigned long,
			void (*)(void *, struct kmem_cache *, unsigned long),
			void (*)(void *, struct kmem_cache *, unsigned long));
43 44 45 46 47 48 49
void kmem_cache_destroy(struct kmem_cache *);
int kmem_cache_shrink(struct kmem_cache *);
void *kmem_cache_alloc(struct kmem_cache *, gfp_t);
void *kmem_cache_zalloc(struct kmem_cache *, gfp_t);
void kmem_cache_free(struct kmem_cache *, void *);
unsigned int kmem_cache_size(struct kmem_cache *);
const char *kmem_cache_name(struct kmem_cache *);
C
Christoph Lameter 已提交
50
int kmem_ptr_validate(struct kmem_cache *cachep, const void *ptr);
51

52 53 54 55 56 57 58 59 60 61 62 63
/*
 * Please use this macro to create slab caches. Simply specify the
 * name of the structure and maybe some flags that are listed above.
 *
 * The alignment of the struct determines object alignment. If you
 * f.e. add ____cacheline_aligned_in_smp to the struct declaration
 * then the objects will be properly aligned in SMP configurations.
 */
#define KMEM_CACHE(__struct, __flags) kmem_cache_create(#__struct,\
		sizeof(struct __struct), __alignof__(struct __struct),\
		(__flags), NULL, NULL)

64 65 66 67 68 69 70 71 72 73
#ifdef CONFIG_NUMA
extern void *kmem_cache_alloc_node(struct kmem_cache *, gfp_t flags, int node);
#else
static inline void *kmem_cache_alloc_node(struct kmem_cache *cachep,
					gfp_t flags, int node)
{
	return kmem_cache_alloc(cachep, flags);
}
#endif

74 75 76 77 78 79 80 81 82
/*
 * The largest kmalloc size supported by the slab allocators is
 * 32 megabyte (2^25) or the maximum allocatable page order if that is
 * less than 32 MB.
 *
 * WARNING: Its not easy to increase this value since the allocators have
 * to do various tricks to work around compiler limitations in order to
 * ensure proper constant folding.
 */
83 84
#define KMALLOC_SHIFT_HIGH	((MAX_ORDER + PAGE_SHIFT - 1) <= 25 ? \
				(MAX_ORDER + PAGE_SHIFT - 1) : 25)
85 86 87 88

#define KMALLOC_MAX_SIZE	(1UL << KMALLOC_SHIFT_HIGH)
#define KMALLOC_MAX_ORDER	(KMALLOC_SHIFT_HIGH - PAGE_SHIFT)

89 90 91 92 93
/*
 * Common kmalloc functions provided by all allocators
 */
void *__kmalloc(size_t, gfp_t);
void *__kzalloc(size_t, gfp_t);
P
Pekka Enberg 已提交
94
void * __must_check krealloc(const void *, size_t, gfp_t);
95
void kfree(const void *);
P
Pekka Enberg 已提交
96
size_t ksize(const void *);
97 98 99 100 101 102 103 104 105 106 107 108 109

/**
 * 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.
 */
static inline void *kcalloc(size_t n, size_t size, gfp_t flags)
{
	if (n != 0 && size > ULONG_MAX / n)
		return NULL;
	return __kzalloc(n * size, flags);
}
L
Linus Torvalds 已提交
110

111 112 113 114 115
/*
 * Allocator specific definitions. These are mainly used to establish optimized
 * ways to convert kmalloc() calls to kmem_cache_alloc() invocations by selecting
 * the appropriate general cache at compile time.
 */
C
Christoph Lameter 已提交
116

C
Christoph Lameter 已提交
117 118 119 120
#if defined(CONFIG_SLAB) || defined(CONFIG_SLUB)
#ifdef CONFIG_SLUB
#include <linux/slub_def.h>
#else
121
#include <linux/slab_def.h>
C
Christoph Lameter 已提交
122
#endif /* !CONFIG_SLUB */
123
#else
C
Christoph Lameter 已提交
124

125 126 127 128 129
/*
 * Fallback definitions for an allocator not wanting to provide
 * its own optimized kmalloc definitions (like SLOB).
 */

130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174
/**
 * 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.
 */
C
Christoph Lameter 已提交
175
static inline void *kmalloc(size_t size, gfp_t flags)
L
Linus Torvalds 已提交
176 177 178 179
{
	return __kmalloc(size, flags);
}

180 181 182 183 184
/**
 * 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).
 */
C
Christoph Lameter 已提交
185
static inline void *kzalloc(size_t size, gfp_t flags)
186 187 188 189 190
{
	return __kzalloc(size, flags);
}
#endif

C
Christoph Lameter 已提交
191 192 193 194 195 196 197 198 199 200 201 202
#ifndef CONFIG_NUMA
static inline void *kmalloc_node(size_t size, gfp_t flags, int node)
{
	return kmalloc(size, flags);
}

static inline void *__kmalloc_node(size_t size, gfp_t flags, int node)
{
	return __kmalloc(size, flags);
}
#endif /* !CONFIG_NUMA */

203 204 205 206 207 208 209 210
/*
 * 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.
 */
C
Christoph Lameter 已提交
211
#if defined(CONFIG_DEBUG_SLAB) || defined(CONFIG_SLUB)
212 213 214
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))
215 216 217 218
#else
#define kmalloc_track_caller(size, flags) \
	__kmalloc(size, flags)
#endif /* DEBUG_SLAB */
L
Linus Torvalds 已提交
219

220
#ifdef CONFIG_NUMA
221 222 223 224 225 226 227 228
/*
 * 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.
 */
C
Christoph Lameter 已提交
229
#if defined(CONFIG_DEBUG_SLAB) || defined(CONFIG_SLUB)
230 231 232 233
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))
234 235 236
#else
#define kmalloc_node_track_caller(size, flags, node) \
	__kmalloc_node(size, flags, node)
237
#endif
238

239 240 241 242
#else /* CONFIG_NUMA */

#define kmalloc_node_track_caller(size, flags, node) \
	kmalloc_track_caller(size, flags)
243

C
Christoph Lameter 已提交
244
#endif /* DEBUG_SLAB */
245

L
Linus Torvalds 已提交
246 247
#endif	/* __KERNEL__ */
#endif	/* _LINUX_SLAB_H */
248