slab_def.h 2.2 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
#ifndef _LINUX_SLAB_DEF_H
#define	_LINUX_SLAB_DEF_H

/*
 * Definitions unique to the original Linux SLAB allocator.
 *
 * What we provide here is a way to optimize the frequent kmalloc
 * calls in the kernel by selecting the appropriate general cache
 * if kmalloc was called with a size that can be established at
 * compile time.
 */

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

/* Size description struct for general caches. */
struct cache_sizes {
	size_t		 	cs_size;
	struct kmem_cache	*cs_cachep;
22
#ifdef CONFIG_ZONE_DMA
23
	struct kmem_cache	*cs_dmacachep;
24
#endif
25 26 27
};
extern struct cache_sizes malloc_sizes[];

P
Paul Mundt 已提交
28 29 30
void *kmem_cache_alloc(struct kmem_cache *, gfp_t);
void *__kmalloc(size_t size, gfp_t flags);

31 32 33 34
static inline void *kmalloc(size_t size, gfp_t flags)
{
	if (__builtin_constant_p(size)) {
		int i = 0;
35 36 37 38

		if (!size)
			return ZERO_SIZE_PTR;

39 40 41 42 43
#define CACHE(x) \
		if (size <= x) \
			goto found; \
		else \
			i++;
44
#include <linux/kmalloc_sizes.h>
45 46 47 48 49 50
#undef CACHE
		{
			extern void __you_cannot_kmalloc_that_much(void);
			__you_cannot_kmalloc_that_much();
		}
found:
51 52 53 54 55 56
#ifdef CONFIG_ZONE_DMA
		if (flags & GFP_DMA)
			return kmem_cache_alloc(malloc_sizes[i].cs_dmacachep,
						flags);
#endif
		return kmem_cache_alloc(malloc_sizes[i].cs_cachep, flags);
57 58 59 60 61 62
	}
	return __kmalloc(size, flags);
}

#ifdef CONFIG_NUMA
extern void *__kmalloc_node(size_t size, gfp_t flags, int node);
P
Paul Mundt 已提交
63
extern void *kmem_cache_alloc_node(struct kmem_cache *, gfp_t flags, int node);
64 65 66 67 68

static inline void *kmalloc_node(size_t size, gfp_t flags, int node)
{
	if (__builtin_constant_p(size)) {
		int i = 0;
69 70 71 72

		if (!size)
			return ZERO_SIZE_PTR;

73 74 75 76 77
#define CACHE(x) \
		if (size <= x) \
			goto found; \
		else \
			i++;
78
#include <linux/kmalloc_sizes.h>
79 80 81 82 83 84
#undef CACHE
		{
			extern void __you_cannot_kmalloc_that_much(void);
			__you_cannot_kmalloc_that_much();
		}
found:
85 86 87 88 89 90 91
#ifdef CONFIG_ZONE_DMA
		if (flags & GFP_DMA)
			return kmem_cache_alloc_node(malloc_sizes[i].cs_dmacachep,
						flags, node);
#endif
		return kmem_cache_alloc_node(malloc_sizes[i].cs_cachep,
						flags, node);
92 93 94 95 96 97 98
	}
	return __kmalloc_node(size, flags, node);
}

#endif	/* CONFIG_NUMA */

#endif	/* _LINUX_SLAB_DEF_H */