1039363f3SChristoph Lameter /* 2039363f3SChristoph Lameter * Slab allocator functions that are independent of the allocator strategy 3039363f3SChristoph Lameter * 4039363f3SChristoph Lameter * (C) 2012 Christoph Lameter <cl@linux.com> 5039363f3SChristoph Lameter */ 6039363f3SChristoph Lameter #include <linux/slab.h> 7039363f3SChristoph Lameter 8039363f3SChristoph Lameter #include <linux/mm.h> 9039363f3SChristoph Lameter #include <linux/poison.h> 10039363f3SChristoph Lameter #include <linux/interrupt.h> 11039363f3SChristoph Lameter #include <linux/memory.h> 12039363f3SChristoph Lameter #include <linux/compiler.h> 13039363f3SChristoph Lameter #include <linux/module.h> 1420cea968SChristoph Lameter #include <linux/cpu.h> 1520cea968SChristoph Lameter #include <linux/uaccess.h> 16b7454ad3SGlauber Costa #include <linux/seq_file.h> 17b7454ad3SGlauber Costa #include <linux/proc_fs.h> 18039363f3SChristoph Lameter #include <asm/cacheflush.h> 19039363f3SChristoph Lameter #include <asm/tlbflush.h> 20039363f3SChristoph Lameter #include <asm/page.h> 212633d7a0SGlauber Costa #include <linux/memcontrol.h> 22f1b6eb6eSChristoph Lameter #include <trace/events/kmem.h> 23039363f3SChristoph Lameter 2497d06609SChristoph Lameter #include "slab.h" 2597d06609SChristoph Lameter 2697d06609SChristoph Lameter enum slab_state slab_state; 2718004c5dSChristoph Lameter LIST_HEAD(slab_caches); 2818004c5dSChristoph Lameter DEFINE_MUTEX(slab_mutex); 299b030cb8SChristoph Lameter struct kmem_cache *kmem_cache; 3097d06609SChristoph Lameter 3177be4b13SShuah Khan #ifdef CONFIG_DEBUG_VM 32794b1248SVladimir Davydov static int kmem_cache_sanity_check(const char *name, size_t size) 3377be4b13SShuah Khan { 3477be4b13SShuah Khan struct kmem_cache *s = NULL; 3577be4b13SShuah Khan 3677be4b13SShuah Khan if (!name || in_interrupt() || size < sizeof(void *) || 3777be4b13SShuah Khan size > KMALLOC_MAX_SIZE) { 3877be4b13SShuah Khan pr_err("kmem_cache_create(%s) integrity check failed\n", name); 3977be4b13SShuah Khan return -EINVAL; 4077be4b13SShuah Khan } 4177be4b13SShuah Khan 4277be4b13SShuah Khan list_for_each_entry(s, &slab_caches, list) { 4377be4b13SShuah Khan char tmp; 4477be4b13SShuah Khan int res; 4577be4b13SShuah Khan 4677be4b13SShuah Khan /* 4777be4b13SShuah Khan * This happens when the module gets unloaded and doesn't 4877be4b13SShuah Khan * destroy its slab cache and no-one else reuses the vmalloc 4977be4b13SShuah Khan * area of the module. Print a warning. 5077be4b13SShuah Khan */ 5177be4b13SShuah Khan res = probe_kernel_address(s->name, tmp); 5277be4b13SShuah Khan if (res) { 5377be4b13SShuah Khan pr_err("Slab cache with size %d has lost its name\n", 5477be4b13SShuah Khan s->object_size); 5577be4b13SShuah Khan continue; 5677be4b13SShuah Khan } 5777be4b13SShuah Khan 583e374919SChristoph Lameter #if !defined(CONFIG_SLUB) || !defined(CONFIG_SLUB_DEBUG_ON) 59794b1248SVladimir Davydov if (!strcmp(s->name, name)) { 6077be4b13SShuah Khan pr_err("%s (%s): Cache name already exists.\n", 6177be4b13SShuah Khan __func__, name); 6277be4b13SShuah Khan dump_stack(); 6377be4b13SShuah Khan s = NULL; 6477be4b13SShuah Khan return -EINVAL; 6577be4b13SShuah Khan } 663e374919SChristoph Lameter #endif 6777be4b13SShuah Khan } 6877be4b13SShuah Khan 6977be4b13SShuah Khan WARN_ON(strchr(name, ' ')); /* It confuses parsers */ 7077be4b13SShuah Khan return 0; 7177be4b13SShuah Khan } 7277be4b13SShuah Khan #else 73794b1248SVladimir Davydov static inline int kmem_cache_sanity_check(const char *name, size_t size) 7477be4b13SShuah Khan { 7577be4b13SShuah Khan return 0; 7677be4b13SShuah Khan } 7777be4b13SShuah Khan #endif 7877be4b13SShuah Khan 7955007d84SGlauber Costa #ifdef CONFIG_MEMCG_KMEM 8055007d84SGlauber Costa int memcg_update_all_caches(int num_memcgs) 8155007d84SGlauber Costa { 8255007d84SGlauber Costa struct kmem_cache *s; 8355007d84SGlauber Costa int ret = 0; 8455007d84SGlauber Costa mutex_lock(&slab_mutex); 8555007d84SGlauber Costa 8655007d84SGlauber Costa list_for_each_entry(s, &slab_caches, list) { 8755007d84SGlauber Costa if (!is_root_cache(s)) 8855007d84SGlauber Costa continue; 8955007d84SGlauber Costa 9055007d84SGlauber Costa ret = memcg_update_cache_size(s, num_memcgs); 9155007d84SGlauber Costa /* 9255007d84SGlauber Costa * See comment in memcontrol.c, memcg_update_cache_size: 9355007d84SGlauber Costa * Instead of freeing the memory, we'll just leave the caches 9455007d84SGlauber Costa * up to this point in an updated state. 9555007d84SGlauber Costa */ 9655007d84SGlauber Costa if (ret) 9755007d84SGlauber Costa goto out; 9855007d84SGlauber Costa } 9955007d84SGlauber Costa 10055007d84SGlauber Costa memcg_update_array_size(num_memcgs); 10155007d84SGlauber Costa out: 10255007d84SGlauber Costa mutex_unlock(&slab_mutex); 10355007d84SGlauber Costa return ret; 10455007d84SGlauber Costa } 10555007d84SGlauber Costa #endif 10655007d84SGlauber Costa 107039363f3SChristoph Lameter /* 10845906855SChristoph Lameter * Figure out what the alignment of the objects will be given a set of 10945906855SChristoph Lameter * flags, a user specified alignment and the size of the objects. 11045906855SChristoph Lameter */ 11145906855SChristoph Lameter unsigned long calculate_alignment(unsigned long flags, 11245906855SChristoph Lameter unsigned long align, unsigned long size) 11345906855SChristoph Lameter { 11445906855SChristoph Lameter /* 11545906855SChristoph Lameter * If the user wants hardware cache aligned objects then follow that 11645906855SChristoph Lameter * suggestion if the object is sufficiently large. 11745906855SChristoph Lameter * 11845906855SChristoph Lameter * The hardware cache alignment cannot override the specified 11945906855SChristoph Lameter * alignment though. If that is greater then use it. 12045906855SChristoph Lameter */ 12145906855SChristoph Lameter if (flags & SLAB_HWCACHE_ALIGN) { 12245906855SChristoph Lameter unsigned long ralign = cache_line_size(); 12345906855SChristoph Lameter while (size <= ralign / 2) 12445906855SChristoph Lameter ralign /= 2; 12545906855SChristoph Lameter align = max(align, ralign); 12645906855SChristoph Lameter } 12745906855SChristoph Lameter 12845906855SChristoph Lameter if (align < ARCH_SLAB_MINALIGN) 12945906855SChristoph Lameter align = ARCH_SLAB_MINALIGN; 13045906855SChristoph Lameter 13145906855SChristoph Lameter return ALIGN(align, sizeof(void *)); 13245906855SChristoph Lameter } 13345906855SChristoph Lameter 134794b1248SVladimir Davydov static struct kmem_cache * 135794b1248SVladimir Davydov do_kmem_cache_create(char *name, size_t object_size, size_t size, size_t align, 136794b1248SVladimir Davydov unsigned long flags, void (*ctor)(void *), 137794b1248SVladimir Davydov struct mem_cgroup *memcg, struct kmem_cache *root_cache) 138794b1248SVladimir Davydov { 139794b1248SVladimir Davydov struct kmem_cache *s; 140794b1248SVladimir Davydov int err; 141794b1248SVladimir Davydov 142794b1248SVladimir Davydov err = -ENOMEM; 143794b1248SVladimir Davydov s = kmem_cache_zalloc(kmem_cache, GFP_KERNEL); 144794b1248SVladimir Davydov if (!s) 145794b1248SVladimir Davydov goto out; 146794b1248SVladimir Davydov 147794b1248SVladimir Davydov s->name = name; 148794b1248SVladimir Davydov s->object_size = object_size; 149794b1248SVladimir Davydov s->size = size; 150794b1248SVladimir Davydov s->align = align; 151794b1248SVladimir Davydov s->ctor = ctor; 152794b1248SVladimir Davydov 153794b1248SVladimir Davydov err = memcg_alloc_cache_params(memcg, s, root_cache); 154794b1248SVladimir Davydov if (err) 155794b1248SVladimir Davydov goto out_free_cache; 156794b1248SVladimir Davydov 157794b1248SVladimir Davydov err = __kmem_cache_create(s, flags); 158794b1248SVladimir Davydov if (err) 159794b1248SVladimir Davydov goto out_free_cache; 160794b1248SVladimir Davydov 161794b1248SVladimir Davydov s->refcount = 1; 162794b1248SVladimir Davydov list_add(&s->list, &slab_caches); 163794b1248SVladimir Davydov out: 164794b1248SVladimir Davydov if (err) 165794b1248SVladimir Davydov return ERR_PTR(err); 166794b1248SVladimir Davydov return s; 167794b1248SVladimir Davydov 168794b1248SVladimir Davydov out_free_cache: 169794b1248SVladimir Davydov memcg_free_cache_params(s); 170794b1248SVladimir Davydov kfree(s); 171794b1248SVladimir Davydov goto out; 172794b1248SVladimir Davydov } 17345906855SChristoph Lameter 17445906855SChristoph Lameter /* 175039363f3SChristoph Lameter * kmem_cache_create - Create a cache. 176039363f3SChristoph Lameter * @name: A string which is used in /proc/slabinfo to identify this cache. 177039363f3SChristoph Lameter * @size: The size of objects to be created in this cache. 178039363f3SChristoph Lameter * @align: The required alignment for the objects. 179039363f3SChristoph Lameter * @flags: SLAB flags 180039363f3SChristoph Lameter * @ctor: A constructor for the objects. 181039363f3SChristoph Lameter * 182039363f3SChristoph Lameter * Returns a ptr to the cache on success, NULL on failure. 183039363f3SChristoph Lameter * Cannot be called within a interrupt, but can be interrupted. 184039363f3SChristoph Lameter * The @ctor is run when new pages are allocated by the cache. 185039363f3SChristoph Lameter * 186039363f3SChristoph Lameter * The flags are 187039363f3SChristoph Lameter * 188039363f3SChristoph Lameter * %SLAB_POISON - Poison the slab with a known test pattern (a5a5a5a5) 189039363f3SChristoph Lameter * to catch references to uninitialised memory. 190039363f3SChristoph Lameter * 191039363f3SChristoph Lameter * %SLAB_RED_ZONE - Insert `Red' zones around the allocated memory to check 192039363f3SChristoph Lameter * for buffer overruns. 193039363f3SChristoph Lameter * 194039363f3SChristoph Lameter * %SLAB_HWCACHE_ALIGN - Align the objects in this cache to a hardware 195039363f3SChristoph Lameter * cacheline. This can be beneficial if you're counting cycles as closely 196039363f3SChristoph Lameter * as davem. 197039363f3SChristoph Lameter */ 1982633d7a0SGlauber Costa struct kmem_cache * 199794b1248SVladimir Davydov kmem_cache_create(const char *name, size_t size, size_t align, 200794b1248SVladimir Davydov unsigned long flags, void (*ctor)(void *)) 201039363f3SChristoph Lameter { 202794b1248SVladimir Davydov struct kmem_cache *s; 203794b1248SVladimir Davydov char *cache_name; 2043965fc36SVladimir Davydov int err; 205039363f3SChristoph Lameter 206b920536aSPekka Enberg get_online_cpus(); 20703afc0e2SVladimir Davydov get_online_mems(); 20803afc0e2SVladimir Davydov 209b920536aSPekka Enberg mutex_lock(&slab_mutex); 210686d550dSChristoph Lameter 211794b1248SVladimir Davydov err = kmem_cache_sanity_check(name, size); 2123965fc36SVladimir Davydov if (err) 2133965fc36SVladimir Davydov goto out_unlock; 214686d550dSChristoph Lameter 215d8843922SGlauber Costa /* 216d8843922SGlauber Costa * Some allocators will constraint the set of valid flags to a subset 217d8843922SGlauber Costa * of all flags. We expect them to define CACHE_CREATE_MASK in this 218d8843922SGlauber Costa * case, and we'll just provide them with a sanitized version of the 219d8843922SGlauber Costa * passed flags. 220d8843922SGlauber Costa */ 221d8843922SGlauber Costa flags &= CACHE_CREATE_MASK; 222686d550dSChristoph Lameter 223a44cb944SVladimir Davydov s = __kmem_cache_alias(name, size, align, flags, ctor); 224cbb79694SChristoph Lameter if (s) 2253965fc36SVladimir Davydov goto out_unlock; 226794b1248SVladimir Davydov 227794b1248SVladimir Davydov cache_name = kstrdup(name, GFP_KERNEL); 228794b1248SVladimir Davydov if (!cache_name) { 229794b1248SVladimir Davydov err = -ENOMEM; 230794b1248SVladimir Davydov goto out_unlock; 231a44cb944SVladimir Davydov } 232cbb79694SChristoph Lameter 233794b1248SVladimir Davydov s = do_kmem_cache_create(cache_name, size, size, 234794b1248SVladimir Davydov calculate_alignment(flags, align, size), 235794b1248SVladimir Davydov flags, ctor, NULL, NULL); 236794b1248SVladimir Davydov if (IS_ERR(s)) { 237794b1248SVladimir Davydov err = PTR_ERR(s); 238794b1248SVladimir Davydov kfree(cache_name); 239794b1248SVladimir Davydov } 240db265ecaSChristoph Lameter 2413965fc36SVladimir Davydov out_unlock: 24220cea968SChristoph Lameter mutex_unlock(&slab_mutex); 24303afc0e2SVladimir Davydov 24403afc0e2SVladimir Davydov put_online_mems(); 24520cea968SChristoph Lameter put_online_cpus(); 24620cea968SChristoph Lameter 247ba3253c7SDave Jones if (err) { 248686d550dSChristoph Lameter if (flags & SLAB_PANIC) 249686d550dSChristoph Lameter panic("kmem_cache_create: Failed to create slab '%s'. Error %d\n", 250686d550dSChristoph Lameter name, err); 251686d550dSChristoph Lameter else { 252686d550dSChristoph Lameter printk(KERN_WARNING "kmem_cache_create(%s) failed with error %d", 253686d550dSChristoph Lameter name, err); 254686d550dSChristoph Lameter dump_stack(); 255686d550dSChristoph Lameter } 256686d550dSChristoph Lameter return NULL; 257686d550dSChristoph Lameter } 258039363f3SChristoph Lameter return s; 259794b1248SVladimir Davydov } 260794b1248SVladimir Davydov EXPORT_SYMBOL(kmem_cache_create); 2613965fc36SVladimir Davydov 262794b1248SVladimir Davydov #ifdef CONFIG_MEMCG_KMEM 263794b1248SVladimir Davydov /* 264794b1248SVladimir Davydov * kmem_cache_create_memcg - Create a cache for a memory cgroup. 265794b1248SVladimir Davydov * @memcg: The memory cgroup the new cache is for. 266794b1248SVladimir Davydov * @root_cache: The parent of the new cache. 267794b1248SVladimir Davydov * 268794b1248SVladimir Davydov * This function attempts to create a kmem cache that will serve allocation 269794b1248SVladimir Davydov * requests going from @memcg to @root_cache. The new cache inherits properties 270794b1248SVladimir Davydov * from its parent. 271794b1248SVladimir Davydov */ 272*bd673145SVladimir Davydov struct kmem_cache *kmem_cache_create_memcg(struct mem_cgroup *memcg, 273*bd673145SVladimir Davydov struct kmem_cache *root_cache) 274794b1248SVladimir Davydov { 275*bd673145SVladimir Davydov struct kmem_cache *s = NULL; 276794b1248SVladimir Davydov char *cache_name; 277794b1248SVladimir Davydov 278794b1248SVladimir Davydov get_online_cpus(); 27903afc0e2SVladimir Davydov get_online_mems(); 28003afc0e2SVladimir Davydov 281794b1248SVladimir Davydov mutex_lock(&slab_mutex); 282794b1248SVladimir Davydov 283794b1248SVladimir Davydov cache_name = memcg_create_cache_name(memcg, root_cache); 284794b1248SVladimir Davydov if (!cache_name) 285794b1248SVladimir Davydov goto out_unlock; 286794b1248SVladimir Davydov 287794b1248SVladimir Davydov s = do_kmem_cache_create(cache_name, root_cache->object_size, 288794b1248SVladimir Davydov root_cache->size, root_cache->align, 289794b1248SVladimir Davydov root_cache->flags, root_cache->ctor, 290794b1248SVladimir Davydov memcg, root_cache); 291*bd673145SVladimir Davydov if (IS_ERR(s)) { 292794b1248SVladimir Davydov kfree(cache_name); 293*bd673145SVladimir Davydov s = NULL; 294*bd673145SVladimir Davydov } 295794b1248SVladimir Davydov 296794b1248SVladimir Davydov out_unlock: 297794b1248SVladimir Davydov mutex_unlock(&slab_mutex); 29803afc0e2SVladimir Davydov 29903afc0e2SVladimir Davydov put_online_mems(); 300794b1248SVladimir Davydov put_online_cpus(); 301*bd673145SVladimir Davydov 302*bd673145SVladimir Davydov return s; 3032633d7a0SGlauber Costa } 304b8529907SVladimir Davydov 305b8529907SVladimir Davydov static int kmem_cache_destroy_memcg_children(struct kmem_cache *s) 306b8529907SVladimir Davydov { 307b8529907SVladimir Davydov int rc; 308b8529907SVladimir Davydov 309b8529907SVladimir Davydov if (!s->memcg_params || 310b8529907SVladimir Davydov !s->memcg_params->is_root_cache) 311b8529907SVladimir Davydov return 0; 312b8529907SVladimir Davydov 313b8529907SVladimir Davydov mutex_unlock(&slab_mutex); 314b8529907SVladimir Davydov rc = __kmem_cache_destroy_memcg_children(s); 315b8529907SVladimir Davydov mutex_lock(&slab_mutex); 316b8529907SVladimir Davydov 317b8529907SVladimir Davydov return rc; 318b8529907SVladimir Davydov } 319b8529907SVladimir Davydov #else 320b8529907SVladimir Davydov static int kmem_cache_destroy_memcg_children(struct kmem_cache *s) 321b8529907SVladimir Davydov { 322b8529907SVladimir Davydov return 0; 323b8529907SVladimir Davydov } 324794b1248SVladimir Davydov #endif /* CONFIG_MEMCG_KMEM */ 32597d06609SChristoph Lameter 32641a21285SChristoph Lameter void slab_kmem_cache_release(struct kmem_cache *s) 32741a21285SChristoph Lameter { 32841a21285SChristoph Lameter kfree(s->name); 32941a21285SChristoph Lameter kmem_cache_free(kmem_cache, s); 33041a21285SChristoph Lameter } 33141a21285SChristoph Lameter 332945cf2b6SChristoph Lameter void kmem_cache_destroy(struct kmem_cache *s) 333945cf2b6SChristoph Lameter { 334945cf2b6SChristoph Lameter get_online_cpus(); 33503afc0e2SVladimir Davydov get_online_mems(); 33603afc0e2SVladimir Davydov 337945cf2b6SChristoph Lameter mutex_lock(&slab_mutex); 338b8529907SVladimir Davydov 339945cf2b6SChristoph Lameter s->refcount--; 340b8529907SVladimir Davydov if (s->refcount) 341b8529907SVladimir Davydov goto out_unlock; 342b8529907SVladimir Davydov 343b8529907SVladimir Davydov if (kmem_cache_destroy_memcg_children(s) != 0) 344b8529907SVladimir Davydov goto out_unlock; 345b8529907SVladimir Davydov 346945cf2b6SChristoph Lameter list_del(&s->list); 347b8529907SVladimir Davydov if (__kmem_cache_shutdown(s) != 0) { 348b8529907SVladimir Davydov list_add(&s->list, &slab_caches); 349b8529907SVladimir Davydov printk(KERN_ERR "kmem_cache_destroy %s: " 350b8529907SVladimir Davydov "Slab cache still has objects\n", s->name); 351b8529907SVladimir Davydov dump_stack(); 352b8529907SVladimir Davydov goto out_unlock; 353b8529907SVladimir Davydov } 354b8529907SVladimir Davydov 355210ed9deSJiri Kosina mutex_unlock(&slab_mutex); 356945cf2b6SChristoph Lameter if (s->flags & SLAB_DESTROY_BY_RCU) 357945cf2b6SChristoph Lameter rcu_barrier(); 358945cf2b6SChristoph Lameter 3591aa13254SVladimir Davydov memcg_free_cache_params(s); 36041a21285SChristoph Lameter #ifdef SLAB_SUPPORTS_SYSFS 36141a21285SChristoph Lameter sysfs_slab_remove(s); 36241a21285SChristoph Lameter #else 36341a21285SChristoph Lameter slab_kmem_cache_release(s); 36441a21285SChristoph Lameter #endif 36503afc0e2SVladimir Davydov goto out; 366b8529907SVladimir Davydov 367b8529907SVladimir Davydov out_unlock: 368210ed9deSJiri Kosina mutex_unlock(&slab_mutex); 36903afc0e2SVladimir Davydov out: 37003afc0e2SVladimir Davydov put_online_mems(); 371945cf2b6SChristoph Lameter put_online_cpus(); 372945cf2b6SChristoph Lameter } 373945cf2b6SChristoph Lameter EXPORT_SYMBOL(kmem_cache_destroy); 374945cf2b6SChristoph Lameter 37503afc0e2SVladimir Davydov /** 37603afc0e2SVladimir Davydov * kmem_cache_shrink - Shrink a cache. 37703afc0e2SVladimir Davydov * @cachep: The cache to shrink. 37803afc0e2SVladimir Davydov * 37903afc0e2SVladimir Davydov * Releases as many slabs as possible for a cache. 38003afc0e2SVladimir Davydov * To help debugging, a zero exit status indicates all slabs were released. 38103afc0e2SVladimir Davydov */ 38203afc0e2SVladimir Davydov int kmem_cache_shrink(struct kmem_cache *cachep) 38303afc0e2SVladimir Davydov { 38403afc0e2SVladimir Davydov int ret; 38503afc0e2SVladimir Davydov 38603afc0e2SVladimir Davydov get_online_cpus(); 38703afc0e2SVladimir Davydov get_online_mems(); 38803afc0e2SVladimir Davydov ret = __kmem_cache_shrink(cachep); 38903afc0e2SVladimir Davydov put_online_mems(); 39003afc0e2SVladimir Davydov put_online_cpus(); 39103afc0e2SVladimir Davydov return ret; 39203afc0e2SVladimir Davydov } 39303afc0e2SVladimir Davydov EXPORT_SYMBOL(kmem_cache_shrink); 39403afc0e2SVladimir Davydov 39597d06609SChristoph Lameter int slab_is_available(void) 39697d06609SChristoph Lameter { 39797d06609SChristoph Lameter return slab_state >= UP; 39897d06609SChristoph Lameter } 399b7454ad3SGlauber Costa 40045530c44SChristoph Lameter #ifndef CONFIG_SLOB 40145530c44SChristoph Lameter /* Create a cache during boot when no slab services are available yet */ 40245530c44SChristoph Lameter void __init create_boot_cache(struct kmem_cache *s, const char *name, size_t size, 40345530c44SChristoph Lameter unsigned long flags) 40445530c44SChristoph Lameter { 40545530c44SChristoph Lameter int err; 40645530c44SChristoph Lameter 40745530c44SChristoph Lameter s->name = name; 40845530c44SChristoph Lameter s->size = s->object_size = size; 40945906855SChristoph Lameter s->align = calculate_alignment(flags, ARCH_KMALLOC_MINALIGN, size); 41045530c44SChristoph Lameter err = __kmem_cache_create(s, flags); 41145530c44SChristoph Lameter 41245530c44SChristoph Lameter if (err) 41331ba7346SChristoph Lameter panic("Creation of kmalloc slab %s size=%zu failed. Reason %d\n", 41445530c44SChristoph Lameter name, size, err); 41545530c44SChristoph Lameter 41645530c44SChristoph Lameter s->refcount = -1; /* Exempt from merging for now */ 41745530c44SChristoph Lameter } 41845530c44SChristoph Lameter 41945530c44SChristoph Lameter struct kmem_cache *__init create_kmalloc_cache(const char *name, size_t size, 42045530c44SChristoph Lameter unsigned long flags) 42145530c44SChristoph Lameter { 42245530c44SChristoph Lameter struct kmem_cache *s = kmem_cache_zalloc(kmem_cache, GFP_NOWAIT); 42345530c44SChristoph Lameter 42445530c44SChristoph Lameter if (!s) 42545530c44SChristoph Lameter panic("Out of memory when creating slab %s\n", name); 42645530c44SChristoph Lameter 42745530c44SChristoph Lameter create_boot_cache(s, name, size, flags); 42845530c44SChristoph Lameter list_add(&s->list, &slab_caches); 42945530c44SChristoph Lameter s->refcount = 1; 43045530c44SChristoph Lameter return s; 43145530c44SChristoph Lameter } 43245530c44SChristoph Lameter 4339425c58eSChristoph Lameter struct kmem_cache *kmalloc_caches[KMALLOC_SHIFT_HIGH + 1]; 4349425c58eSChristoph Lameter EXPORT_SYMBOL(kmalloc_caches); 4359425c58eSChristoph Lameter 4369425c58eSChristoph Lameter #ifdef CONFIG_ZONE_DMA 4379425c58eSChristoph Lameter struct kmem_cache *kmalloc_dma_caches[KMALLOC_SHIFT_HIGH + 1]; 4389425c58eSChristoph Lameter EXPORT_SYMBOL(kmalloc_dma_caches); 4399425c58eSChristoph Lameter #endif 4409425c58eSChristoph Lameter 441f97d5f63SChristoph Lameter /* 4422c59dd65SChristoph Lameter * Conversion table for small slabs sizes / 8 to the index in the 4432c59dd65SChristoph Lameter * kmalloc array. This is necessary for slabs < 192 since we have non power 4442c59dd65SChristoph Lameter * of two cache sizes there. The size of larger slabs can be determined using 4452c59dd65SChristoph Lameter * fls. 4462c59dd65SChristoph Lameter */ 4472c59dd65SChristoph Lameter static s8 size_index[24] = { 4482c59dd65SChristoph Lameter 3, /* 8 */ 4492c59dd65SChristoph Lameter 4, /* 16 */ 4502c59dd65SChristoph Lameter 5, /* 24 */ 4512c59dd65SChristoph Lameter 5, /* 32 */ 4522c59dd65SChristoph Lameter 6, /* 40 */ 4532c59dd65SChristoph Lameter 6, /* 48 */ 4542c59dd65SChristoph Lameter 6, /* 56 */ 4552c59dd65SChristoph Lameter 6, /* 64 */ 4562c59dd65SChristoph Lameter 1, /* 72 */ 4572c59dd65SChristoph Lameter 1, /* 80 */ 4582c59dd65SChristoph Lameter 1, /* 88 */ 4592c59dd65SChristoph Lameter 1, /* 96 */ 4602c59dd65SChristoph Lameter 7, /* 104 */ 4612c59dd65SChristoph Lameter 7, /* 112 */ 4622c59dd65SChristoph Lameter 7, /* 120 */ 4632c59dd65SChristoph Lameter 7, /* 128 */ 4642c59dd65SChristoph Lameter 2, /* 136 */ 4652c59dd65SChristoph Lameter 2, /* 144 */ 4662c59dd65SChristoph Lameter 2, /* 152 */ 4672c59dd65SChristoph Lameter 2, /* 160 */ 4682c59dd65SChristoph Lameter 2, /* 168 */ 4692c59dd65SChristoph Lameter 2, /* 176 */ 4702c59dd65SChristoph Lameter 2, /* 184 */ 4712c59dd65SChristoph Lameter 2 /* 192 */ 4722c59dd65SChristoph Lameter }; 4732c59dd65SChristoph Lameter 4742c59dd65SChristoph Lameter static inline int size_index_elem(size_t bytes) 4752c59dd65SChristoph Lameter { 4762c59dd65SChristoph Lameter return (bytes - 1) / 8; 4772c59dd65SChristoph Lameter } 4782c59dd65SChristoph Lameter 4792c59dd65SChristoph Lameter /* 4802c59dd65SChristoph Lameter * Find the kmem_cache structure that serves a given size of 4812c59dd65SChristoph Lameter * allocation 4822c59dd65SChristoph Lameter */ 4832c59dd65SChristoph Lameter struct kmem_cache *kmalloc_slab(size_t size, gfp_t flags) 4842c59dd65SChristoph Lameter { 4852c59dd65SChristoph Lameter int index; 4862c59dd65SChristoph Lameter 4879de1bc87SJoonsoo Kim if (unlikely(size > KMALLOC_MAX_SIZE)) { 488907985f4SSasha Levin WARN_ON_ONCE(!(flags & __GFP_NOWARN)); 4896286ae97SChristoph Lameter return NULL; 490907985f4SSasha Levin } 4916286ae97SChristoph Lameter 4922c59dd65SChristoph Lameter if (size <= 192) { 4932c59dd65SChristoph Lameter if (!size) 4942c59dd65SChristoph Lameter return ZERO_SIZE_PTR; 4952c59dd65SChristoph Lameter 4962c59dd65SChristoph Lameter index = size_index[size_index_elem(size)]; 4972c59dd65SChristoph Lameter } else 4982c59dd65SChristoph Lameter index = fls(size - 1); 4992c59dd65SChristoph Lameter 5002c59dd65SChristoph Lameter #ifdef CONFIG_ZONE_DMA 501b1e05416SJoonsoo Kim if (unlikely((flags & GFP_DMA))) 5022c59dd65SChristoph Lameter return kmalloc_dma_caches[index]; 5032c59dd65SChristoph Lameter 5042c59dd65SChristoph Lameter #endif 5052c59dd65SChristoph Lameter return kmalloc_caches[index]; 5062c59dd65SChristoph Lameter } 5072c59dd65SChristoph Lameter 5082c59dd65SChristoph Lameter /* 509f97d5f63SChristoph Lameter * Create the kmalloc array. Some of the regular kmalloc arrays 510f97d5f63SChristoph Lameter * may already have been created because they were needed to 511f97d5f63SChristoph Lameter * enable allocations for slab creation. 512f97d5f63SChristoph Lameter */ 513f97d5f63SChristoph Lameter void __init create_kmalloc_caches(unsigned long flags) 514f97d5f63SChristoph Lameter { 515f97d5f63SChristoph Lameter int i; 516f97d5f63SChristoph Lameter 5172c59dd65SChristoph Lameter /* 5182c59dd65SChristoph Lameter * Patch up the size_index table if we have strange large alignment 5192c59dd65SChristoph Lameter * requirements for the kmalloc array. This is only the case for 5202c59dd65SChristoph Lameter * MIPS it seems. The standard arches will not generate any code here. 5212c59dd65SChristoph Lameter * 5222c59dd65SChristoph Lameter * Largest permitted alignment is 256 bytes due to the way we 5232c59dd65SChristoph Lameter * handle the index determination for the smaller caches. 5242c59dd65SChristoph Lameter * 5252c59dd65SChristoph Lameter * Make sure that nothing crazy happens if someone starts tinkering 5262c59dd65SChristoph Lameter * around with ARCH_KMALLOC_MINALIGN 5272c59dd65SChristoph Lameter */ 5282c59dd65SChristoph Lameter BUILD_BUG_ON(KMALLOC_MIN_SIZE > 256 || 5292c59dd65SChristoph Lameter (KMALLOC_MIN_SIZE & (KMALLOC_MIN_SIZE - 1))); 5302c59dd65SChristoph Lameter 5312c59dd65SChristoph Lameter for (i = 8; i < KMALLOC_MIN_SIZE; i += 8) { 5322c59dd65SChristoph Lameter int elem = size_index_elem(i); 5332c59dd65SChristoph Lameter 5342c59dd65SChristoph Lameter if (elem >= ARRAY_SIZE(size_index)) 5352c59dd65SChristoph Lameter break; 5362c59dd65SChristoph Lameter size_index[elem] = KMALLOC_SHIFT_LOW; 5372c59dd65SChristoph Lameter } 5382c59dd65SChristoph Lameter 5392c59dd65SChristoph Lameter if (KMALLOC_MIN_SIZE >= 64) { 5402c59dd65SChristoph Lameter /* 5412c59dd65SChristoph Lameter * The 96 byte size cache is not used if the alignment 5422c59dd65SChristoph Lameter * is 64 byte. 5432c59dd65SChristoph Lameter */ 5442c59dd65SChristoph Lameter for (i = 64 + 8; i <= 96; i += 8) 5452c59dd65SChristoph Lameter size_index[size_index_elem(i)] = 7; 5462c59dd65SChristoph Lameter 5472c59dd65SChristoph Lameter } 5482c59dd65SChristoph Lameter 5492c59dd65SChristoph Lameter if (KMALLOC_MIN_SIZE >= 128) { 5502c59dd65SChristoph Lameter /* 5512c59dd65SChristoph Lameter * The 192 byte sized cache is not used if the alignment 5522c59dd65SChristoph Lameter * is 128 byte. Redirect kmalloc to use the 256 byte cache 5532c59dd65SChristoph Lameter * instead. 5542c59dd65SChristoph Lameter */ 5552c59dd65SChristoph Lameter for (i = 128 + 8; i <= 192; i += 8) 5562c59dd65SChristoph Lameter size_index[size_index_elem(i)] = 8; 5572c59dd65SChristoph Lameter } 5588a965b3bSChristoph Lameter for (i = KMALLOC_SHIFT_LOW; i <= KMALLOC_SHIFT_HIGH; i++) { 5598a965b3bSChristoph Lameter if (!kmalloc_caches[i]) { 560f97d5f63SChristoph Lameter kmalloc_caches[i] = create_kmalloc_cache(NULL, 561f97d5f63SChristoph Lameter 1 << i, flags); 562956e46efSChris Mason } 563f97d5f63SChristoph Lameter 5648a965b3bSChristoph Lameter /* 5658a965b3bSChristoph Lameter * Caches that are not of the two-to-the-power-of size. 5668a965b3bSChristoph Lameter * These have to be created immediately after the 5678a965b3bSChristoph Lameter * earlier power of two caches 5688a965b3bSChristoph Lameter */ 5698a965b3bSChristoph Lameter if (KMALLOC_MIN_SIZE <= 32 && !kmalloc_caches[1] && i == 6) 5708a965b3bSChristoph Lameter kmalloc_caches[1] = create_kmalloc_cache(NULL, 96, flags); 5718a965b3bSChristoph Lameter 5728a965b3bSChristoph Lameter if (KMALLOC_MIN_SIZE <= 64 && !kmalloc_caches[2] && i == 7) 5738a965b3bSChristoph Lameter kmalloc_caches[2] = create_kmalloc_cache(NULL, 192, flags); 5748a965b3bSChristoph Lameter } 5758a965b3bSChristoph Lameter 576f97d5f63SChristoph Lameter /* Kmalloc array is now usable */ 577f97d5f63SChristoph Lameter slab_state = UP; 578f97d5f63SChristoph Lameter 579f97d5f63SChristoph Lameter for (i = 0; i <= KMALLOC_SHIFT_HIGH; i++) { 580f97d5f63SChristoph Lameter struct kmem_cache *s = kmalloc_caches[i]; 581f97d5f63SChristoph Lameter char *n; 582f97d5f63SChristoph Lameter 583f97d5f63SChristoph Lameter if (s) { 584f97d5f63SChristoph Lameter n = kasprintf(GFP_NOWAIT, "kmalloc-%d", kmalloc_size(i)); 585f97d5f63SChristoph Lameter 586f97d5f63SChristoph Lameter BUG_ON(!n); 587f97d5f63SChristoph Lameter s->name = n; 588f97d5f63SChristoph Lameter } 589f97d5f63SChristoph Lameter } 590f97d5f63SChristoph Lameter 591f97d5f63SChristoph Lameter #ifdef CONFIG_ZONE_DMA 592f97d5f63SChristoph Lameter for (i = 0; i <= KMALLOC_SHIFT_HIGH; i++) { 593f97d5f63SChristoph Lameter struct kmem_cache *s = kmalloc_caches[i]; 594f97d5f63SChristoph Lameter 595f97d5f63SChristoph Lameter if (s) { 596f97d5f63SChristoph Lameter int size = kmalloc_size(i); 597f97d5f63SChristoph Lameter char *n = kasprintf(GFP_NOWAIT, 598f97d5f63SChristoph Lameter "dma-kmalloc-%d", size); 599f97d5f63SChristoph Lameter 600f97d5f63SChristoph Lameter BUG_ON(!n); 601f97d5f63SChristoph Lameter kmalloc_dma_caches[i] = create_kmalloc_cache(n, 602f97d5f63SChristoph Lameter size, SLAB_CACHE_DMA | flags); 603f97d5f63SChristoph Lameter } 604f97d5f63SChristoph Lameter } 605f97d5f63SChristoph Lameter #endif 606f97d5f63SChristoph Lameter } 60745530c44SChristoph Lameter #endif /* !CONFIG_SLOB */ 60845530c44SChristoph Lameter 609cea371f4SVladimir Davydov /* 610cea371f4SVladimir Davydov * To avoid unnecessary overhead, we pass through large allocation requests 611cea371f4SVladimir Davydov * directly to the page allocator. We use __GFP_COMP, because we will need to 612cea371f4SVladimir Davydov * know the allocation order to free the pages properly in kfree. 613cea371f4SVladimir Davydov */ 61452383431SVladimir Davydov void *kmalloc_order(size_t size, gfp_t flags, unsigned int order) 61552383431SVladimir Davydov { 61652383431SVladimir Davydov void *ret; 61752383431SVladimir Davydov struct page *page; 61852383431SVladimir Davydov 61952383431SVladimir Davydov flags |= __GFP_COMP; 62052383431SVladimir Davydov page = alloc_kmem_pages(flags, order); 62152383431SVladimir Davydov ret = page ? page_address(page) : NULL; 62252383431SVladimir Davydov kmemleak_alloc(ret, size, 1, flags); 62352383431SVladimir Davydov return ret; 62452383431SVladimir Davydov } 62552383431SVladimir Davydov EXPORT_SYMBOL(kmalloc_order); 62652383431SVladimir Davydov 627f1b6eb6eSChristoph Lameter #ifdef CONFIG_TRACING 628f1b6eb6eSChristoph Lameter void *kmalloc_order_trace(size_t size, gfp_t flags, unsigned int order) 629f1b6eb6eSChristoph Lameter { 630f1b6eb6eSChristoph Lameter void *ret = kmalloc_order(size, flags, order); 631f1b6eb6eSChristoph Lameter trace_kmalloc(_RET_IP_, ret, size, PAGE_SIZE << order, flags); 632f1b6eb6eSChristoph Lameter return ret; 633f1b6eb6eSChristoph Lameter } 634f1b6eb6eSChristoph Lameter EXPORT_SYMBOL(kmalloc_order_trace); 635f1b6eb6eSChristoph Lameter #endif 63645530c44SChristoph Lameter 637b7454ad3SGlauber Costa #ifdef CONFIG_SLABINFO 638e9b4db2bSWanpeng Li 639e9b4db2bSWanpeng Li #ifdef CONFIG_SLAB 640e9b4db2bSWanpeng Li #define SLABINFO_RIGHTS (S_IWUSR | S_IRUSR) 641e9b4db2bSWanpeng Li #else 642e9b4db2bSWanpeng Li #define SLABINFO_RIGHTS S_IRUSR 643e9b4db2bSWanpeng Li #endif 644e9b4db2bSWanpeng Li 645749c5415SGlauber Costa void print_slabinfo_header(struct seq_file *m) 646bcee6e2aSGlauber Costa { 647bcee6e2aSGlauber Costa /* 648bcee6e2aSGlauber Costa * Output format version, so at least we can change it 649bcee6e2aSGlauber Costa * without _too_ many complaints. 650bcee6e2aSGlauber Costa */ 651bcee6e2aSGlauber Costa #ifdef CONFIG_DEBUG_SLAB 652bcee6e2aSGlauber Costa seq_puts(m, "slabinfo - version: 2.1 (statistics)\n"); 653bcee6e2aSGlauber Costa #else 654bcee6e2aSGlauber Costa seq_puts(m, "slabinfo - version: 2.1\n"); 655bcee6e2aSGlauber Costa #endif 656bcee6e2aSGlauber Costa seq_puts(m, "# name <active_objs> <num_objs> <objsize> " 657bcee6e2aSGlauber Costa "<objperslab> <pagesperslab>"); 658bcee6e2aSGlauber Costa seq_puts(m, " : tunables <limit> <batchcount> <sharedfactor>"); 659bcee6e2aSGlauber Costa seq_puts(m, " : slabdata <active_slabs> <num_slabs> <sharedavail>"); 660bcee6e2aSGlauber Costa #ifdef CONFIG_DEBUG_SLAB 661bcee6e2aSGlauber Costa seq_puts(m, " : globalstat <listallocs> <maxobjs> <grown> <reaped> " 662bcee6e2aSGlauber Costa "<error> <maxfreeable> <nodeallocs> <remotefrees> <alienoverflow>"); 663bcee6e2aSGlauber Costa seq_puts(m, " : cpustat <allochit> <allocmiss> <freehit> <freemiss>"); 664bcee6e2aSGlauber Costa #endif 665bcee6e2aSGlauber Costa seq_putc(m, '\n'); 666bcee6e2aSGlauber Costa } 667bcee6e2aSGlauber Costa 668b7454ad3SGlauber Costa static void *s_start(struct seq_file *m, loff_t *pos) 669b7454ad3SGlauber Costa { 670b7454ad3SGlauber Costa loff_t n = *pos; 671b7454ad3SGlauber Costa 672b7454ad3SGlauber Costa mutex_lock(&slab_mutex); 673b7454ad3SGlauber Costa if (!n) 674b7454ad3SGlauber Costa print_slabinfo_header(m); 675b7454ad3SGlauber Costa 676b7454ad3SGlauber Costa return seq_list_start(&slab_caches, *pos); 677b7454ad3SGlauber Costa } 678b7454ad3SGlauber Costa 679276a2439SWanpeng Li void *slab_next(struct seq_file *m, void *p, loff_t *pos) 680b7454ad3SGlauber Costa { 681b7454ad3SGlauber Costa return seq_list_next(p, &slab_caches, pos); 682b7454ad3SGlauber Costa } 683b7454ad3SGlauber Costa 684276a2439SWanpeng Li void slab_stop(struct seq_file *m, void *p) 685b7454ad3SGlauber Costa { 686b7454ad3SGlauber Costa mutex_unlock(&slab_mutex); 687b7454ad3SGlauber Costa } 688b7454ad3SGlauber Costa 689749c5415SGlauber Costa static void 690749c5415SGlauber Costa memcg_accumulate_slabinfo(struct kmem_cache *s, struct slabinfo *info) 691b7454ad3SGlauber Costa { 692749c5415SGlauber Costa struct kmem_cache *c; 693749c5415SGlauber Costa struct slabinfo sinfo; 694749c5415SGlauber Costa int i; 695749c5415SGlauber Costa 696749c5415SGlauber Costa if (!is_root_cache(s)) 697749c5415SGlauber Costa return; 698749c5415SGlauber Costa 699749c5415SGlauber Costa for_each_memcg_cache_index(i) { 7002ade4de8SQiang Huang c = cache_from_memcg_idx(s, i); 701749c5415SGlauber Costa if (!c) 702749c5415SGlauber Costa continue; 703749c5415SGlauber Costa 704749c5415SGlauber Costa memset(&sinfo, 0, sizeof(sinfo)); 705749c5415SGlauber Costa get_slabinfo(c, &sinfo); 706749c5415SGlauber Costa 707749c5415SGlauber Costa info->active_slabs += sinfo.active_slabs; 708749c5415SGlauber Costa info->num_slabs += sinfo.num_slabs; 709749c5415SGlauber Costa info->shared_avail += sinfo.shared_avail; 710749c5415SGlauber Costa info->active_objs += sinfo.active_objs; 711749c5415SGlauber Costa info->num_objs += sinfo.num_objs; 712749c5415SGlauber Costa } 713749c5415SGlauber Costa } 714749c5415SGlauber Costa 715749c5415SGlauber Costa int cache_show(struct kmem_cache *s, struct seq_file *m) 716749c5415SGlauber Costa { 7170d7561c6SGlauber Costa struct slabinfo sinfo; 7180d7561c6SGlauber Costa 7190d7561c6SGlauber Costa memset(&sinfo, 0, sizeof(sinfo)); 7200d7561c6SGlauber Costa get_slabinfo(s, &sinfo); 7210d7561c6SGlauber Costa 722749c5415SGlauber Costa memcg_accumulate_slabinfo(s, &sinfo); 723749c5415SGlauber Costa 7240d7561c6SGlauber Costa seq_printf(m, "%-17s %6lu %6lu %6u %4u %4d", 725749c5415SGlauber Costa cache_name(s), sinfo.active_objs, sinfo.num_objs, s->size, 7260d7561c6SGlauber Costa sinfo.objects_per_slab, (1 << sinfo.cache_order)); 7270d7561c6SGlauber Costa 7280d7561c6SGlauber Costa seq_printf(m, " : tunables %4u %4u %4u", 7290d7561c6SGlauber Costa sinfo.limit, sinfo.batchcount, sinfo.shared); 7300d7561c6SGlauber Costa seq_printf(m, " : slabdata %6lu %6lu %6lu", 7310d7561c6SGlauber Costa sinfo.active_slabs, sinfo.num_slabs, sinfo.shared_avail); 7320d7561c6SGlauber Costa slabinfo_show_stats(m, s); 7330d7561c6SGlauber Costa seq_putc(m, '\n'); 7340d7561c6SGlauber Costa return 0; 735b7454ad3SGlauber Costa } 736b7454ad3SGlauber Costa 737749c5415SGlauber Costa static int s_show(struct seq_file *m, void *p) 738749c5415SGlauber Costa { 739749c5415SGlauber Costa struct kmem_cache *s = list_entry(p, struct kmem_cache, list); 740749c5415SGlauber Costa 741749c5415SGlauber Costa if (!is_root_cache(s)) 742749c5415SGlauber Costa return 0; 743749c5415SGlauber Costa return cache_show(s, m); 744749c5415SGlauber Costa } 745749c5415SGlauber Costa 746b7454ad3SGlauber Costa /* 747b7454ad3SGlauber Costa * slabinfo_op - iterator that generates /proc/slabinfo 748b7454ad3SGlauber Costa * 749b7454ad3SGlauber Costa * Output layout: 750b7454ad3SGlauber Costa * cache-name 751b7454ad3SGlauber Costa * num-active-objs 752b7454ad3SGlauber Costa * total-objs 753b7454ad3SGlauber Costa * object size 754b7454ad3SGlauber Costa * num-active-slabs 755b7454ad3SGlauber Costa * total-slabs 756b7454ad3SGlauber Costa * num-pages-per-slab 757b7454ad3SGlauber Costa * + further values on SMP and with statistics enabled 758b7454ad3SGlauber Costa */ 759b7454ad3SGlauber Costa static const struct seq_operations slabinfo_op = { 760b7454ad3SGlauber Costa .start = s_start, 761276a2439SWanpeng Li .next = slab_next, 762276a2439SWanpeng Li .stop = slab_stop, 763b7454ad3SGlauber Costa .show = s_show, 764b7454ad3SGlauber Costa }; 765b7454ad3SGlauber Costa 766b7454ad3SGlauber Costa static int slabinfo_open(struct inode *inode, struct file *file) 767b7454ad3SGlauber Costa { 768b7454ad3SGlauber Costa return seq_open(file, &slabinfo_op); 769b7454ad3SGlauber Costa } 770b7454ad3SGlauber Costa 771b7454ad3SGlauber Costa static const struct file_operations proc_slabinfo_operations = { 772b7454ad3SGlauber Costa .open = slabinfo_open, 773b7454ad3SGlauber Costa .read = seq_read, 774b7454ad3SGlauber Costa .write = slabinfo_write, 775b7454ad3SGlauber Costa .llseek = seq_lseek, 776b7454ad3SGlauber Costa .release = seq_release, 777b7454ad3SGlauber Costa }; 778b7454ad3SGlauber Costa 779b7454ad3SGlauber Costa static int __init slab_proc_init(void) 780b7454ad3SGlauber Costa { 781e9b4db2bSWanpeng Li proc_create("slabinfo", SLABINFO_RIGHTS, NULL, 782e9b4db2bSWanpeng Li &proc_slabinfo_operations); 783b7454ad3SGlauber Costa return 0; 784b7454ad3SGlauber Costa } 785b7454ad3SGlauber Costa module_init(slab_proc_init); 786b7454ad3SGlauber Costa #endif /* CONFIG_SLABINFO */ 787