197d06609SChristoph Lameter #ifndef MM_SLAB_H 297d06609SChristoph Lameter #define MM_SLAB_H 397d06609SChristoph Lameter /* 497d06609SChristoph Lameter * Internal slab definitions 597d06609SChristoph Lameter */ 697d06609SChristoph Lameter 797d06609SChristoph Lameter /* 897d06609SChristoph Lameter * State of the slab allocator. 997d06609SChristoph Lameter * 1097d06609SChristoph Lameter * This is used to describe the states of the allocator during bootup. 1197d06609SChristoph Lameter * Allocators use this to gradually bootstrap themselves. Most allocators 1297d06609SChristoph Lameter * have the problem that the structures used for managing slab caches are 1397d06609SChristoph Lameter * allocated from slab caches themselves. 1497d06609SChristoph Lameter */ 1597d06609SChristoph Lameter enum slab_state { 1697d06609SChristoph Lameter DOWN, /* No slab functionality yet */ 1797d06609SChristoph Lameter PARTIAL, /* SLUB: kmem_cache_node available */ 1897d06609SChristoph Lameter PARTIAL_ARRAYCACHE, /* SLAB: kmalloc size for arraycache available */ 1997d06609SChristoph Lameter PARTIAL_L3, /* SLAB: kmalloc size for l3 struct available */ 2097d06609SChristoph Lameter UP, /* Slab caches usable but not all extras yet */ 2197d06609SChristoph Lameter FULL /* Everything is working */ 2297d06609SChristoph Lameter }; 2397d06609SChristoph Lameter 2497d06609SChristoph Lameter extern enum slab_state slab_state; 2597d06609SChristoph Lameter 2618004c5dSChristoph Lameter /* The slab cache mutex protects the management structures during changes */ 2718004c5dSChristoph Lameter extern struct mutex slab_mutex; 289b030cb8SChristoph Lameter 299b030cb8SChristoph Lameter /* The list of all slab caches on the system */ 3018004c5dSChristoph Lameter extern struct list_head slab_caches; 3118004c5dSChristoph Lameter 329b030cb8SChristoph Lameter /* The slab cache that manages slab cache information */ 339b030cb8SChristoph Lameter extern struct kmem_cache *kmem_cache; 349b030cb8SChristoph Lameter 3545906855SChristoph Lameter unsigned long calculate_alignment(unsigned long flags, 3645906855SChristoph Lameter unsigned long align, unsigned long size); 3745906855SChristoph Lameter 389b030cb8SChristoph Lameter /* Functions provided by the slab allocators */ 398a13a4ccSChristoph Lameter extern int __kmem_cache_create(struct kmem_cache *, unsigned long flags); 4097d06609SChristoph Lameter 4145530c44SChristoph Lameter extern struct kmem_cache *create_kmalloc_cache(const char *name, size_t size, 4245530c44SChristoph Lameter unsigned long flags); 4345530c44SChristoph Lameter extern void create_boot_cache(struct kmem_cache *, const char *name, 4445530c44SChristoph Lameter size_t size, unsigned long flags); 4545530c44SChristoph Lameter 46*2633d7a0SGlauber Costa struct mem_cgroup; 47cbb79694SChristoph Lameter #ifdef CONFIG_SLUB 48*2633d7a0SGlauber Costa struct kmem_cache * 49*2633d7a0SGlauber Costa __kmem_cache_alias(struct mem_cgroup *memcg, const char *name, size_t size, 50cbb79694SChristoph Lameter size_t align, unsigned long flags, void (*ctor)(void *)); 51cbb79694SChristoph Lameter #else 52*2633d7a0SGlauber Costa static inline struct kmem_cache * 53*2633d7a0SGlauber Costa __kmem_cache_alias(struct mem_cgroup *memcg, const char *name, size_t size, 54cbb79694SChristoph Lameter size_t align, unsigned long flags, void (*ctor)(void *)) 55cbb79694SChristoph Lameter { return NULL; } 56cbb79694SChristoph Lameter #endif 57cbb79694SChristoph Lameter 58cbb79694SChristoph Lameter 59d8843922SGlauber Costa /* Legal flag mask for kmem_cache_create(), for various configurations */ 60d8843922SGlauber Costa #define SLAB_CORE_FLAGS (SLAB_HWCACHE_ALIGN | SLAB_CACHE_DMA | SLAB_PANIC | \ 61d8843922SGlauber Costa SLAB_DESTROY_BY_RCU | SLAB_DEBUG_OBJECTS ) 62d8843922SGlauber Costa 63d8843922SGlauber Costa #if defined(CONFIG_DEBUG_SLAB) 64d8843922SGlauber Costa #define SLAB_DEBUG_FLAGS (SLAB_RED_ZONE | SLAB_POISON | SLAB_STORE_USER) 65d8843922SGlauber Costa #elif defined(CONFIG_SLUB_DEBUG) 66d8843922SGlauber Costa #define SLAB_DEBUG_FLAGS (SLAB_RED_ZONE | SLAB_POISON | SLAB_STORE_USER | \ 67d8843922SGlauber Costa SLAB_TRACE | SLAB_DEBUG_FREE) 68d8843922SGlauber Costa #else 69d8843922SGlauber Costa #define SLAB_DEBUG_FLAGS (0) 70d8843922SGlauber Costa #endif 71d8843922SGlauber Costa 72d8843922SGlauber Costa #if defined(CONFIG_SLAB) 73d8843922SGlauber Costa #define SLAB_CACHE_FLAGS (SLAB_MEM_SPREAD | SLAB_NOLEAKTRACE | \ 74d8843922SGlauber Costa SLAB_RECLAIM_ACCOUNT | SLAB_TEMPORARY | SLAB_NOTRACK) 75d8843922SGlauber Costa #elif defined(CONFIG_SLUB) 76d8843922SGlauber Costa #define SLAB_CACHE_FLAGS (SLAB_NOLEAKTRACE | SLAB_RECLAIM_ACCOUNT | \ 77d8843922SGlauber Costa SLAB_TEMPORARY | SLAB_NOTRACK) 78d8843922SGlauber Costa #else 79d8843922SGlauber Costa #define SLAB_CACHE_FLAGS (0) 80d8843922SGlauber Costa #endif 81d8843922SGlauber Costa 82d8843922SGlauber Costa #define CACHE_CREATE_MASK (SLAB_CORE_FLAGS | SLAB_DEBUG_FLAGS | SLAB_CACHE_FLAGS) 83d8843922SGlauber Costa 84945cf2b6SChristoph Lameter int __kmem_cache_shutdown(struct kmem_cache *); 85945cf2b6SChristoph Lameter 86b7454ad3SGlauber Costa struct seq_file; 87b7454ad3SGlauber Costa struct file; 88b7454ad3SGlauber Costa 890d7561c6SGlauber Costa struct slabinfo { 900d7561c6SGlauber Costa unsigned long active_objs; 910d7561c6SGlauber Costa unsigned long num_objs; 920d7561c6SGlauber Costa unsigned long active_slabs; 930d7561c6SGlauber Costa unsigned long num_slabs; 940d7561c6SGlauber Costa unsigned long shared_avail; 950d7561c6SGlauber Costa unsigned int limit; 960d7561c6SGlauber Costa unsigned int batchcount; 970d7561c6SGlauber Costa unsigned int shared; 980d7561c6SGlauber Costa unsigned int objects_per_slab; 990d7561c6SGlauber Costa unsigned int cache_order; 1000d7561c6SGlauber Costa }; 1010d7561c6SGlauber Costa 1020d7561c6SGlauber Costa void get_slabinfo(struct kmem_cache *s, struct slabinfo *sinfo); 1030d7561c6SGlauber Costa void slabinfo_show_stats(struct seq_file *m, struct kmem_cache *s); 104b7454ad3SGlauber Costa ssize_t slabinfo_write(struct file *file, const char __user *buffer, 105b7454ad3SGlauber Costa size_t count, loff_t *ppos); 106ba6c496eSGlauber Costa 107ba6c496eSGlauber Costa #ifdef CONFIG_MEMCG_KMEM 108ba6c496eSGlauber Costa static inline bool is_root_cache(struct kmem_cache *s) 109ba6c496eSGlauber Costa { 110ba6c496eSGlauber Costa return !s->memcg_params || s->memcg_params->is_root_cache; 111ba6c496eSGlauber Costa } 112*2633d7a0SGlauber Costa 113*2633d7a0SGlauber Costa static inline bool cache_match_memcg(struct kmem_cache *cachep, 114*2633d7a0SGlauber Costa struct mem_cgroup *memcg) 115*2633d7a0SGlauber Costa { 116*2633d7a0SGlauber Costa return (is_root_cache(cachep) && !memcg) || 117*2633d7a0SGlauber Costa (cachep->memcg_params->memcg == memcg); 118*2633d7a0SGlauber Costa } 119ba6c496eSGlauber Costa #else 120ba6c496eSGlauber Costa static inline bool is_root_cache(struct kmem_cache *s) 121ba6c496eSGlauber Costa { 122ba6c496eSGlauber Costa return true; 123ba6c496eSGlauber Costa } 124ba6c496eSGlauber Costa 125*2633d7a0SGlauber Costa static inline bool cache_match_memcg(struct kmem_cache *cachep, 126*2633d7a0SGlauber Costa struct mem_cgroup *memcg) 127*2633d7a0SGlauber Costa { 128*2633d7a0SGlauber Costa return true; 129*2633d7a0SGlauber Costa } 130ba6c496eSGlauber Costa #endif 13197d06609SChristoph Lameter #endif 132