diff options
| author | Ravikiran G Thirumalai <kiran@scalex86.org> | 2006-04-11 01:52:54 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-04-11 09:18:31 -0400 |
| commit | fb7faf3313d527bf68ba2e7ff3a2b6ebf201af73 (patch) | |
| tree | ca4884d9fb0312eb19480b8319f2e01633298eda /mm | |
| parent | 5b74ada7eea1b0064d2b72384827853f349d803a (diff) | |
[PATCH] slab: add statistics for alien cache overflows
Add a statistics counter which is incremented everytime the alien cache
overflows. alien_cache limit is hardcoded to 12 right now. We can use
this statistics to tune alien cache if needed in the future.
Signed-off-by: Alok N Kataria <alokk@calsoftinc.com>
Signed-off-by: Ravikiran Thirumalai <kiran@scalex86.org>
Signed-off-by: Shai Fultheim <shai@scalex86.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'mm')
| -rw-r--r-- | mm/slab.c | 14 |
1 files changed, 10 insertions, 4 deletions
| @@ -420,6 +420,7 @@ struct kmem_cache { | |||
| 420 | unsigned long max_freeable; | 420 | unsigned long max_freeable; |
| 421 | unsigned long node_allocs; | 421 | unsigned long node_allocs; |
| 422 | unsigned long node_frees; | 422 | unsigned long node_frees; |
| 423 | unsigned long node_overflow; | ||
| 423 | atomic_t allochit; | 424 | atomic_t allochit; |
| 424 | atomic_t allocmiss; | 425 | atomic_t allocmiss; |
| 425 | atomic_t freehit; | 426 | atomic_t freehit; |
| @@ -465,6 +466,7 @@ struct kmem_cache { | |||
| 465 | #define STATS_INC_ERR(x) ((x)->errors++) | 466 | #define STATS_INC_ERR(x) ((x)->errors++) |
| 466 | #define STATS_INC_NODEALLOCS(x) ((x)->node_allocs++) | 467 | #define STATS_INC_NODEALLOCS(x) ((x)->node_allocs++) |
| 467 | #define STATS_INC_NODEFREES(x) ((x)->node_frees++) | 468 | #define STATS_INC_NODEFREES(x) ((x)->node_frees++) |
| 469 | #define STATS_INC_ACOVERFLOW(x) ((x)->node_overflow++) | ||
| 468 | #define STATS_SET_FREEABLE(x, i) \ | 470 | #define STATS_SET_FREEABLE(x, i) \ |
| 469 | do { \ | 471 | do { \ |
| 470 | if ((x)->max_freeable < i) \ | 472 | if ((x)->max_freeable < i) \ |
| @@ -484,6 +486,7 @@ struct kmem_cache { | |||
| 484 | #define STATS_INC_ERR(x) do { } while (0) | 486 | #define STATS_INC_ERR(x) do { } while (0) |
| 485 | #define STATS_INC_NODEALLOCS(x) do { } while (0) | 487 | #define STATS_INC_NODEALLOCS(x) do { } while (0) |
| 486 | #define STATS_INC_NODEFREES(x) do { } while (0) | 488 | #define STATS_INC_NODEFREES(x) do { } while (0) |
| 489 | #define STATS_INC_ACOVERFLOW(x) do { } while (0) | ||
| 487 | #define STATS_SET_FREEABLE(x, i) do { } while (0) | 490 | #define STATS_SET_FREEABLE(x, i) do { } while (0) |
| 488 | #define STATS_INC_ALLOCHIT(x) do { } while (0) | 491 | #define STATS_INC_ALLOCHIT(x) do { } while (0) |
| 489 | #define STATS_INC_ALLOCMISS(x) do { } while (0) | 492 | #define STATS_INC_ALLOCMISS(x) do { } while (0) |
| @@ -3083,9 +3086,11 @@ static inline void __cache_free(struct kmem_cache *cachep, void *objp) | |||
| 3083 | if (l3->alien && l3->alien[nodeid]) { | 3086 | if (l3->alien && l3->alien[nodeid]) { |
| 3084 | alien = l3->alien[nodeid]; | 3087 | alien = l3->alien[nodeid]; |
| 3085 | spin_lock(&alien->lock); | 3088 | spin_lock(&alien->lock); |
| 3086 | if (unlikely(alien->avail == alien->limit)) | 3089 | if (unlikely(alien->avail == alien->limit)) { |
| 3090 | STATS_INC_ACOVERFLOW(cachep); | ||
| 3087 | __drain_alien_cache(cachep, | 3091 | __drain_alien_cache(cachep, |
| 3088 | alien, nodeid); | 3092 | alien, nodeid); |
| 3093 | } | ||
| 3089 | alien->entry[alien->avail++] = objp; | 3094 | alien->entry[alien->avail++] = objp; |
| 3090 | spin_unlock(&alien->lock); | 3095 | spin_unlock(&alien->lock); |
| 3091 | } else { | 3096 | } else { |
| @@ -3763,7 +3768,7 @@ static void print_slabinfo_header(struct seq_file *m) | |||
| 3763 | seq_puts(m, " : slabdata <active_slabs> <num_slabs> <sharedavail>"); | 3768 | seq_puts(m, " : slabdata <active_slabs> <num_slabs> <sharedavail>"); |
| 3764 | #if STATS | 3769 | #if STATS |
| 3765 | seq_puts(m, " : globalstat <listallocs> <maxobjs> <grown> <reaped> " | 3770 | seq_puts(m, " : globalstat <listallocs> <maxobjs> <grown> <reaped> " |
| 3766 | "<error> <maxfreeable> <nodeallocs> <remotefrees>"); | 3771 | "<error> <maxfreeable> <nodeallocs> <remotefrees> <alienoverflow>"); |
| 3767 | seq_puts(m, " : cpustat <allochit> <allocmiss> <freehit> <freemiss>"); | 3772 | seq_puts(m, " : cpustat <allochit> <allocmiss> <freehit> <freemiss>"); |
| 3768 | #endif | 3773 | #endif |
| 3769 | seq_putc(m, '\n'); | 3774 | seq_putc(m, '\n'); |
| @@ -3877,11 +3882,12 @@ static int s_show(struct seq_file *m, void *p) | |||
| 3877 | unsigned long max_freeable = cachep->max_freeable; | 3882 | unsigned long max_freeable = cachep->max_freeable; |
| 3878 | unsigned long node_allocs = cachep->node_allocs; | 3883 | unsigned long node_allocs = cachep->node_allocs; |
| 3879 | unsigned long node_frees = cachep->node_frees; | 3884 | unsigned long node_frees = cachep->node_frees; |
| 3885 | unsigned long overflows = cachep->node_overflow; | ||
| 3880 | 3886 | ||
| 3881 | seq_printf(m, " : globalstat %7lu %6lu %5lu %4lu \ | 3887 | seq_printf(m, " : globalstat %7lu %6lu %5lu %4lu \ |
| 3882 | %4lu %4lu %4lu %4lu", allocs, high, grown, | 3888 | %4lu %4lu %4lu %4lu %4lu", allocs, high, grown, |
| 3883 | reaped, errors, max_freeable, node_allocs, | 3889 | reaped, errors, max_freeable, node_allocs, |
| 3884 | node_frees); | 3890 | node_frees, overflows); |
| 3885 | } | 3891 | } |
| 3886 | /* cpu stats */ | 3892 | /* cpu stats */ |
| 3887 | { | 3893 | { |
