1
2
3
4
5
6#include <linux/slab.h>
7
8#include <linux/mm.h>
9#include <linux/poison.h>
10#include <linux/interrupt.h>
11#include <linux/memory.h>
12#include <linux/compiler.h>
13#include <linux/module.h>
14#include <linux/cpu.h>
15#include <linux/uaccess.h>
16#include <linux/seq_file.h>
17#include <linux/proc_fs.h>
18#include <asm/cacheflush.h>
19#include <asm/tlbflush.h>
20#include <asm/page.h>
21#include <linux/memcontrol.h>
22
23#include "slab.h"
24
25enum slab_state slab_state;
26LIST_HEAD(slab_caches);
27DEFINE_MUTEX(slab_mutex);
28struct kmem_cache *kmem_cache;
29
30#ifdef CONFIG_DEBUG_VM
31static int kmem_cache_sanity_check(struct mem_cgroup *memcg, const char *name,
32 size_t size)
33{
34 struct kmem_cache *s = NULL;
35
36 if (!name || in_interrupt() || size < sizeof(void *) ||
37 size > KMALLOC_MAX_SIZE) {
38 pr_err("kmem_cache_create(%s) integrity check failed\n", name);
39 return -EINVAL;
40 }
41
42 list_for_each_entry(s, &slab_caches, list) {
43 char tmp;
44 int res;
45
46
47
48
49
50
51 res = probe_kernel_address(s->name, tmp);
52 if (res) {
53 pr_err("Slab cache with size %d has lost its name\n",
54 s->object_size);
55 continue;
56 }
57
58
59
60
61
62
63
64 if (!memcg && !strcmp(s->name, name)) {
65 pr_err("%s (%s): Cache name already exists.\n",
66 __func__, name);
67 dump_stack();
68 s = NULL;
69 return -EINVAL;
70 }
71 }
72
73 WARN_ON(strchr(name, ' '));
74 return 0;
75}
76#else
77static inline int kmem_cache_sanity_check(struct mem_cgroup *memcg,
78 const char *name, size_t size)
79{
80 return 0;
81}
82#endif
83
84#ifdef CONFIG_MEMCG_KMEM
85int memcg_update_all_caches(int num_memcgs)
86{
87 struct kmem_cache *s;
88 int ret = 0;
89 mutex_lock(&slab_mutex);
90
91 list_for_each_entry(s, &slab_caches, list) {
92 if (!is_root_cache(s))
93 continue;
94
95 ret = memcg_update_cache_size(s, num_memcgs);
96
97
98
99
100
101 if (ret)
102 goto out;
103 }
104
105 memcg_update_array_size(num_memcgs);
106out:
107 mutex_unlock(&slab_mutex);
108 return ret;
109}
110#endif
111
112
113
114
115
116unsigned long calculate_alignment(unsigned long flags,
117 unsigned long align, unsigned long size)
118{
119
120
121
122
123
124
125
126 if (flags & SLAB_HWCACHE_ALIGN) {
127 unsigned long ralign = cache_line_size();
128 while (size <= ralign / 2)
129 ralign /= 2;
130 align = max(align, ralign);
131 }
132
133 if (align < ARCH_SLAB_MINALIGN)
134 align = ARCH_SLAB_MINALIGN;
135
136 return ALIGN(align, sizeof(void *));
137}
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165struct kmem_cache *
166kmem_cache_create_memcg(struct mem_cgroup *memcg, const char *name, size_t size,
167 size_t align, unsigned long flags, void (*ctor)(void *),
168 struct kmem_cache *parent_cache)
169{
170 struct kmem_cache *s = NULL;
171 int err = 0;
172
173 get_online_cpus();
174 mutex_lock(&slab_mutex);
175
176 if (!kmem_cache_sanity_check(memcg, name, size) == 0)
177 goto out_locked;
178
179
180
181
182
183
184
185 flags &= CACHE_CREATE_MASK;
186
187 s = __kmem_cache_alias(memcg, name, size, align, flags, ctor);
188 if (s)
189 goto out_locked;
190
191 s = kmem_cache_zalloc(kmem_cache, GFP_KERNEL);
192 if (s) {
193 s->object_size = s->size = size;
194 s->align = calculate_alignment(flags, align, size);
195 s->ctor = ctor;
196
197 if (memcg_register_cache(memcg, s, parent_cache)) {
198 kmem_cache_free(kmem_cache, s);
199 err = -ENOMEM;
200 goto out_locked;
201 }
202
203 s->name = kstrdup(name, GFP_KERNEL);
204 if (!s->name) {
205 kmem_cache_free(kmem_cache, s);
206 err = -ENOMEM;
207 goto out_locked;
208 }
209
210 err = __kmem_cache_create(s, flags);
211 if (!err) {
212 s->refcount = 1;
213 list_add(&s->list, &slab_caches);
214 memcg_cache_list_add(memcg, s);
215 } else {
216 kfree(s->name);
217 kmem_cache_free(kmem_cache, s);
218 }
219 } else
220 err = -ENOMEM;
221
222out_locked:
223 mutex_unlock(&slab_mutex);
224 put_online_cpus();
225
226 if (err) {
227
228 if (flags & SLAB_PANIC)
229 panic("kmem_cache_create: Failed to create slab '%s'. Error %d\n",
230 name, err);
231 else {
232 printk(KERN_WARNING "kmem_cache_create(%s) failed with error %d",
233 name, err);
234 dump_stack();
235 }
236
237 return NULL;
238 }
239
240 return s;
241}
242
243struct kmem_cache *
244kmem_cache_create(const char *name, size_t size, size_t align,
245 unsigned long flags, void (*ctor)(void *))
246{
247 return kmem_cache_create_memcg(NULL, name, size, align, flags, ctor, NULL);
248}
249EXPORT_SYMBOL(kmem_cache_create);
250
251void kmem_cache_destroy(struct kmem_cache *s)
252{
253
254 kmem_cache_destroy_memcg_children(s);
255
256 get_online_cpus();
257 mutex_lock(&slab_mutex);
258 s->refcount--;
259 if (!s->refcount) {
260 list_del(&s->list);
261
262 if (!__kmem_cache_shutdown(s)) {
263 mutex_unlock(&slab_mutex);
264 if (s->flags & SLAB_DESTROY_BY_RCU)
265 rcu_barrier();
266
267 memcg_release_cache(s);
268 kfree(s->name);
269 kmem_cache_free(kmem_cache, s);
270 } else {
271 list_add(&s->list, &slab_caches);
272 mutex_unlock(&slab_mutex);
273 printk(KERN_ERR "kmem_cache_destroy %s: Slab cache still has objects\n",
274 s->name);
275 dump_stack();
276 }
277 } else {
278 mutex_unlock(&slab_mutex);
279 }
280 put_online_cpus();
281}
282EXPORT_SYMBOL(kmem_cache_destroy);
283
284int slab_is_available(void)
285{
286 return slab_state >= UP;
287}
288
289#ifndef CONFIG_SLOB
290
291void __init create_boot_cache(struct kmem_cache *s, const char *name, size_t size,
292 unsigned long flags)
293{
294 int err;
295
296 s->name = name;
297 s->size = s->object_size = size;
298 s->align = calculate_alignment(flags, ARCH_KMALLOC_MINALIGN, size);
299 err = __kmem_cache_create(s, flags);
300
301 if (err)
302 panic("Creation of kmalloc slab %s size=%zu failed. Reason %d\n",
303 name, size, err);
304
305 s->refcount = -1;
306}
307
308struct kmem_cache *__init create_kmalloc_cache(const char *name, size_t size,
309 unsigned long flags)
310{
311 struct kmem_cache *s = kmem_cache_zalloc(kmem_cache, GFP_NOWAIT);
312
313 if (!s)
314 panic("Out of memory when creating slab %s\n", name);
315
316 create_boot_cache(s, name, size, flags);
317 list_add(&s->list, &slab_caches);
318 s->refcount = 1;
319 return s;
320}
321
322struct kmem_cache *kmalloc_caches[KMALLOC_SHIFT_HIGH + 1];
323EXPORT_SYMBOL(kmalloc_caches);
324
325#ifdef CONFIG_ZONE_DMA
326struct kmem_cache *kmalloc_dma_caches[KMALLOC_SHIFT_HIGH + 1];
327EXPORT_SYMBOL(kmalloc_dma_caches);
328#endif
329
330
331
332
333
334
335
336static s8 size_index[24] = {
337 3,
338 4,
339 5,
340 5,
341 6,
342 6,
343 6,
344 6,
345 1,
346 1,
347 1,
348 1,
349 7,
350 7,
351 7,
352 7,
353 2,
354 2,
355 2,
356 2,
357 2,
358 2,
359 2,
360 2
361};
362
363static inline int size_index_elem(size_t bytes)
364{
365 return (bytes - 1) / 8;
366}
367
368
369
370
371
372struct kmem_cache *kmalloc_slab(size_t size, gfp_t flags)
373{
374 int index;
375
376 if (size > KMALLOC_MAX_SIZE) {
377 WARN_ON_ONCE(!(flags & __GFP_NOWARN));
378 return NULL;
379 }
380
381 if (size <= 192) {
382 if (!size)
383 return ZERO_SIZE_PTR;
384
385 index = size_index[size_index_elem(size)];
386 } else
387 index = fls(size - 1);
388
389#ifdef CONFIG_ZONE_DMA
390 if (unlikely((flags & GFP_DMA)))
391 return kmalloc_dma_caches[index];
392
393#endif
394 return kmalloc_caches[index];
395}
396
397
398
399
400
401
402void __init create_kmalloc_caches(unsigned long flags)
403{
404 int i;
405
406
407
408
409
410
411
412
413
414
415
416
417 BUILD_BUG_ON(KMALLOC_MIN_SIZE > 256 ||
418 (KMALLOC_MIN_SIZE & (KMALLOC_MIN_SIZE - 1)));
419
420 for (i = 8; i < KMALLOC_MIN_SIZE; i += 8) {
421 int elem = size_index_elem(i);
422
423 if (elem >= ARRAY_SIZE(size_index))
424 break;
425 size_index[elem] = KMALLOC_SHIFT_LOW;
426 }
427
428 if (KMALLOC_MIN_SIZE >= 64) {
429
430
431
432
433 for (i = 64 + 8; i <= 96; i += 8)
434 size_index[size_index_elem(i)] = 7;
435
436 }
437
438 if (KMALLOC_MIN_SIZE >= 128) {
439
440
441
442
443
444 for (i = 128 + 8; i <= 192; i += 8)
445 size_index[size_index_elem(i)] = 8;
446 }
447 for (i = KMALLOC_SHIFT_LOW; i <= KMALLOC_SHIFT_HIGH; i++) {
448 if (!kmalloc_caches[i]) {
449 kmalloc_caches[i] = create_kmalloc_cache(NULL,
450 1 << i, flags);
451 }
452
453
454
455
456
457
458 if (KMALLOC_MIN_SIZE <= 32 && !kmalloc_caches[1] && i == 6)
459 kmalloc_caches[1] = create_kmalloc_cache(NULL, 96, flags);
460
461 if (KMALLOC_MIN_SIZE <= 64 && !kmalloc_caches[2] && i == 7)
462 kmalloc_caches[2] = create_kmalloc_cache(NULL, 192, flags);
463 }
464
465
466 slab_state = UP;
467
468 for (i = 0; i <= KMALLOC_SHIFT_HIGH; i++) {
469 struct kmem_cache *s = kmalloc_caches[i];
470 char *n;
471
472 if (s) {
473 n = kasprintf(GFP_NOWAIT, "kmalloc-%d", kmalloc_size(i));
474
475 BUG_ON(!n);
476 s->name = n;
477 }
478 }
479
480#ifdef CONFIG_ZONE_DMA
481 for (i = 0; i <= KMALLOC_SHIFT_HIGH; i++) {
482 struct kmem_cache *s = kmalloc_caches[i];
483
484 if (s) {
485 int size = kmalloc_size(i);
486 char *n = kasprintf(GFP_NOWAIT,
487 "dma-kmalloc-%d", size);
488
489 BUG_ON(!n);
490 kmalloc_dma_caches[i] = create_kmalloc_cache(n,
491 size, SLAB_CACHE_DMA | flags);
492 }
493 }
494#endif
495}
496#endif
497
498
499#ifdef CONFIG_SLABINFO
500
501#ifdef CONFIG_SLAB
502#define SLABINFO_RIGHTS (S_IWUSR | S_IRUSR)
503#else
504#define SLABINFO_RIGHTS S_IRUSR
505#endif
506
507void print_slabinfo_header(struct seq_file *m)
508{
509
510
511
512
513#ifdef CONFIG_DEBUG_SLAB
514 seq_puts(m, "slabinfo - version: 2.1 (statistics)\n");
515#else
516 seq_puts(m, "slabinfo - version: 2.1\n");
517#endif
518 seq_puts(m, "# name <active_objs> <num_objs> <objsize> "
519 "<objperslab> <pagesperslab>");
520 seq_puts(m, " : tunables <limit> <batchcount> <sharedfactor>");
521 seq_puts(m, " : slabdata <active_slabs> <num_slabs> <sharedavail>");
522#ifdef CONFIG_DEBUG_SLAB
523 seq_puts(m, " : globalstat <listallocs> <maxobjs> <grown> <reaped> "
524 "<error> <maxfreeable> <nodeallocs> <remotefrees> <alienoverflow>");
525 seq_puts(m, " : cpustat <allochit> <allocmiss> <freehit> <freemiss>");
526#endif
527 seq_putc(m, '\n');
528}
529
530static void *s_start(struct seq_file *m, loff_t *pos)
531{
532 loff_t n = *pos;
533
534 mutex_lock(&slab_mutex);
535 if (!n)
536 print_slabinfo_header(m);
537
538 return seq_list_start(&slab_caches, *pos);
539}
540
541void *slab_next(struct seq_file *m, void *p, loff_t *pos)
542{
543 return seq_list_next(p, &slab_caches, pos);
544}
545
546void slab_stop(struct seq_file *m, void *p)
547{
548 mutex_unlock(&slab_mutex);
549}
550
551static void
552memcg_accumulate_slabinfo(struct kmem_cache *s, struct slabinfo *info)
553{
554 struct kmem_cache *c;
555 struct slabinfo sinfo;
556 int i;
557
558 if (!is_root_cache(s))
559 return;
560
561 for_each_memcg_cache_index(i) {
562 c = cache_from_memcg(s, i);
563 if (!c)
564 continue;
565
566 memset(&sinfo, 0, sizeof(sinfo));
567 get_slabinfo(c, &sinfo);
568
569 info->active_slabs += sinfo.active_slabs;
570 info->num_slabs += sinfo.num_slabs;
571 info->shared_avail += sinfo.shared_avail;
572 info->active_objs += sinfo.active_objs;
573 info->num_objs += sinfo.num_objs;
574 }
575}
576
577int cache_show(struct kmem_cache *s, struct seq_file *m)
578{
579 struct slabinfo sinfo;
580
581 memset(&sinfo, 0, sizeof(sinfo));
582 get_slabinfo(s, &sinfo);
583
584 memcg_accumulate_slabinfo(s, &sinfo);
585
586 seq_printf(m, "%-17s %6lu %6lu %6u %4u %4d",
587 cache_name(s), sinfo.active_objs, sinfo.num_objs, s->size,
588 sinfo.objects_per_slab, (1 << sinfo.cache_order));
589
590 seq_printf(m, " : tunables %4u %4u %4u",
591 sinfo.limit, sinfo.batchcount, sinfo.shared);
592 seq_printf(m, " : slabdata %6lu %6lu %6lu",
593 sinfo.active_slabs, sinfo.num_slabs, sinfo.shared_avail);
594 slabinfo_show_stats(m, s);
595 seq_putc(m, '\n');
596 return 0;
597}
598
599static int s_show(struct seq_file *m, void *p)
600{
601 struct kmem_cache *s = list_entry(p, struct kmem_cache, list);
602
603 if (!is_root_cache(s))
604 return 0;
605 return cache_show(s, m);
606}
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621static const struct seq_operations slabinfo_op = {
622 .start = s_start,
623 .next = slab_next,
624 .stop = slab_stop,
625 .show = s_show,
626};
627
628static int slabinfo_open(struct inode *inode, struct file *file)
629{
630 return seq_open(file, &slabinfo_op);
631}
632
633static const struct file_operations proc_slabinfo_operations = {
634 .open = slabinfo_open,
635 .read = seq_read,
636 .write = slabinfo_write,
637 .llseek = seq_lseek,
638 .release = seq_release,
639};
640
641static int __init slab_proc_init(void)
642{
643 proc_create("slabinfo", SLABINFO_RIGHTS, NULL,
644 &proc_slabinfo_operations);
645 return 0;
646}
647module_init(slab_proc_init);
648#endif
649