1#ifndef _LINUX_SLAB_DEF_H 2#define _LINUX_SLAB_DEF_H 3 4/* 5 * Definitions unique to the original Linux SLAB allocator. 6 * 7 * What we provide here is a way to optimize the frequent kmalloc 8 * calls in the kernel by selecting the appropriate general cache 9 * if kmalloc was called with a size that can be established at 10 * compile time. 11 */ 12 13#include <linux/init.h> 14#include <asm/page.h> /* kmalloc_sizes.h needs PAGE_SIZE */ 15#include <asm/cache.h> /* kmalloc_sizes.h needs L1_CACHE_BYTES */ 16#include <linux/compiler.h> 17 18/* Size description struct for general caches. */ 19struct cache_sizes { 20 size_t cs_size; 21 struct kmem_cache *cs_cachep; 22#ifdef CONFIG_ZONE_DMA 23 struct kmem_cache *cs_dmacachep; 24#endif 25}; 26extern struct cache_sizes malloc_sizes[]; 27 28static inline void *kmalloc(size_t size, gfp_t flags) 29{ 30 if (__builtin_constant_p(size)) { 31 int i = 0; 32#define CACHE(x) \ 33 if (size <= x) \ 34 goto found; \ 35 else \ 36 i++; 37#include "kmalloc_sizes.h" 38#undef CACHE 39 { 40 extern void __you_cannot_kmalloc_that_much(void); 41 __you_cannot_kmalloc_that_much(); 42 } 43found: 44#ifdef CONFIG_ZONE_DMA 45 if (flags & GFP_DMA) 46 return kmem_cache_alloc(malloc_sizes[i].cs_dmacachep, 47 flags); 48#endif 49 return kmem_cache_alloc(malloc_sizes[i].cs_cachep, flags); 50 } 51 return __kmalloc(size, flags); 52} 53 54static inline void *kzalloc(size_t size, gfp_t flags) 55{ 56 if (__builtin_constant_p(size)) { 57 int i = 0; 58#define CACHE(x) \ 59 if (size <= x) \ 60 goto found; \ 61 else \ 62 i++; 63#include "kmalloc_sizes.h" 64#undef CACHE 65 { 66 extern void __you_cannot_kzalloc_that_much(void); 67 __you_cannot_kzalloc_that_much(); 68 } 69found: 70#ifdef CONFIG_ZONE_DMA 71 if (flags & GFP_DMA) 72 return kmem_cache_zalloc(malloc_sizes[i].cs_dmacachep, 73 flags); 74#endif 75 return kmem_cache_zalloc(malloc_sizes[i].cs_cachep, flags); 76 } 77 return __kzalloc(size, flags); 78} 79 80#ifdef CONFIG_NUMA 81extern void *__kmalloc_node(size_t size, gfp_t flags, int node); 82 83static inline void *kmalloc_node(size_t size, gfp_t flags, int node) 84{ 85 if (__builtin_constant_p(size)) { 86 int i = 0; 87#define CACHE(x) \ 88 if (size <= x) \ 89 goto found; \ 90 else \ 91 i++; 92#include "kmalloc_sizes.h" 93#undef CACHE 94 { 95 extern void __you_cannot_kmalloc_that_much(void); 96 __you_cannot_kmalloc_that_much(); 97 } 98found: 99#ifdef CONFIG_ZONE_DMA 100 if (flags & GFP_DMA) 101 return kmem_cache_alloc_node(malloc_sizes[i].cs_dmacachep, 102 flags, node); 103#endif 104 return kmem_cache_alloc_node(malloc_sizes[i].cs_cachep, 105 flags, node); 106 } 107 return __kmalloc_node(size, flags, node); 108} 109 110#endif /* CONFIG_NUMA */ 111 112extern const struct seq_operations slabinfo_op; 113ssize_t slabinfo_write(struct file *, const char __user *, size_t, loff_t *); 114 115#endif /* _LINUX_SLAB_DEF_H */ 116