123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- #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;
- #ifdef CONFIG_ZONE_DMA
- struct kmem_cache *cs_dmacachep;
- #endif
- };
- extern struct cache_sizes malloc_sizes[];
- static inline void *kmalloc(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_kmalloc_that_much(void);
- __you_cannot_kmalloc_that_much();
- }
- found:
- #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);
- }
- return __kmalloc(size, flags);
- }
- 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:
- #ifdef CONFIG_ZONE_DMA
- if (flags & GFP_DMA)
- return kmem_cache_zalloc(malloc_sizes[i].cs_dmacachep,
- flags);
- #endif
- return kmem_cache_zalloc(malloc_sizes[i].cs_cachep, flags);
- }
- return __kzalloc(size, flags);
- }
- #ifdef CONFIG_NUMA
- 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:
- #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);
- }
- return __kmalloc_node(size, flags, node);
- }
- #endif /* CONFIG_NUMA */
- #endif /* _LINUX_SLAB_DEF_H */
|