1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80#include <linux/config.h>
81#include <linux/slab.h>
82#include <linux/mm.h>
83#include <linux/swap.h>
84#include <linux/cache.h>
85#include <linux/interrupt.h>
86#include <linux/init.h>
87#include <linux/compiler.h>
88#include <linux/seq_file.h>
89#include <linux/notifier.h>
90#include <linux/kallsyms.h>
91#include <linux/cpu.h>
92#include <linux/sysctl.h>
93#include <linux/module.h>
94#include <linux/rcupdate.h>
95
96#include <asm/uaccess.h>
97#include <asm/cacheflush.h>
98#include <asm/tlbflush.h>
99#include <asm/page.h>
100
101
102
103
104
105
106
107
108
109
110
111
112#ifdef CONFIG_DEBUG_SLAB
113#define DEBUG 1
114#define STATS 1
115#define FORCED_DEBUG 1
116#else
117#define DEBUG 0
118#define STATS 0
119#define FORCED_DEBUG 0
120#endif
121
122
123
124#define BYTES_PER_WORD sizeof(void *)
125
126#ifndef cache_line_size
127#define cache_line_size() L1_CACHE_BYTES
128#endif
129
130#ifndef ARCH_KMALLOC_MINALIGN
131#define ARCH_KMALLOC_MINALIGN 0
132#endif
133
134#ifndef ARCH_KMALLOC_FLAGS
135#define ARCH_KMALLOC_FLAGS SLAB_HWCACHE_ALIGN
136#endif
137
138
139#if DEBUG
140# define CREATE_MASK (SLAB_DEBUG_INITIAL | SLAB_RED_ZONE | \
141 SLAB_POISON | SLAB_HWCACHE_ALIGN | \
142 SLAB_NO_REAP | SLAB_CACHE_DMA | \
143 SLAB_MUST_HWCACHE_ALIGN | SLAB_STORE_USER | \
144 SLAB_RECLAIM_ACCOUNT | SLAB_PANIC | \
145 SLAB_DESTROY_BY_RCU)
146#else
147# define CREATE_MASK (SLAB_HWCACHE_ALIGN | SLAB_NO_REAP | \
148 SLAB_CACHE_DMA | SLAB_MUST_HWCACHE_ALIGN | \
149 SLAB_RECLAIM_ACCOUNT | SLAB_PANIC | \
150 SLAB_DESTROY_BY_RCU)
151#endif
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172#define BUFCTL_END (((kmem_bufctl_t)(~0U))-0)
173#define BUFCTL_FREE (((kmem_bufctl_t)(~0U))-1)
174#define SLAB_LIMIT (((kmem_bufctl_t)(~0U))-2)
175
176
177
178
179static unsigned long offslab_limit;
180
181
182
183
184
185
186
187
188struct slab {
189 struct list_head list;
190 unsigned long colouroff;
191 void *s_mem;
192 unsigned int inuse;
193 kmem_bufctl_t free;
194};
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212struct slab_rcu {
213 struct rcu_head head;
214 kmem_cache_t *cachep;
215 void *addr;
216};
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231struct array_cache {
232 unsigned int avail;
233 unsigned int limit;
234 unsigned int batchcount;
235 unsigned int touched;
236};
237
238
239
240
241#define BOOT_CPUCACHE_ENTRIES 1
242struct arraycache_init {
243 struct array_cache cache;
244 void * entries[BOOT_CPUCACHE_ENTRIES];
245};
246
247
248
249
250
251
252
253
254struct kmem_list3 {
255 struct list_head slabs_partial;
256 struct list_head slabs_full;
257 struct list_head slabs_free;
258 unsigned long free_objects;
259 int free_touched;
260 unsigned long next_reap;
261 struct array_cache *shared;
262};
263
264#define LIST3_INIT(parent) \
265 { \
266 .slabs_full = LIST_HEAD_INIT(parent.slabs_full), \
267 .slabs_partial = LIST_HEAD_INIT(parent.slabs_partial), \
268 .slabs_free = LIST_HEAD_INIT(parent.slabs_free) \
269 }
270#define list3_data(cachep) \
271 (&(cachep)->lists)
272
273
274#define list3_data_ptr(cachep, ptr) \
275 list3_data(cachep)
276
277
278
279
280
281
282
283struct kmem_cache_s {
284
285 struct array_cache *array[NR_CPUS];
286 unsigned int batchcount;
287 unsigned int limit;
288
289 struct kmem_list3 lists;
290
291 unsigned int objsize;
292 unsigned int flags;
293 unsigned int num;
294 unsigned int free_limit;
295 spinlock_t spinlock;
296
297
298
299 unsigned int gfporder;
300
301
302 unsigned int gfpflags;
303
304 size_t colour;
305 unsigned int colour_off;
306 unsigned int colour_next;
307 kmem_cache_t *slabp_cache;
308 unsigned int slab_size;
309 unsigned int dflags;
310
311
312 void (*ctor)(void *, kmem_cache_t *, unsigned long);
313
314
315 void (*dtor)(void *, kmem_cache_t *, unsigned long);
316
317
318 const char *name;
319 struct list_head next;
320
321
322#if STATS
323 unsigned long num_active;
324 unsigned long num_allocations;
325 unsigned long high_mark;
326 unsigned long grown;
327 unsigned long reaped;
328 unsigned long errors;
329 unsigned long max_freeable;
330 atomic_t allochit;
331 atomic_t allocmiss;
332 atomic_t freehit;
333 atomic_t freemiss;
334#endif
335#if DEBUG
336 int dbghead;
337 int reallen;
338#endif
339};
340
341#define CFLGS_OFF_SLAB (0x80000000UL)
342#define OFF_SLAB(x) ((x)->flags & CFLGS_OFF_SLAB)
343
344#define BATCHREFILL_LIMIT 16
345
346
347
348
349
350
351#define REAPTIMEOUT_CPUC (2*HZ)
352#define REAPTIMEOUT_LIST3 (4*HZ)
353
354#if STATS
355#define STATS_INC_ACTIVE(x) ((x)->num_active++)
356#define STATS_DEC_ACTIVE(x) ((x)->num_active--)
357#define STATS_INC_ALLOCED(x) ((x)->num_allocations++)
358#define STATS_INC_GROWN(x) ((x)->grown++)
359#define STATS_INC_REAPED(x) ((x)->reaped++)
360#define STATS_SET_HIGH(x) do { if ((x)->num_active > (x)->high_mark) \
361 (x)->high_mark = (x)->num_active; \
362 } while (0)
363#define STATS_INC_ERR(x) ((x)->errors++)
364#define STATS_SET_FREEABLE(x, i) \
365 do { if ((x)->max_freeable < i) \
366 (x)->max_freeable = i; \
367 } while (0)
368
369#define STATS_INC_ALLOCHIT(x) atomic_inc(&(x)->allochit)
370#define STATS_INC_ALLOCMISS(x) atomic_inc(&(x)->allocmiss)
371#define STATS_INC_FREEHIT(x) atomic_inc(&(x)->freehit)
372#define STATS_INC_FREEMISS(x) atomic_inc(&(x)->freemiss)
373#else
374#define STATS_INC_ACTIVE(x) do { } while (0)
375#define STATS_DEC_ACTIVE(x) do { } while (0)
376#define STATS_INC_ALLOCED(x) do { } while (0)
377#define STATS_INC_GROWN(x) do { } while (0)
378#define STATS_INC_REAPED(x) do { } while (0)
379#define STATS_SET_HIGH(x) do { } while (0)
380#define STATS_INC_ERR(x) do { } while (0)
381#define STATS_SET_FREEABLE(x, i) \
382 do { } while (0)
383
384#define STATS_INC_ALLOCHIT(x) do { } while (0)
385#define STATS_INC_ALLOCMISS(x) do { } while (0)
386#define STATS_INC_FREEHIT(x) do { } while (0)
387#define STATS_INC_FREEMISS(x) do { } while (0)
388#endif
389
390#if DEBUG
391
392
393
394#define RED_INACTIVE 0x5A2CF071UL
395#define RED_ACTIVE 0x170FC2A5UL
396
397
398#define POISON_INUSE 0x5a
399#define POISON_FREE 0x6b
400#define POISON_END 0xa5
401
402
403
404
405
406
407
408
409
410
411
412
413static int obj_dbghead(kmem_cache_t *cachep)
414{
415 return cachep->dbghead;
416}
417
418static int obj_reallen(kmem_cache_t *cachep)
419{
420 return cachep->reallen;
421}
422
423static unsigned long *dbg_redzone1(kmem_cache_t *cachep, void *objp)
424{
425 BUG_ON(!(cachep->flags & SLAB_RED_ZONE));
426 return (unsigned long*) (objp+obj_dbghead(cachep)-BYTES_PER_WORD);
427}
428
429static unsigned long *dbg_redzone2(kmem_cache_t *cachep, void *objp)
430{
431 BUG_ON(!(cachep->flags & SLAB_RED_ZONE));
432 if (cachep->flags & SLAB_STORE_USER)
433 return (unsigned long*) (objp+cachep->objsize-2*BYTES_PER_WORD);
434 return (unsigned long*) (objp+cachep->objsize-BYTES_PER_WORD);
435}
436
437static void **dbg_userword(kmem_cache_t *cachep, void *objp)
438{
439 BUG_ON(!(cachep->flags & SLAB_STORE_USER));
440 return (void**)(objp+cachep->objsize-BYTES_PER_WORD);
441}
442
443#else
444
445#define obj_dbghead(x) 0
446#define obj_reallen(cachep) (cachep->objsize)
447#define dbg_redzone1(cachep, objp) ({BUG(); (unsigned long *)NULL;})
448#define dbg_redzone2(cachep, objp) ({BUG(); (unsigned long *)NULL;})
449#define dbg_userword(cachep, objp) ({BUG(); (void **)NULL;})
450
451#endif
452
453
454
455
456
457#if defined(CONFIG_LARGE_ALLOCS)
458#define MAX_OBJ_ORDER 13
459#define MAX_GFP_ORDER 13
460#elif defined(CONFIG_MMU)
461#define MAX_OBJ_ORDER 5
462#define MAX_GFP_ORDER 5
463#else
464#define MAX_OBJ_ORDER 8
465#define MAX_GFP_ORDER 8
466#endif
467
468
469
470
471#define BREAK_GFP_ORDER_HI 1
472#define BREAK_GFP_ORDER_LO 0
473static int slab_break_gfp_order = BREAK_GFP_ORDER_LO;
474
475
476
477
478
479#define SET_PAGE_CACHE(pg,x) ((pg)->lru.next = (struct list_head *)(x))
480#define GET_PAGE_CACHE(pg) ((kmem_cache_t *)(pg)->lru.next)
481#define SET_PAGE_SLAB(pg,x) ((pg)->lru.prev = (struct list_head *)(x))
482#define GET_PAGE_SLAB(pg) ((struct slab *)(pg)->lru.prev)
483
484
485struct cache_sizes malloc_sizes[] = {
486#define CACHE(x) { .cs_size = (x) },
487#include <linux/kmalloc_sizes.h>
488 { 0, }
489#undef CACHE
490};
491
492EXPORT_SYMBOL(malloc_sizes);
493
494
495struct cache_names {
496 char *name;
497 char *name_dma;
498};
499
500static struct cache_names __initdata cache_names[] = {
501#define CACHE(x) { .name = "size-" #x, .name_dma = "size-" #x "(DMA)" },
502#include <linux/kmalloc_sizes.h>
503 { NULL, }
504#undef CACHE
505};
506
507static struct arraycache_init initarray_cache __initdata =
508 { { 0, BOOT_CPUCACHE_ENTRIES, 1, 0} };
509static struct arraycache_init initarray_generic =
510 { { 0, BOOT_CPUCACHE_ENTRIES, 1, 0} };
511
512
513static kmem_cache_t cache_cache = {
514 .lists = LIST3_INIT(cache_cache.lists),
515 .batchcount = 1,
516 .limit = BOOT_CPUCACHE_ENTRIES,
517 .objsize = sizeof(kmem_cache_t),
518 .flags = SLAB_NO_REAP,
519 .spinlock = SPIN_LOCK_UNLOCKED,
520 .name = "kmem_cache",
521#if DEBUG
522 .reallen = sizeof(kmem_cache_t),
523#endif
524};
525
526
527static struct semaphore cache_chain_sem;
528static struct list_head cache_chain;
529
530
531
532
533
534
535
536atomic_t slab_reclaim_pages;
537EXPORT_SYMBOL(slab_reclaim_pages);
538
539
540
541
542
543static enum {
544 NONE,
545 PARTIAL,
546 FULL
547} g_cpucache_up;
548
549static DEFINE_PER_CPU(struct work_struct, reap_work);
550
551static void free_block(kmem_cache_t* cachep, void** objpp, int len);
552static void enable_cpucache (kmem_cache_t *cachep);
553static void cache_reap (void *unused);
554
555static inline void ** ac_entry(struct array_cache *ac)
556{
557 return (void**)(ac+1);
558}
559
560static inline struct array_cache *ac_data(kmem_cache_t *cachep)
561{
562 return cachep->array[smp_processor_id()];
563}
564
565static kmem_cache_t * kmem_find_general_cachep (size_t size, int gfpflags)
566{
567 struct cache_sizes *csizep = malloc_sizes;
568
569
570
571
572
573 for ( ; csizep->cs_size; csizep++) {
574 if (size > csizep->cs_size)
575 continue;
576 break;
577 }
578 return (gfpflags & GFP_DMA) ? csizep->cs_dmacachep : csizep->cs_cachep;
579}
580
581
582static void cache_estimate (unsigned long gfporder, size_t size, size_t align,
583 int flags, size_t *left_over, unsigned int *num)
584{
585 int i;
586 size_t wastage = PAGE_SIZE<<gfporder;
587 size_t extra = 0;
588 size_t base = 0;
589
590 if (!(flags & CFLGS_OFF_SLAB)) {
591 base = sizeof(struct slab);
592 extra = sizeof(kmem_bufctl_t);
593 }
594 i = 0;
595 while (i*size + ALIGN(base+i*extra, align) <= wastage)
596 i++;
597 if (i > 0)
598 i--;
599
600 if (i > SLAB_LIMIT)
601 i = SLAB_LIMIT;
602
603 *num = i;
604 wastage -= i*size;
605 wastage -= ALIGN(base+i*extra, align);
606 *left_over = wastage;
607}
608
609#define slab_error(cachep, msg) __slab_error(__FUNCTION__, cachep, msg)
610
611static void __slab_error(const char *function, kmem_cache_t *cachep, char *msg)
612{
613 printk(KERN_ERR "slab error in %s(): cache `%s': %s\n",
614 function, cachep->name, msg);
615 dump_stack();
616}
617
618
619
620
621
622
623
624
625static void __devinit start_cpu_timer(int cpu)
626{
627 struct work_struct *reap_work = &per_cpu(reap_work, cpu);
628
629
630
631
632
633
634 if (keventd_up() && reap_work->func == NULL) {
635 INIT_WORK(reap_work, cache_reap, NULL);
636 schedule_delayed_work_on(cpu, reap_work, HZ + 3 * cpu);
637 }
638}
639
640static struct array_cache *alloc_arraycache(int cpu, int entries, int batchcount)
641{
642 int memsize = sizeof(void*)*entries+sizeof(struct array_cache);
643 struct array_cache *nc = NULL;
644
645 if (cpu != -1) {
646 nc = kmem_cache_alloc_node(kmem_find_general_cachep(memsize,
647 GFP_KERNEL), cpu_to_node(cpu));
648 }
649 if (!nc)
650 nc = kmalloc(memsize, GFP_KERNEL);
651 if (nc) {
652 nc->avail = 0;
653 nc->limit = entries;
654 nc->batchcount = batchcount;
655 nc->touched = 0;
656 }
657 return nc;
658}
659
660static int __devinit cpuup_callback(struct notifier_block *nfb,
661 unsigned long action,
662 void *hcpu)
663{
664 long cpu = (long)hcpu;
665 kmem_cache_t* cachep;
666
667 switch (action) {
668 case CPU_UP_PREPARE:
669 down(&cache_chain_sem);
670 list_for_each_entry(cachep, &cache_chain, next) {
671 struct array_cache *nc;
672
673 nc = alloc_arraycache(cpu, cachep->limit, cachep->batchcount);
674 if (!nc)
675 goto bad;
676
677 spin_lock_irq(&cachep->spinlock);
678 cachep->array[cpu] = nc;
679 cachep->free_limit = (1+num_online_cpus())*cachep->batchcount
680 + cachep->num;
681 spin_unlock_irq(&cachep->spinlock);
682
683 }
684 up(&cache_chain_sem);
685 break;
686 case CPU_ONLINE:
687 start_cpu_timer(cpu);
688 break;
689#ifdef CONFIG_HOTPLUG_CPU
690 case CPU_DEAD:
691
692 case CPU_UP_CANCELED:
693 down(&cache_chain_sem);
694
695 list_for_each_entry(cachep, &cache_chain, next) {
696 struct array_cache *nc;
697
698 spin_lock_irq(&cachep->spinlock);
699
700 nc = cachep->array[cpu];
701 cachep->array[cpu] = NULL;
702 cachep->free_limit -= cachep->batchcount;
703 free_block(cachep, ac_entry(nc), nc->avail);
704 spin_unlock_irq(&cachep->spinlock);
705 kfree(nc);
706 }
707 up(&cache_chain_sem);
708 break;
709#endif
710 }
711 return NOTIFY_OK;
712bad:
713 up(&cache_chain_sem);
714 return NOTIFY_BAD;
715}
716
717static struct notifier_block cpucache_notifier = { &cpuup_callback, NULL, 0 };
718
719
720
721
722void __init kmem_cache_init(void)
723{
724 size_t left_over;
725 struct cache_sizes *sizes;
726 struct cache_names *names;
727
728
729
730
731
732 if (num_physpages > (32 << 20) >> PAGE_SHIFT)
733 slab_break_gfp_order = BREAK_GFP_ORDER_HI;
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753 init_MUTEX(&cache_chain_sem);
754 INIT_LIST_HEAD(&cache_chain);
755 list_add(&cache_cache.next, &cache_chain);
756 cache_cache.colour_off = cache_line_size();
757 cache_cache.array[smp_processor_id()] = &initarray_cache.cache;
758
759 cache_cache.objsize = ALIGN(cache_cache.objsize, cache_line_size());
760
761 cache_estimate(0, cache_cache.objsize, cache_line_size(), 0,
762 &left_over, &cache_cache.num);
763 if (!cache_cache.num)
764 BUG();
765
766 cache_cache.colour = left_over/cache_cache.colour_off;
767 cache_cache.colour_next = 0;
768 cache_cache.slab_size = ALIGN(cache_cache.num*sizeof(kmem_bufctl_t) +
769 sizeof(struct slab), cache_line_size());
770
771
772 sizes = malloc_sizes;
773 names = cache_names;
774
775 while (sizes->cs_size) {
776
777
778
779
780
781 sizes->cs_cachep = kmem_cache_create(names->name,
782 sizes->cs_size, ARCH_KMALLOC_MINALIGN,
783 (ARCH_KMALLOC_FLAGS | SLAB_PANIC), NULL, NULL);
784
785
786 if (!(OFF_SLAB(sizes->cs_cachep))) {
787 offslab_limit = sizes->cs_size-sizeof(struct slab);
788 offslab_limit /= sizeof(kmem_bufctl_t);
789 }
790
791 sizes->cs_dmacachep = kmem_cache_create(names->name_dma,
792 sizes->cs_size, ARCH_KMALLOC_MINALIGN,
793 (ARCH_KMALLOC_FLAGS | SLAB_CACHE_DMA | SLAB_PANIC),
794 NULL, NULL);
795
796 sizes++;
797 names++;
798 }
799
800 {
801 void * ptr;
802
803 ptr = kmalloc(sizeof(struct arraycache_init), GFP_KERNEL);
804 local_irq_disable();
805 BUG_ON(ac_data(&cache_cache) != &initarray_cache.cache);
806 memcpy(ptr, ac_data(&cache_cache), sizeof(struct arraycache_init));
807 cache_cache.array[smp_processor_id()] = ptr;
808 local_irq_enable();
809
810 ptr = kmalloc(sizeof(struct arraycache_init), GFP_KERNEL);
811 local_irq_disable();
812 BUG_ON(ac_data(malloc_sizes[0].cs_cachep) != &initarray_generic.cache);
813 memcpy(ptr, ac_data(malloc_sizes[0].cs_cachep),
814 sizeof(struct arraycache_init));
815 malloc_sizes[0].cs_cachep->array[smp_processor_id()] = ptr;
816 local_irq_enable();
817 }
818
819
820 {
821 kmem_cache_t *cachep;
822 down(&cache_chain_sem);
823 list_for_each_entry(cachep, &cache_chain, next)
824 enable_cpucache(cachep);
825 up(&cache_chain_sem);
826 }
827
828
829 g_cpucache_up = FULL;
830
831
832
833
834 register_cpu_notifier(&cpucache_notifier);
835
836
837
838
839
840}
841
842static int __init cpucache_init(void)
843{
844 int cpu;
845
846
847
848
849
850 for (cpu = 0; cpu < NR_CPUS; cpu++) {
851 if (cpu_online(cpu))
852 start_cpu_timer(cpu);
853 }
854
855 return 0;
856}
857
858__initcall(cpucache_init);
859
860
861
862
863
864
865
866
867static void *kmem_getpages(kmem_cache_t *cachep, int flags, int nodeid)
868{
869 struct page *page;
870 void *addr;
871 int i;
872
873 flags |= cachep->gfpflags;
874 if (likely(nodeid == -1)) {
875 addr = (void*)__get_free_pages(flags, cachep->gfporder);
876 if (!addr)
877 return NULL;
878 page = virt_to_page(addr);
879 } else {
880 page = alloc_pages_node(nodeid, flags, cachep->gfporder);
881 if (!page)
882 return NULL;
883 addr = page_address(page);
884 }
885
886 i = (1 << cachep->gfporder);
887 if (cachep->flags & SLAB_RECLAIM_ACCOUNT)
888 atomic_add(i, &slab_reclaim_pages);
889 add_page_state(nr_slab, i);
890 while (i--) {
891 SetPageSlab(page);
892 page++;
893 }
894 return addr;
895}
896
897
898
899
900static void kmem_freepages(kmem_cache_t *cachep, void *addr)
901{
902 unsigned long i = (1<<cachep->gfporder);
903 struct page *page = virt_to_page(addr);
904 const unsigned long nr_freed = i;
905
906 while (i--) {
907 if (!TestClearPageSlab(page))
908 BUG();
909 page++;
910 }
911 sub_page_state(nr_slab, nr_freed);
912 if (current->reclaim_state)
913 current->reclaim_state->reclaimed_slab += nr_freed;
914 free_pages((unsigned long)addr, cachep->gfporder);
915 if (cachep->flags & SLAB_RECLAIM_ACCOUNT)
916 atomic_sub(1<<cachep->gfporder, &slab_reclaim_pages);
917}
918
919static void kmem_rcu_free(struct rcu_head *head)
920{
921 struct slab_rcu *slab_rcu = (struct slab_rcu *) head;
922 kmem_cache_t *cachep = slab_rcu->cachep;
923
924 kmem_freepages(cachep, slab_rcu->addr);
925 if (OFF_SLAB(cachep))
926 kmem_cache_free(cachep->slabp_cache, slab_rcu);
927}
928
929#if DEBUG
930
931#ifdef CONFIG_DEBUG_PAGEALLOC
932static void store_stackinfo(kmem_cache_t *cachep, unsigned long *addr, unsigned long caller)
933{
934 int size = obj_reallen(cachep);
935
936 addr = (unsigned long *)&((char*)addr)[obj_dbghead(cachep)];
937
938 if (size < 5*sizeof(unsigned long))
939 return;
940
941 *addr++=0x12345678;
942 *addr++=caller;
943 *addr++=smp_processor_id();
944 size -= 3*sizeof(unsigned long);
945 {
946 unsigned long *sptr = &caller;
947 unsigned long svalue;
948
949 while (!kstack_end(sptr)) {
950 svalue = *sptr++;
951 if (kernel_text_address(svalue)) {
952 *addr++=svalue;
953 size -= sizeof(unsigned long);
954 if (size <= sizeof(unsigned long))
955 break;
956 }
957 }
958
959 }
960 *addr++=0x87654321;
961}
962#endif
963
964static void poison_obj(kmem_cache_t *cachep, void *addr, unsigned char val)
965{
966 int size = obj_reallen(cachep);
967 addr = &((char*)addr)[obj_dbghead(cachep)];
968
969 memset(addr, val, size);
970 *(unsigned char *)(addr+size-1) = POISON_END;
971}
972
973static void dump_line(char *data, int offset, int limit)
974{
975 int i;
976 printk(KERN_ERR "%03x:", offset);
977 for (i=0;i<limit;i++) {
978 printk(" %02x", (unsigned char)data[offset+i]);
979 }
980 printk("\n");
981}
982#endif
983
984#if DEBUG
985
986static void print_objinfo(kmem_cache_t *cachep, void *objp, int lines)
987{
988 int i, size;
989 char *realobj;
990
991 if (cachep->flags & SLAB_RED_ZONE) {
992 printk(KERN_ERR "Redzone: 0x%lx/0x%lx.\n",
993 *dbg_redzone1(cachep, objp),
994 *dbg_redzone2(cachep, objp));
995 }
996
997 if (cachep->flags & SLAB_STORE_USER) {
998 printk(KERN_ERR "Last user: [<%p>]",
999 *dbg_userword(cachep, objp));
1000 print_symbol("(%s)",
1001 (unsigned long)*dbg_userword(cachep, objp));
1002 printk("\n");
1003 }
1004 realobj = (char*)objp+obj_dbghead(cachep);
1005 size = obj_reallen(cachep);
1006 for (i=0; i<size && lines;i+=16, lines--) {
1007 int limit;
1008 limit = 16;
1009 if (i+limit > size)
1010 limit = size-i;
1011 dump_line(realobj, i, limit);
1012 }
1013}
1014
1015static void check_poison_obj(kmem_cache_t *cachep, void *objp)
1016{
1017 char *realobj;
1018 int size, i;
1019 int lines = 0;
1020
1021 realobj = (char*)objp+obj_dbghead(cachep);
1022 size = obj_reallen(cachep);
1023
1024 for (i=0;i<size;i++) {
1025 char exp = POISON_FREE;
1026 if (i == size-1)
1027 exp = POISON_END;
1028 if (realobj[i] != exp) {
1029 int limit;
1030
1031
1032 if (lines == 0) {
1033 printk(KERN_ERR "Slab corruption: start=%p, len=%d\n",
1034 realobj, size);
1035 print_objinfo(cachep, objp, 0);
1036 }
1037
1038 i = (i/16)*16;
1039 limit = 16;
1040 if (i+limit > size)
1041 limit = size-i;
1042 dump_line(realobj, i, limit);
1043 i += 16;
1044 lines++;
1045
1046 if (lines > 5)
1047 break;
1048 }
1049 }
1050 if (lines != 0) {
1051
1052
1053
1054 struct slab *slabp = GET_PAGE_SLAB(virt_to_page(objp));
1055 int objnr;
1056
1057 objnr = (objp-slabp->s_mem)/cachep->objsize;
1058 if (objnr) {
1059 objp = slabp->s_mem+(objnr-1)*cachep->objsize;
1060 realobj = (char*)objp+obj_dbghead(cachep);
1061 printk(KERN_ERR "Prev obj: start=%p, len=%d\n",
1062 realobj, size);
1063 print_objinfo(cachep, objp, 2);
1064 }
1065 if (objnr+1 < cachep->num) {
1066 objp = slabp->s_mem+(objnr+1)*cachep->objsize;
1067 realobj = (char*)objp+obj_dbghead(cachep);
1068 printk(KERN_ERR "Next obj: start=%p, len=%d\n",
1069 realobj, size);
1070 print_objinfo(cachep, objp, 2);
1071 }
1072 }
1073}
1074#endif
1075
1076
1077
1078
1079
1080static void slab_destroy (kmem_cache_t *cachep, struct slab *slabp)
1081{
1082 void *addr = slabp->s_mem - slabp->colouroff;
1083
1084#if DEBUG
1085 int i;
1086 for (i = 0; i < cachep->num; i++) {
1087 void *objp = slabp->s_mem + cachep->objsize * i;
1088
1089 if (cachep->flags & SLAB_POISON) {
1090#ifdef CONFIG_DEBUG_PAGEALLOC
1091 if ((cachep->objsize%PAGE_SIZE)==0 && OFF_SLAB(cachep))
1092 kernel_map_pages(virt_to_page(objp), cachep->objsize/PAGE_SIZE,1);
1093 else
1094 check_poison_obj(cachep, objp);
1095#else
1096 check_poison_obj(cachep, objp);
1097#endif
1098 }
1099 if (cachep->flags & SLAB_RED_ZONE) {
1100 if (*dbg_redzone1(cachep, objp) != RED_INACTIVE)
1101 slab_error(cachep, "start of a freed object "
1102 "was overwritten");
1103 if (*dbg_redzone2(cachep, objp) != RED_INACTIVE)
1104 slab_error(cachep, "end of a freed object "
1105 "was overwritten");
1106 }
1107 if (cachep->dtor && !(cachep->flags & SLAB_POISON))
1108 (cachep->dtor)(objp+obj_dbghead(cachep), cachep, 0);
1109 }
1110#else
1111 if (cachep->dtor) {
1112 int i;
1113 for (i = 0; i < cachep->num; i++) {
1114 void* objp = slabp->s_mem+cachep->objsize*i;
1115 (cachep->dtor)(objp, cachep, 0);
1116 }
1117 }
1118#endif
1119
1120 if (unlikely(cachep->flags & SLAB_DESTROY_BY_RCU)) {
1121 struct slab_rcu *slab_rcu;
1122
1123 slab_rcu = (struct slab_rcu *) slabp;
1124 slab_rcu->cachep = cachep;
1125 slab_rcu->addr = addr;
1126 call_rcu(&slab_rcu->head, kmem_rcu_free);
1127 } else {
1128 kmem_freepages(cachep, addr);
1129 if (OFF_SLAB(cachep))
1130 kmem_cache_free(cachep->slabp_cache, slabp);
1131 }
1132}
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167kmem_cache_t *
1168kmem_cache_create (const char *name, size_t size, size_t align,
1169 unsigned long flags, void (*ctor)(void*, kmem_cache_t *, unsigned long),
1170 void (*dtor)(void*, kmem_cache_t *, unsigned long))
1171{
1172 size_t left_over, slab_size;
1173 kmem_cache_t *cachep = NULL;
1174
1175
1176
1177
1178 if ((!name) ||
1179 in_interrupt() ||
1180 (size < BYTES_PER_WORD) ||
1181 (size > (1<<MAX_OBJ_ORDER)*PAGE_SIZE) ||
1182 (dtor && !ctor)) {
1183 printk(KERN_ERR "%s: Early error in slab %s\n",
1184 __FUNCTION__, name);
1185 BUG();
1186 }
1187
1188#if DEBUG
1189 WARN_ON(strchr(name, ' '));
1190 if ((flags & SLAB_DEBUG_INITIAL) && !ctor) {
1191
1192 printk(KERN_ERR "%s: No con, but init state check "
1193 "requested - %s\n", __FUNCTION__, name);
1194 flags &= ~SLAB_DEBUG_INITIAL;
1195 }
1196
1197#if FORCED_DEBUG
1198
1199
1200
1201
1202
1203
1204 if ((size < 4096 || fls(size-1) == fls(size-1+3*BYTES_PER_WORD)))
1205 flags |= SLAB_RED_ZONE|SLAB_STORE_USER;
1206 if (!(flags & SLAB_DESTROY_BY_RCU))
1207 flags |= SLAB_POISON;
1208#endif
1209 if (flags & SLAB_DESTROY_BY_RCU)
1210 BUG_ON(flags & SLAB_POISON);
1211#endif
1212 if (flags & SLAB_DESTROY_BY_RCU)
1213 BUG_ON(dtor);
1214
1215
1216
1217
1218
1219 if (flags & ~CREATE_MASK)
1220 BUG();
1221
1222 if (align) {
1223
1224
1225
1226 flags &= ~(SLAB_RED_ZONE|SLAB_STORE_USER);
1227 } else {
1228 if (flags & SLAB_HWCACHE_ALIGN) {
1229
1230
1231
1232
1233 align = cache_line_size();
1234 while (size <= align/2)
1235 align /= 2;
1236 } else {
1237 align = BYTES_PER_WORD;
1238 }
1239 }
1240
1241
1242 cachep = (kmem_cache_t *) kmem_cache_alloc(&cache_cache, SLAB_KERNEL);
1243 if (!cachep)
1244 goto opps;
1245 memset(cachep, 0, sizeof(kmem_cache_t));
1246
1247
1248
1249
1250
1251 if (size & (BYTES_PER_WORD-1)) {
1252 size += (BYTES_PER_WORD-1);
1253 size &= ~(BYTES_PER_WORD-1);
1254 }
1255
1256#if DEBUG
1257 cachep->reallen = size;
1258
1259 if (flags & SLAB_RED_ZONE) {
1260
1261 align = BYTES_PER_WORD;
1262
1263
1264 cachep->dbghead += BYTES_PER_WORD;
1265 size += 2*BYTES_PER_WORD;
1266 }
1267 if (flags & SLAB_STORE_USER) {
1268
1269
1270
1271
1272 align = BYTES_PER_WORD;
1273 size += BYTES_PER_WORD;
1274 }
1275#if FORCED_DEBUG && defined(CONFIG_DEBUG_PAGEALLOC)
1276 if (size > 128 && cachep->reallen > cache_line_size() && size < PAGE_SIZE) {
1277 cachep->dbghead += PAGE_SIZE - size;
1278 size = PAGE_SIZE;
1279 }
1280#endif
1281#endif
1282
1283
1284 if (size >= (PAGE_SIZE>>3))
1285
1286
1287
1288
1289 flags |= CFLGS_OFF_SLAB;
1290
1291 size = ALIGN(size, align);
1292
1293 if ((flags & SLAB_RECLAIM_ACCOUNT) && size <= PAGE_SIZE) {
1294
1295
1296
1297
1298
1299 cachep->gfporder = 0;
1300 cache_estimate(cachep->gfporder, size, align, flags,
1301 &left_over, &cachep->num);
1302 } else {
1303
1304
1305
1306
1307
1308
1309
1310 do {
1311 unsigned int break_flag = 0;
1312cal_wastage:
1313 cache_estimate(cachep->gfporder, size, align, flags,
1314 &left_over, &cachep->num);
1315 if (break_flag)
1316 break;
1317 if (cachep->gfporder >= MAX_GFP_ORDER)
1318 break;
1319 if (!cachep->num)
1320 goto next;
1321 if (flags & CFLGS_OFF_SLAB &&
1322 cachep->num > offslab_limit) {
1323
1324 cachep->gfporder--;
1325 break_flag++;
1326 goto cal_wastage;
1327 }
1328
1329
1330
1331
1332
1333 if (cachep->gfporder >= slab_break_gfp_order)
1334 break;
1335
1336 if ((left_over*8) <= (PAGE_SIZE<<cachep->gfporder))
1337 break;
1338next:
1339 cachep->gfporder++;
1340 } while (1);
1341 }
1342
1343 if (!cachep->num) {
1344 printk("kmem_cache_create: couldn't create cache %s.\n", name);
1345 kmem_cache_free(&cache_cache, cachep);
1346 cachep = NULL;
1347 goto opps;
1348 }
1349 slab_size = ALIGN(cachep->num*sizeof(kmem_bufctl_t)
1350 + sizeof(struct slab), align);
1351
1352
1353
1354
1355
1356 if (flags & CFLGS_OFF_SLAB && left_over >= slab_size) {
1357 flags &= ~CFLGS_OFF_SLAB;
1358 left_over -= slab_size;
1359 }
1360
1361 if (flags & CFLGS_OFF_SLAB) {
1362
1363 slab_size = cachep->num*sizeof(kmem_bufctl_t)+sizeof(struct slab);
1364 }
1365
1366 cachep->colour_off = cache_line_size();
1367
1368 if (cachep->colour_off < align)
1369 cachep->colour_off = align;
1370 cachep->colour = left_over/cachep->colour_off;
1371 cachep->slab_size = slab_size;
1372 cachep->flags = flags;
1373 cachep->gfpflags = 0;
1374 if (flags & SLAB_CACHE_DMA)
1375 cachep->gfpflags |= GFP_DMA;
1376 spin_lock_init(&cachep->spinlock);
1377 cachep->objsize = size;
1378
1379 INIT_LIST_HEAD(&cachep->lists.slabs_full);
1380 INIT_LIST_HEAD(&cachep->lists.slabs_partial);
1381 INIT_LIST_HEAD(&cachep->lists.slabs_free);
1382
1383 if (flags & CFLGS_OFF_SLAB)
1384 cachep->slabp_cache = kmem_find_general_cachep(slab_size,0);
1385 cachep->ctor = ctor;
1386 cachep->dtor = dtor;
1387 cachep->name = name;
1388
1389
1390 lock_cpu_hotplug();
1391
1392 if (g_cpucache_up == FULL) {
1393 enable_cpucache(cachep);
1394 } else {
1395 if (g_cpucache_up == NONE) {
1396
1397
1398
1399
1400 cachep->array[smp_processor_id()] =
1401 &initarray_generic.cache;
1402 g_cpucache_up = PARTIAL;
1403 } else {
1404 cachep->array[smp_processor_id()] =
1405 kmalloc(sizeof(struct arraycache_init),
1406 GFP_KERNEL);
1407 }
1408 BUG_ON(!ac_data(cachep));
1409 ac_data(cachep)->avail = 0;
1410 ac_data(cachep)->limit = BOOT_CPUCACHE_ENTRIES;
1411 ac_data(cachep)->batchcount = 1;
1412 ac_data(cachep)->touched = 0;
1413 cachep->batchcount = 1;
1414 cachep->limit = BOOT_CPUCACHE_ENTRIES;
1415 cachep->free_limit = (1+num_online_cpus())*cachep->batchcount
1416 + cachep->num;
1417 }
1418
1419 cachep->lists.next_reap = jiffies + REAPTIMEOUT_LIST3 +
1420 ((unsigned long)cachep)%REAPTIMEOUT_LIST3;
1421
1422
1423 down(&cache_chain_sem);
1424 {
1425 struct list_head *p;
1426 mm_segment_t old_fs;
1427
1428 old_fs = get_fs();
1429 set_fs(KERNEL_DS);
1430 list_for_each(p, &cache_chain) {
1431 kmem_cache_t *pc = list_entry(p, kmem_cache_t, next);
1432 char tmp;
1433
1434
1435
1436
1437
1438
1439#ifdef CONFIG_X86_UACCESS_INDIRECT
1440 if (__direct_get_user(tmp,pc->name)) {
1441#else
1442 if (__get_user(tmp,pc->name)) {
1443#endif
1444 printk("SLAB: cache with size %d has lost its "
1445 "name\n", pc->objsize);
1446 continue;
1447 }
1448 if (!strcmp(pc->name,name)) {
1449 printk("kmem_cache_create: duplicate "
1450 "cache %s\n",name);
1451 up(&cache_chain_sem);
1452 unlock_cpu_hotplug();
1453 BUG();
1454 }
1455 }
1456 set_fs(old_fs);
1457 }
1458
1459
1460 list_add(&cachep->next, &cache_chain);
1461 up(&cache_chain_sem);
1462 unlock_cpu_hotplug();
1463opps:
1464 if (!cachep && (flags & SLAB_PANIC))
1465 panic("kmem_cache_create(): failed to create slab `%s'\n",
1466 name);
1467 return cachep;
1468}
1469EXPORT_SYMBOL(kmem_cache_create);
1470
1471#if DEBUG
1472static void check_irq_off(void)
1473{
1474 BUG_ON(!irqs_disabled());
1475}
1476
1477static void check_irq_on(void)
1478{
1479 BUG_ON(irqs_disabled());
1480}
1481
1482static void check_spinlock_acquired(kmem_cache_t *cachep)
1483{
1484#ifdef CONFIG_SMP
1485 check_irq_off();
1486 BUG_ON(spin_trylock(&cachep->spinlock));
1487#endif
1488}
1489#else
1490#define check_irq_off() do { } while(0)
1491#define check_irq_on() do { } while(0)
1492#define check_spinlock_acquired(x) do { } while(0)
1493#endif
1494
1495
1496
1497
1498static void smp_call_function_all_cpus(void (*func) (void *arg), void *arg)
1499{
1500 check_irq_on();
1501 preempt_disable();
1502
1503 local_irq_disable();
1504 func(arg);
1505 local_irq_enable();
1506
1507 if (smp_call_function(func, arg, 1, 1))
1508 BUG();
1509
1510 preempt_enable();
1511}
1512
1513static void drain_array_locked(kmem_cache_t* cachep,
1514 struct array_cache *ac, int force);
1515
1516static void do_drain(void *arg)
1517{
1518 kmem_cache_t *cachep = (kmem_cache_t*)arg;
1519 struct array_cache *ac;
1520
1521 check_irq_off();
1522 ac = ac_data(cachep);
1523 spin_lock(&cachep->spinlock);
1524 free_block(cachep, &ac_entry(ac)[0], ac->avail);
1525 spin_unlock(&cachep->spinlock);
1526 ac->avail = 0;
1527}
1528
1529static void drain_cpu_caches(kmem_cache_t *cachep)
1530{
1531 smp_call_function_all_cpus(do_drain, cachep);
1532 check_irq_on();
1533 spin_lock_irq(&cachep->spinlock);
1534 if (cachep->lists.shared)
1535 drain_array_locked(cachep, cachep->lists.shared, 1);
1536 spin_unlock_irq(&cachep->spinlock);
1537}
1538
1539
1540
1541static int __cache_shrink(kmem_cache_t *cachep)
1542{
1543 struct slab *slabp;
1544 int ret;
1545
1546 drain_cpu_caches(cachep);
1547
1548 check_irq_on();
1549 spin_lock_irq(&cachep->spinlock);
1550
1551 for(;;) {
1552 struct list_head *p;
1553
1554 p = cachep->lists.slabs_free.prev;
1555 if (p == &cachep->lists.slabs_free)
1556 break;
1557
1558 slabp = list_entry(cachep->lists.slabs_free.prev, struct slab, list);
1559#if DEBUG
1560 if (slabp->inuse)
1561 BUG();
1562#endif
1563 list_del(&slabp->list);
1564
1565 cachep->lists.free_objects -= cachep->num;
1566 spin_unlock_irq(&cachep->spinlock);
1567 slab_destroy(cachep, slabp);
1568 spin_lock_irq(&cachep->spinlock);
1569 }
1570 ret = !list_empty(&cachep->lists.slabs_full) ||
1571 !list_empty(&cachep->lists.slabs_partial);
1572 spin_unlock_irq(&cachep->spinlock);
1573 return ret;
1574}
1575
1576
1577
1578
1579
1580
1581
1582
1583int kmem_cache_shrink(kmem_cache_t *cachep)
1584{
1585 if (!cachep || in_interrupt())
1586 BUG();
1587
1588 return __cache_shrink(cachep);
1589}
1590
1591EXPORT_SYMBOL(kmem_cache_shrink);
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610int kmem_cache_destroy (kmem_cache_t * cachep)
1611{
1612 int i;
1613
1614 if (!cachep || in_interrupt())
1615 BUG();
1616
1617
1618 lock_cpu_hotplug();
1619
1620
1621 down(&cache_chain_sem);
1622
1623
1624
1625 list_del(&cachep->next);
1626 up(&cache_chain_sem);
1627
1628 if (__cache_shrink(cachep)) {
1629 slab_error(cachep, "Can't free all objects");
1630 down(&cache_chain_sem);
1631 list_add(&cachep->next,&cache_chain);
1632 up(&cache_chain_sem);
1633 unlock_cpu_hotplug();
1634 return 1;
1635 }
1636
1637 if (unlikely(cachep->flags & SLAB_DESTROY_BY_RCU))
1638 synchronize_kernel();
1639
1640
1641
1642
1643 for (i = 0; i < NR_CPUS; i++)
1644 kfree(cachep->array[i]);
1645
1646
1647 kfree(cachep->lists.shared);
1648 cachep->lists.shared = NULL;
1649 kmem_cache_free(&cache_cache, cachep);
1650
1651 unlock_cpu_hotplug();
1652
1653 return 0;
1654}
1655
1656EXPORT_SYMBOL(kmem_cache_destroy);
1657
1658
1659static struct slab* alloc_slabmgmt (kmem_cache_t *cachep,
1660 void *objp, int colour_off, int local_flags)
1661{
1662 struct slab *slabp;
1663
1664 if (OFF_SLAB(cachep)) {
1665
1666 slabp = kmem_cache_alloc(cachep->slabp_cache, local_flags);
1667 if (!slabp)
1668 return NULL;
1669 } else {
1670 slabp = objp+colour_off;
1671 colour_off += cachep->slab_size;
1672 }
1673 slabp->inuse = 0;
1674 slabp->colouroff = colour_off;
1675 slabp->s_mem = objp+colour_off;
1676
1677 return slabp;
1678}
1679
1680static inline kmem_bufctl_t *slab_bufctl(struct slab *slabp)
1681{
1682 return (kmem_bufctl_t *)(slabp+1);
1683}
1684
1685static void cache_init_objs (kmem_cache_t * cachep,
1686 struct slab * slabp, unsigned long ctor_flags)
1687{
1688 int i;
1689
1690 for (i = 0; i < cachep->num; i++) {
1691 void* objp = slabp->s_mem+cachep->objsize*i;
1692#if DEBUG
1693
1694 if (cachep->flags & SLAB_POISON)
1695 poison_obj(cachep, objp, POISON_FREE);
1696 if (cachep->flags & SLAB_STORE_USER)
1697 *dbg_userword(cachep, objp) = NULL;
1698
1699 if (cachep->flags & SLAB_RED_ZONE) {
1700 *dbg_redzone1(cachep, objp) = RED_INACTIVE;
1701 *dbg_redzone2(cachep, objp) = RED_INACTIVE;
1702 }
1703
1704
1705
1706
1707
1708 if (cachep->ctor && !(cachep->flags & SLAB_POISON))
1709 cachep->ctor(objp+obj_dbghead(cachep), cachep, ctor_flags);
1710
1711 if (cachep->flags & SLAB_RED_ZONE) {
1712 if (*dbg_redzone2(cachep, objp) != RED_INACTIVE)
1713 slab_error(cachep, "constructor overwrote the"
1714 " end of an object");
1715 if (*dbg_redzone1(cachep, objp) != RED_INACTIVE)
1716 slab_error(cachep, "constructor overwrote the"
1717 " start of an object");
1718 }
1719 if ((cachep->objsize % PAGE_SIZE) == 0 && OFF_SLAB(cachep) && cachep->flags & SLAB_POISON)
1720 kernel_map_pages(virt_to_page(objp), cachep->objsize/PAGE_SIZE, 0);
1721#else
1722 if (cachep->ctor)
1723 cachep->ctor(objp, cachep, ctor_flags);
1724#endif
1725 slab_bufctl(slabp)[i] = i+1;
1726 }
1727 slab_bufctl(slabp)[i-1] = BUFCTL_END;
1728 slabp->free = 0;
1729}
1730
1731static void kmem_flagcheck(kmem_cache_t *cachep, int flags)
1732{
1733 if (flags & SLAB_DMA) {
1734 if (!(cachep->gfpflags & GFP_DMA))
1735 BUG();
1736 } else {
1737 if (cachep->gfpflags & GFP_DMA)
1738 BUG();
1739 }
1740}
1741
1742static void set_slab_attr(kmem_cache_t *cachep, struct slab *slabp, void *objp)
1743{
1744 int i;
1745 struct page *page;
1746
1747
1748 i = 1 << cachep->gfporder;
1749 page = virt_to_page(objp);
1750 do {
1751 SET_PAGE_CACHE(page, cachep);
1752 SET_PAGE_SLAB(page, slabp);
1753 page++;
1754 } while (--i);
1755}
1756
1757
1758
1759
1760
1761static int cache_grow (kmem_cache_t * cachep, int flags)
1762{
1763 struct slab *slabp;
1764 void *objp;
1765 size_t offset;
1766 int local_flags;
1767 unsigned long ctor_flags;
1768
1769
1770
1771
1772 if (flags & ~(SLAB_DMA|SLAB_LEVEL_MASK|SLAB_NO_GROW))
1773 BUG();
1774 if (flags & SLAB_NO_GROW)
1775 return 0;
1776
1777 ctor_flags = SLAB_CTOR_CONSTRUCTOR;
1778 local_flags = (flags & SLAB_LEVEL_MASK);
1779 if (!(local_flags & __GFP_WAIT))
1780
1781
1782
1783
1784 ctor_flags |= SLAB_CTOR_ATOMIC;
1785
1786
1787 check_irq_off();
1788 spin_lock(&cachep->spinlock);
1789
1790
1791 offset = cachep->colour_next;
1792 cachep->colour_next++;
1793 if (cachep->colour_next >= cachep->colour)
1794 cachep->colour_next = 0;
1795 offset *= cachep->colour_off;
1796
1797 spin_unlock(&cachep->spinlock);
1798
1799 if (local_flags & __GFP_WAIT)
1800 local_irq_enable();
1801
1802
1803
1804
1805
1806
1807
1808 kmem_flagcheck(cachep, flags);
1809
1810
1811
1812 if (!(objp = kmem_getpages(cachep, flags, -1)))
1813 goto failed;
1814
1815
1816 if (!(slabp = alloc_slabmgmt(cachep, objp, offset, local_flags)))
1817 goto opps1;
1818
1819 set_slab_attr(cachep, slabp, objp);
1820
1821 cache_init_objs(cachep, slabp, ctor_flags);
1822
1823 if (local_flags & __GFP_WAIT)
1824 local_irq_disable();
1825 check_irq_off();
1826 spin_lock(&cachep->spinlock);
1827
1828
1829 list_add_tail(&slabp->list, &(list3_data(cachep)->slabs_free));
1830 STATS_INC_GROWN(cachep);
1831 list3_data(cachep)->free_objects += cachep->num;
1832 spin_unlock(&cachep->spinlock);
1833 return 1;
1834opps1:
1835 kmem_freepages(cachep, objp);
1836failed:
1837 if (local_flags & __GFP_WAIT)
1838 local_irq_disable();
1839 return 0;
1840}
1841
1842#if DEBUG
1843
1844
1845
1846
1847
1848
1849
1850static void kfree_debugcheck(const void *objp)
1851{
1852 struct page *page;
1853
1854 if (!virt_addr_valid(objp)) {
1855 printk(KERN_ERR "kfree_debugcheck: out of range ptr %lxh.\n",
1856 (unsigned long)objp);
1857 BUG();
1858 }
1859 page = virt_to_page(objp);
1860 if (!PageSlab(page)) {
1861 printk(KERN_ERR "kfree_debugcheck: bad ptr %lxh.\n", (unsigned long)objp);
1862 BUG();
1863 }
1864}
1865
1866static void *cache_free_debugcheck (kmem_cache_t * cachep, void * objp, void *caller)
1867{
1868 struct page *page;
1869 unsigned int objnr;
1870 struct slab *slabp;
1871
1872 objp -= obj_dbghead(cachep);
1873 kfree_debugcheck(objp);
1874 page = virt_to_page(objp);
1875
1876 if (GET_PAGE_CACHE(page) != cachep) {
1877 printk(KERN_ERR "mismatch in kmem_cache_free: expected cache %p, got %p\n",
1878 GET_PAGE_CACHE(page),cachep);
1879 printk(KERN_ERR "%p is %s.\n", cachep, cachep->name);
1880 printk(KERN_ERR "%p is %s.\n", GET_PAGE_CACHE(page), GET_PAGE_CACHE(page)->name);
1881 WARN_ON(1);
1882 }
1883 slabp = GET_PAGE_SLAB(page);
1884
1885 if (cachep->flags & SLAB_RED_ZONE) {
1886 if (*dbg_redzone1(cachep, objp) != RED_ACTIVE || *dbg_redzone2(cachep, objp) != RED_ACTIVE) {
1887 slab_error(cachep, "double free, or memory outside"
1888 " object was overwritten");
1889 printk(KERN_ERR "%p: redzone 1: 0x%lx, redzone 2: 0x%lx.\n",
1890 objp, *dbg_redzone1(cachep, objp), *dbg_redzone2(cachep, objp));
1891 }
1892 *dbg_redzone1(cachep, objp) = RED_INACTIVE;
1893 *dbg_redzone2(cachep, objp) = RED_INACTIVE;
1894 }
1895 if (cachep->flags & SLAB_STORE_USER)
1896 *dbg_userword(cachep, objp) = caller;
1897
1898 objnr = (objp-slabp->s_mem)/cachep->objsize;
1899
1900 BUG_ON(objnr >= cachep->num);
1901 BUG_ON(objp != slabp->s_mem + objnr*cachep->objsize);
1902
1903 if (cachep->flags & SLAB_DEBUG_INITIAL) {
1904
1905
1906
1907
1908 cachep->ctor(objp+obj_dbghead(cachep),
1909 cachep, SLAB_CTOR_CONSTRUCTOR|SLAB_CTOR_VERIFY);
1910 }
1911 if (cachep->flags & SLAB_POISON && cachep->dtor) {
1912
1913
1914
1915 cachep->dtor(objp+obj_dbghead(cachep), cachep, 0);
1916 }
1917 if (cachep->flags & SLAB_POISON) {
1918#ifdef CONFIG_DEBUG_PAGEALLOC
1919 if ((cachep->objsize % PAGE_SIZE) == 0 && OFF_SLAB(cachep)) {
1920 store_stackinfo(cachep, objp, (unsigned long)caller);
1921 kernel_map_pages(virt_to_page(objp), cachep->objsize/PAGE_SIZE, 0);
1922 } else {
1923 poison_obj(cachep, objp, POISON_FREE);
1924 }
1925#else
1926 poison_obj(cachep, objp, POISON_FREE);
1927#endif
1928 }
1929 return objp;
1930}
1931
1932static void check_slabp(kmem_cache_t *cachep, struct slab *slabp)
1933{
1934 int i;
1935 int entries = 0;
1936
1937 check_spinlock_acquired(cachep);
1938
1939 for (i = slabp->free; i != BUFCTL_END; i = slab_bufctl(slabp)[i]) {
1940 entries++;
1941 if (entries > cachep->num || i < 0 || i >= cachep->num)
1942 goto bad;
1943 }
1944 if (entries != cachep->num - slabp->inuse) {
1945 int i;
1946bad:
1947 printk(KERN_ERR "slab: Internal list corruption detected in cache '%s'(%d), slabp %p(%d). Hexdump:\n",
1948 cachep->name, cachep->num, slabp, slabp->inuse);
1949 for (i=0;i<sizeof(slabp)+cachep->num*sizeof(kmem_bufctl_t);i++) {
1950 if ((i%16)==0)
1951 printk("\n%03x:", i);
1952 printk(" %02x", ((unsigned char*)slabp)[i]);
1953 }
1954 printk("\n");
1955 BUG();
1956 }
1957}
1958#else
1959#define kfree_debugcheck(x) do { } while(0)
1960#define cache_free_debugcheck(x,objp,z) (objp)
1961#define check_slabp(x,y) do { } while(0)
1962#endif
1963
1964static void* cache_alloc_refill(kmem_cache_t* cachep, int flags)
1965{
1966 int batchcount;
1967 struct kmem_list3 *l3;
1968 struct array_cache *ac;
1969
1970 check_irq_off();
1971 ac = ac_data(cachep);
1972retry:
1973 batchcount = ac->batchcount;
1974 if (!ac->touched && batchcount > BATCHREFILL_LIMIT) {
1975
1976
1977
1978
1979 batchcount = BATCHREFILL_LIMIT;
1980 }
1981 l3 = list3_data(cachep);
1982
1983 BUG_ON(ac->avail > 0);
1984 spin_lock(&cachep->spinlock);
1985 if (l3->shared) {
1986 struct array_cache *shared_array = l3->shared;
1987 if (shared_array->avail) {
1988 if (batchcount > shared_array->avail)
1989 batchcount = shared_array->avail;
1990 shared_array->avail -= batchcount;
1991 ac->avail = batchcount;
1992 memcpy(ac_entry(ac), &ac_entry(shared_array)[shared_array->avail],
1993 sizeof(void*)*batchcount);
1994 shared_array->touched = 1;
1995 goto alloc_done;
1996 }
1997 }
1998 while (batchcount > 0) {
1999 struct list_head *entry;
2000 struct slab *slabp;
2001
2002 entry = l3->slabs_partial.next;
2003 if (entry == &l3->slabs_partial) {
2004 l3->free_touched = 1;
2005 entry = l3->slabs_free.next;
2006 if (entry == &l3->slabs_free)
2007 goto must_grow;
2008 }
2009
2010 slabp = list_entry(entry, struct slab, list);
2011 check_slabp(cachep, slabp);
2012 check_spinlock_acquired(cachep);
2013 while (slabp->inuse < cachep->num && batchcount--) {
2014 kmem_bufctl_t next;
2015 STATS_INC_ALLOCED(cachep);
2016 STATS_INC_ACTIVE(cachep);
2017 STATS_SET_HIGH(cachep);
2018
2019
2020 ac_entry(ac)[ac->avail++] = slabp->s_mem + slabp->free*cachep->objsize;
2021
2022 slabp->inuse++;
2023 next = slab_bufctl(slabp)[slabp->free];
2024#if DEBUG
2025 slab_bufctl(slabp)[slabp->free] = BUFCTL_FREE;
2026#endif
2027 slabp->free = next;
2028 }
2029 check_slabp(cachep, slabp);
2030
2031
2032 list_del(&slabp->list);
2033 if (slabp->free == BUFCTL_END)
2034 list_add(&slabp->list, &l3->slabs_full);
2035 else
2036 list_add(&slabp->list, &l3->slabs_partial);
2037 }
2038
2039must_grow:
2040 l3->free_objects -= ac->avail;
2041alloc_done:
2042 spin_unlock(&cachep->spinlock);
2043
2044 if (unlikely(!ac->avail)) {
2045 int x;
2046 x = cache_grow(cachep, flags);
2047
2048
2049 ac = ac_data(cachep);
2050 if (!x && ac->avail == 0)
2051 return NULL;
2052
2053 if (!ac->avail)
2054 goto retry;
2055 }
2056 ac->touched = 1;
2057 return ac_entry(ac)[--ac->avail];
2058}
2059
2060static inline void
2061cache_alloc_debugcheck_before(kmem_cache_t *cachep, int flags)
2062{
2063 might_sleep_if(flags & __GFP_WAIT);
2064#if DEBUG
2065 kmem_flagcheck(cachep, flags);
2066#endif
2067}
2068
2069#if DEBUG
2070static void *
2071cache_alloc_debugcheck_after(kmem_cache_t *cachep,
2072 unsigned long flags, void *objp, void *caller)
2073{
2074 if (!objp)
2075 return objp;
2076 if (cachep->flags & SLAB_POISON) {
2077#ifdef CONFIG_DEBUG_PAGEALLOC
2078 if ((cachep->objsize % PAGE_SIZE) == 0 && OFF_SLAB(cachep))
2079 kernel_map_pages(virt_to_page(objp), cachep->objsize/PAGE_SIZE, 1);
2080 else
2081 check_poison_obj(cachep, objp);
2082#else
2083 check_poison_obj(cachep, objp);
2084#endif
2085 poison_obj(cachep, objp, POISON_INUSE);
2086 }
2087 if (cachep->flags & SLAB_STORE_USER)
2088 *dbg_userword(cachep, objp) = caller;
2089
2090 if (cachep->flags & SLAB_RED_ZONE) {
2091 if (*dbg_redzone1(cachep, objp) != RED_INACTIVE || *dbg_redzone2(cachep, objp) != RED_INACTIVE) {
2092 slab_error(cachep, "double free, or memory outside"
2093 " object was overwritten");
2094 printk(KERN_ERR "%p: redzone 1: 0x%lx, redzone 2: 0x%lx.\n",
2095 objp, *dbg_redzone1(cachep, objp), *dbg_redzone2(cachep, objp));
2096 }
2097 *dbg_redzone1(cachep, objp) = RED_ACTIVE;
2098 *dbg_redzone2(cachep, objp) = RED_ACTIVE;
2099 }
2100 objp += obj_dbghead(cachep);
2101 if (cachep->ctor && cachep->flags & SLAB_POISON) {
2102 unsigned long ctor_flags = SLAB_CTOR_CONSTRUCTOR;
2103
2104 if (!(flags & __GFP_WAIT))
2105 ctor_flags |= SLAB_CTOR_ATOMIC;
2106
2107 cachep->ctor(objp, cachep, ctor_flags);
2108 }
2109 return objp;
2110}
2111#else
2112#define cache_alloc_debugcheck_after(a,b,objp,d) (objp)
2113#endif
2114
2115
2116static inline void * __cache_alloc (kmem_cache_t *cachep, int flags)
2117{
2118 unsigned long save_flags;
2119 void* objp;
2120 struct array_cache *ac;
2121
2122 cache_alloc_debugcheck_before(cachep, flags);
2123
2124 local_irq_save(save_flags);
2125 ac = ac_data(cachep);
2126 if (likely(ac->avail)) {
2127 STATS_INC_ALLOCHIT(cachep);
2128 ac->touched = 1;
2129 objp = ac_entry(ac)[--ac->avail];
2130 } else {
2131 STATS_INC_ALLOCMISS(cachep);
2132 objp = cache_alloc_refill(cachep, flags);
2133 }
2134 local_irq_restore(save_flags);
2135 objp = cache_alloc_debugcheck_after(cachep, flags, objp, __builtin_return_address(0));
2136 return objp;
2137}
2138
2139
2140
2141
2142
2143
2144static void free_block(kmem_cache_t *cachep, void **objpp, int nr_objects)
2145{
2146 int i;
2147
2148 check_spinlock_acquired(cachep);
2149
2150
2151 cachep->lists.free_objects += nr_objects;
2152
2153 for (i = 0; i < nr_objects; i++) {
2154 void *objp = objpp[i];
2155 struct slab *slabp;
2156 unsigned int objnr;
2157
2158 slabp = GET_PAGE_SLAB(virt_to_page(objp));
2159 list_del(&slabp->list);
2160 objnr = (objp - slabp->s_mem) / cachep->objsize;
2161 check_slabp(cachep, slabp);
2162#if DEBUG
2163 if (slab_bufctl(slabp)[objnr] != BUFCTL_FREE) {
2164 printk(KERN_ERR "slab: double free detected in cache '%s', objp %p.\n",
2165 cachep->name, objp);
2166 BUG();
2167 }
2168#endif
2169 slab_bufctl(slabp)[objnr] = slabp->free;
2170 slabp->free = objnr;
2171 STATS_DEC_ACTIVE(cachep);
2172 slabp->inuse--;
2173 check_slabp(cachep, slabp);
2174
2175
2176 if (slabp->inuse == 0) {
2177 if (cachep->lists.free_objects > cachep->free_limit) {
2178 cachep->lists.free_objects -= cachep->num;
2179 slab_destroy(cachep, slabp);
2180 } else {
2181 list_add(&slabp->list,
2182 &list3_data_ptr(cachep, objp)->slabs_free);
2183 }
2184 } else {
2185
2186
2187
2188
2189 list_add_tail(&slabp->list,
2190 &list3_data_ptr(cachep, objp)->slabs_partial);
2191 }
2192 }
2193}
2194
2195static void cache_flusharray (kmem_cache_t* cachep, struct array_cache *ac)
2196{
2197 int batchcount;
2198
2199 batchcount = ac->batchcount;
2200#if DEBUG
2201 BUG_ON(!batchcount || batchcount > ac->avail);
2202#endif
2203 check_irq_off();
2204 spin_lock(&cachep->spinlock);
2205 if (cachep->lists.shared) {
2206 struct array_cache *shared_array = cachep->lists.shared;
2207 int max = shared_array->limit-shared_array->avail;
2208 if (max) {
2209 if (batchcount > max)
2210 batchcount = max;
2211 memcpy(&ac_entry(shared_array)[shared_array->avail],
2212 &ac_entry(ac)[0],
2213 sizeof(void*)*batchcount);
2214 shared_array->avail += batchcount;
2215 goto free_done;
2216 }
2217 }
2218
2219 free_block(cachep, &ac_entry(ac)[0], batchcount);
2220free_done:
2221#if STATS
2222 {
2223 int i = 0;
2224 struct list_head *p;
2225
2226 p = list3_data(cachep)->slabs_free.next;
2227 while (p != &(list3_data(cachep)->slabs_free)) {
2228 struct slab *slabp;
2229
2230 slabp = list_entry(p, struct slab, list);
2231 BUG_ON(slabp->inuse);
2232
2233 i++;
2234 p = p->next;
2235 }
2236 STATS_SET_FREEABLE(cachep, i);
2237 }
2238#endif
2239 spin_unlock(&cachep->spinlock);
2240 ac->avail -= batchcount;
2241 memmove(&ac_entry(ac)[0], &ac_entry(ac)[batchcount],
2242 sizeof(void*)*ac->avail);
2243}
2244
2245
2246
2247
2248
2249
2250
2251
2252static inline void __cache_free (kmem_cache_t *cachep, void* objp)
2253{
2254 struct array_cache *ac = ac_data(cachep);
2255
2256 check_irq_off();
2257 objp = cache_free_debugcheck(cachep, objp, __builtin_return_address(0));
2258
2259 if (likely(ac->avail < ac->limit)) {
2260 STATS_INC_FREEHIT(cachep);
2261 ac_entry(ac)[ac->avail++] = objp;
2262 return;
2263 } else {
2264 STATS_INC_FREEMISS(cachep);
2265 cache_flusharray(cachep, ac);
2266 ac_entry(ac)[ac->avail++] = objp;
2267 }
2268}
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278void * kmem_cache_alloc (kmem_cache_t *cachep, int flags)
2279{
2280 return __cache_alloc(cachep, flags);
2281}
2282
2283EXPORT_SYMBOL(kmem_cache_alloc);
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299int fastcall kmem_ptr_validate(kmem_cache_t *cachep, void *ptr)
2300{
2301 unsigned long addr = (unsigned long) ptr;
2302 unsigned long min_addr = PAGE_OFFSET;
2303 unsigned long align_mask = BYTES_PER_WORD-1;
2304 unsigned long size = cachep->objsize;
2305 struct page *page;
2306
2307 if (unlikely(addr < min_addr))
2308 goto out;
2309 if (unlikely(addr > (unsigned long)high_memory - size))
2310 goto out;
2311 if (unlikely(addr & align_mask))
2312 goto out;
2313 if (unlikely(!kern_addr_valid(addr)))
2314 goto out;
2315 if (unlikely(!kern_addr_valid(addr + size - 1)))
2316 goto out;
2317 page = virt_to_page(ptr);
2318 if (unlikely(!PageSlab(page)))
2319 goto out;
2320 if (unlikely(GET_PAGE_CACHE(page) != cachep))
2321 goto out;
2322 return 1;
2323out:
2324 return 0;
2325}
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337void *kmem_cache_alloc_node(kmem_cache_t *cachep, int nodeid)
2338{
2339 size_t offset;
2340 void *objp;
2341 struct slab *slabp;
2342 kmem_bufctl_t next;
2343
2344
2345
2346
2347
2348
2349
2350 spin_lock_irq(&cachep->spinlock);
2351 offset = cachep->colour_next;
2352 cachep->colour_next++;
2353 if (cachep->colour_next >= cachep->colour)
2354 cachep->colour_next = 0;
2355 offset *= cachep->colour_off;
2356 spin_unlock_irq(&cachep->spinlock);
2357
2358
2359 if (!(objp = kmem_getpages(cachep, GFP_KERNEL, nodeid)))
2360 goto failed;
2361
2362
2363 if (!(slabp = alloc_slabmgmt(cachep, objp, offset, GFP_KERNEL)))
2364 goto opps1;
2365
2366 set_slab_attr(cachep, slabp, objp);
2367 cache_init_objs(cachep, slabp, SLAB_CTOR_CONSTRUCTOR);
2368
2369
2370 objp = slabp->s_mem + slabp->free*cachep->objsize;
2371 slabp->inuse++;
2372 next = slab_bufctl(slabp)[slabp->free];
2373#if DEBUG
2374 slab_bufctl(slabp)[slabp->free] = BUFCTL_FREE;
2375#endif
2376 slabp->free = next;
2377
2378
2379 spin_lock_irq(&cachep->spinlock);
2380 check_slabp(cachep, slabp);
2381 STATS_INC_GROWN(cachep);
2382
2383 if (slabp->free == BUFCTL_END) {
2384 list_add_tail(&slabp->list, &(list3_data(cachep)->slabs_full));
2385 } else {
2386 list_add_tail(&slabp->list,
2387 &(list3_data(cachep)->slabs_partial));
2388 list3_data(cachep)->free_objects += cachep->num-1;
2389 }
2390 spin_unlock_irq(&cachep->spinlock);
2391 objp = cache_alloc_debugcheck_after(cachep, GFP_KERNEL, objp,
2392 __builtin_return_address(0));
2393 return objp;
2394opps1:
2395 kmem_freepages(cachep, objp);
2396failed:
2397 return NULL;
2398
2399}
2400EXPORT_SYMBOL(kmem_cache_alloc_node);
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423void * __kmalloc (size_t size, int flags)
2424{
2425 struct cache_sizes *csizep = malloc_sizes;
2426
2427 for (; csizep->cs_size; csizep++) {
2428 if (size > csizep->cs_size)
2429 continue;
2430#if DEBUG
2431
2432
2433
2434
2435 BUG_ON(csizep->cs_cachep == NULL);
2436#endif
2437 return __cache_alloc(flags & GFP_DMA ?
2438 csizep->cs_dmacachep : csizep->cs_cachep, flags);
2439 }
2440 return NULL;
2441}
2442
2443EXPORT_SYMBOL(__kmalloc);
2444
2445#ifdef CONFIG_SMP
2446
2447
2448
2449
2450
2451
2452
2453
2454void *__alloc_percpu(size_t size, size_t align)
2455{
2456 int i;
2457 struct percpu_data *pdata = kmalloc(sizeof (*pdata), GFP_KERNEL);
2458
2459 if (!pdata)
2460 return NULL;
2461
2462 for (i = 0; i < NR_CPUS; i++) {
2463 if (!cpu_possible(i))
2464 continue;
2465 pdata->ptrs[i] = kmem_cache_alloc_node(
2466 kmem_find_general_cachep(size, GFP_KERNEL),
2467 cpu_to_node(i));
2468
2469 if (!pdata->ptrs[i])
2470 goto unwind_oom;
2471 memset(pdata->ptrs[i], 0, size);
2472 }
2473
2474
2475 return (void *) (~(unsigned long) pdata);
2476
2477unwind_oom:
2478 while (--i >= 0) {
2479 if (!cpu_possible(i))
2480 continue;
2481 kfree(pdata->ptrs[i]);
2482 }
2483 kfree(pdata);
2484 return NULL;
2485}
2486
2487EXPORT_SYMBOL(__alloc_percpu);
2488#endif
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498void kmem_cache_free (kmem_cache_t *cachep, void *objp)
2499{
2500 unsigned long flags;
2501
2502 local_irq_save(flags);
2503 __cache_free(cachep, objp);
2504 local_irq_restore(flags);
2505}
2506
2507EXPORT_SYMBOL(kmem_cache_free);
2508
2509
2510
2511
2512
2513
2514void *kzalloc(size_t size, int flags)
2515{
2516 void *ret = kmalloc(size, flags);
2517 if (ret)
2518 memset(ret, 0, size);
2519 return ret;
2520}
2521EXPORT_SYMBOL(kzalloc);
2522
2523
2524
2525
2526
2527
2528
2529void *kcalloc(size_t n, size_t size, int flags)
2530{
2531 void *ret = NULL;
2532
2533 if (n != 0 && size > INT_MAX / n)
2534 return ret;
2535
2536 ret = kmalloc(n * size, flags);
2537 if (ret)
2538 memset(ret, 0, n * size);
2539 return ret;
2540}
2541
2542EXPORT_SYMBOL(kcalloc);
2543
2544
2545
2546
2547
2548
2549
2550
2551void kfree (const void *objp)
2552{
2553 kmem_cache_t *c;
2554 unsigned long flags;
2555
2556 if (!objp)
2557 return;
2558 local_irq_save(flags);
2559 kfree_debugcheck(objp);
2560 c = GET_PAGE_CACHE(virt_to_page(objp));
2561 __cache_free(c, (void*)objp);
2562 local_irq_restore(flags);
2563}
2564
2565EXPORT_SYMBOL(kfree);
2566
2567#ifdef CONFIG_SMP
2568
2569
2570
2571
2572
2573
2574
2575void
2576free_percpu(const void *objp)
2577{
2578 int i;
2579 struct percpu_data *p = (struct percpu_data *) (~(unsigned long) objp);
2580
2581 for (i = 0; i < NR_CPUS; i++) {
2582 if (!cpu_possible(i))
2583 continue;
2584 kfree(p->ptrs[i]);
2585 }
2586 kfree(p);
2587}
2588
2589EXPORT_SYMBOL(free_percpu);
2590#endif
2591
2592unsigned int kmem_cache_size(kmem_cache_t *cachep)
2593{
2594 return obj_reallen(cachep);
2595}
2596
2597EXPORT_SYMBOL(kmem_cache_size);
2598
2599struct ccupdate_struct {
2600 kmem_cache_t *cachep;
2601 struct array_cache *new[NR_CPUS];
2602};
2603
2604static void do_ccupdate_local(void *info)
2605{
2606 struct ccupdate_struct *new = (struct ccupdate_struct *)info;
2607 struct array_cache *old;
2608
2609 check_irq_off();
2610 old = ac_data(new->cachep);
2611
2612 new->cachep->array[smp_processor_id()] = new->new[smp_processor_id()];
2613 new->new[smp_processor_id()] = old;
2614}
2615
2616
2617static int do_tune_cpucache (kmem_cache_t* cachep, int limit, int batchcount, int shared)
2618{
2619 struct ccupdate_struct new;
2620 struct array_cache *new_shared;
2621 int i;
2622
2623 memset(&new.new,0,sizeof(new.new));
2624 for (i = 0; i < NR_CPUS; i++) {
2625 if (cpu_online(i)) {
2626 new.new[i] = alloc_arraycache(i, limit, batchcount);
2627 if (!new.new[i]) {
2628 for (i--; i >= 0; i--) kfree(new.new[i]);
2629 return -ENOMEM;
2630 }
2631 } else {
2632 new.new[i] = NULL;
2633 }
2634 }
2635 new.cachep = cachep;
2636
2637 smp_call_function_all_cpus(do_ccupdate_local, (void *)&new);
2638
2639 check_irq_on();
2640 spin_lock_irq(&cachep->spinlock);
2641 cachep->batchcount = batchcount;
2642 cachep->limit = limit;
2643 cachep->free_limit = (1+num_online_cpus())*cachep->batchcount + cachep->num;
2644 spin_unlock_irq(&cachep->spinlock);
2645
2646 for (i = 0; i < NR_CPUS; i++) {
2647 struct array_cache *ccold = new.new[i];
2648 if (!ccold)
2649 continue;
2650 spin_lock_irq(&cachep->spinlock);
2651 free_block(cachep, ac_entry(ccold), ccold->avail);
2652 spin_unlock_irq(&cachep->spinlock);
2653 kfree(ccold);
2654 }
2655 new_shared = alloc_arraycache(-1, batchcount*shared, 0xbaadf00d);
2656 if (new_shared) {
2657 struct array_cache *old;
2658
2659 spin_lock_irq(&cachep->spinlock);
2660 old = cachep->lists.shared;
2661 cachep->lists.shared = new_shared;
2662 if (old)
2663 free_block(cachep, ac_entry(old), old->avail);
2664 spin_unlock_irq(&cachep->spinlock);
2665 kfree(old);
2666 }
2667
2668 return 0;
2669}
2670
2671
2672static void enable_cpucache (kmem_cache_t *cachep)
2673{
2674 int err;
2675 int limit, shared;
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685 if (cachep->objsize > 131072)
2686 limit = 1;
2687 else if (cachep->objsize > PAGE_SIZE)
2688 limit = 8;
2689 else if (cachep->objsize > 1024)
2690 limit = 24;
2691 else if (cachep->objsize > 256)
2692 limit = 54;
2693 else
2694 limit = 120;
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704 shared = 0;
2705#ifdef CONFIG_SMP
2706 if (cachep->objsize <= PAGE_SIZE)
2707 shared = 8;
2708#endif
2709
2710#if DEBUG
2711
2712
2713
2714
2715 if (limit > 32)
2716 limit = 32;
2717#endif
2718 err = do_tune_cpucache(cachep, limit, (limit+1)/2, shared);
2719 if (err)
2720 printk(KERN_ERR "enable_cpucache failed for %s, error %d.\n",
2721 cachep->name, -err);
2722}
2723
2724static void drain_array_locked(kmem_cache_t *cachep,
2725 struct array_cache *ac, int force)
2726{
2727 int tofree;
2728
2729 check_spinlock_acquired(cachep);
2730 if (ac->touched && !force) {
2731 ac->touched = 0;
2732 } else if (ac->avail) {
2733 tofree = force ? ac->avail : (ac->limit+4)/5;
2734 if (tofree > ac->avail) {
2735 tofree = (ac->avail+1)/2;
2736 }
2737 free_block(cachep, ac_entry(ac), tofree);
2738 ac->avail -= tofree;
2739 memmove(&ac_entry(ac)[0], &ac_entry(ac)[tofree],
2740 sizeof(void*)*ac->avail);
2741 }
2742}
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755static void cache_reap(void *unused)
2756{
2757 struct list_head *walk;
2758
2759 if (down_trylock(&cache_chain_sem)) {
2760
2761 schedule_delayed_work(&__get_cpu_var(reap_work), REAPTIMEOUT_CPUC + smp_processor_id());