sl[au]b: Process slabinfo_show in common code
authorGlauber Costa <glommer@parallels.com>
Fri, 19 Oct 2012 14:20:27 +0000 (18:20 +0400)
committerPekka Enberg <penberg@kernel.org>
Wed, 24 Oct 2012 06:39:16 +0000 (09:39 +0300)
With all the infrastructure in place, we can now have slabinfo_show
done from slab_common.c. A cache-specific function is called to grab
information about the cache itself, since that is still heavily
dependent on the implementation. But with the values produced by it, all
the printing and handling is done from common code.

Signed-off-by: Glauber Costa <glommer@parallels.com>
CC: Christoph Lameter <cl@linux.com>
CC: David Rientjes <rientjes@google.com>
Signed-off-by: Pekka Enberg <penberg@kernel.org>
mm/slab.c
mm/slab.h
mm/slab_common.c
mm/slub.c

index 73811ca0ae29762d027b0dbb40c484c0cf6d37b9..6d5c83c6ddd5d416ce8ca5716bf38740bbb70540 100644 (file)
--- a/mm/slab.c
+++ b/mm/slab.c
@@ -4276,9 +4276,8 @@ out:
 }
 
 #ifdef CONFIG_SLABINFO
-int slabinfo_show(struct seq_file *m, void *p)
+void get_slabinfo(struct kmem_cache *cachep, struct slabinfo *sinfo)
 {
-       struct kmem_cache *cachep = list_entry(p, struct kmem_cache, list);
        struct slab *slabp;
        unsigned long active_objs;
        unsigned long num_objs;
@@ -4333,13 +4332,20 @@ int slabinfo_show(struct seq_file *m, void *p)
        if (error)
                printk(KERN_ERR "slab: cache %s error: %s\n", name, error);
 
-       seq_printf(m, "%-17s %6lu %6lu %6u %4u %4d",
-                  name, active_objs, num_objs, cachep->size,
-                  cachep->num, (1 << cachep->gfporder));
-       seq_printf(m, " : tunables %4u %4u %4u",
-                  cachep->limit, cachep->batchcount, cachep->shared);
-       seq_printf(m, " : slabdata %6lu %6lu %6lu",
-                  active_slabs, num_slabs, shared_avail);
+       sinfo->active_objs = active_objs;
+       sinfo->num_objs = num_objs;
+       sinfo->active_slabs = active_slabs;
+       sinfo->num_slabs = num_slabs;
+       sinfo->shared_avail = shared_avail;
+       sinfo->limit = cachep->limit;
+       sinfo->batchcount = cachep->batchcount;
+       sinfo->shared = cachep->shared;
+       sinfo->objects_per_slab = cachep->num;
+       sinfo->cache_order = cachep->gfporder;
+}
+
+void slabinfo_show_stats(struct seq_file *m, struct kmem_cache *cachep)
+{
 #if STATS
        {                       /* list3 stats */
                unsigned long high = cachep->high_mark;
@@ -4369,8 +4375,6 @@ int slabinfo_show(struct seq_file *m, void *p)
                           allochit, allocmiss, freehit, freemiss);
        }
 #endif
-       seq_putc(m, '\n');
-       return 0;
 }
 
 #define MAX_SLABINFO_WRITE 128
index 3442eb83ee1ef100e95b50c4a54dd8f039eeb253..5a43c2f136212292f85e991a95a6d8f56a95f389 100644 (file)
--- a/mm/slab.h
+++ b/mm/slab.h
@@ -49,8 +49,22 @@ int __kmem_cache_shutdown(struct kmem_cache *);
 
 struct seq_file;
 struct file;
-int slabinfo_show(struct seq_file *m, void *p);
 
+struct slabinfo {
+       unsigned long active_objs;
+       unsigned long num_objs;
+       unsigned long active_slabs;
+       unsigned long num_slabs;
+       unsigned long shared_avail;
+       unsigned int limit;
+       unsigned int batchcount;
+       unsigned int shared;
+       unsigned int objects_per_slab;
+       unsigned int cache_order;
+};
+
+void get_slabinfo(struct kmem_cache *s, struct slabinfo *sinfo);
+void slabinfo_show_stats(struct seq_file *m, struct kmem_cache *s);
 ssize_t slabinfo_write(struct file *file, const char __user *buffer,
                       size_t count, loff_t *ppos);
 #endif
index c64a0438c1f371538dbd30d4d917dcfe0c0fa8cc..5fb753da6cf003aac7caf992f6bacc25101c02bc 100644 (file)
@@ -242,7 +242,23 @@ static void s_stop(struct seq_file *m, void *p)
 
 static int s_show(struct seq_file *m, void *p)
 {
-       return slabinfo_show(m, p);
+       struct kmem_cache *s = list_entry(p, struct kmem_cache, list);
+       struct slabinfo sinfo;
+
+       memset(&sinfo, 0, sizeof(sinfo));
+       get_slabinfo(s, &sinfo);
+
+       seq_printf(m, "%-17s %6lu %6lu %6u %4u %4d",
+                  s->name, sinfo.active_objs, sinfo.num_objs, s->size,
+                  sinfo.objects_per_slab, (1 << sinfo.cache_order));
+
+       seq_printf(m, " : tunables %4u %4u %4u",
+                  sinfo.limit, sinfo.batchcount, sinfo.shared);
+       seq_printf(m, " : slabdata %6lu %6lu %6lu",
+                  sinfo.active_slabs, sinfo.num_slabs, sinfo.shared_avail);
+       slabinfo_show_stats(m, s);
+       seq_putc(m, '\n');
+       return 0;
 }
 
 /*
index 6b5ee3472e18954cbee8cceb5d9f7cf9602fbc38..472e739278b4f36e00cec3b7ec0f6216fda7451b 100644 (file)
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -5405,18 +5405,14 @@ __initcall(slab_sysfs_init);
  * The /proc/slabinfo ABI
  */
 #ifdef CONFIG_SLABINFO
-int slabinfo_show(struct seq_file *m, void *p)
+void get_slabinfo(struct kmem_cache *s, struct slabinfo *sinfo)
 {
        unsigned long nr_partials = 0;
        unsigned long nr_slabs = 0;
-       unsigned long nr_inuse = 0;
        unsigned long nr_objs = 0;
        unsigned long nr_free = 0;
-       struct kmem_cache *s;
        int node;
 
-       s = list_entry(p, struct kmem_cache, list);
-
        for_each_online_node(node) {
                struct kmem_cache_node *n = get_node(s, node);
 
@@ -5429,16 +5425,16 @@ int slabinfo_show(struct seq_file *m, void *p)
                nr_free += count_partial(n, count_free);
        }
 
-       nr_inuse = nr_objs - nr_free;
+       sinfo->active_objs = nr_objs - nr_free;
+       sinfo->num_objs = nr_objs;
+       sinfo->active_slabs = nr_slabs;
+       sinfo->num_slabs = nr_slabs;
+       sinfo->objects_per_slab = oo_objects(s->oo);
+       sinfo->cache_order = oo_order(s->oo);
+}
 
-       seq_printf(m, "%-17s %6lu %6lu %6u %4u %4d", s->name, nr_inuse,
-                  nr_objs, s->size, oo_objects(s->oo),
-                  (1 << oo_order(s->oo)));
-       seq_printf(m, " : tunables %4u %4u %4u", 0, 0, 0);
-       seq_printf(m, " : slabdata %6lu %6lu %6lu", nr_slabs, nr_slabs,
-                  0UL);
-       seq_putc(m, '\n');
-       return 0;
+void slabinfo_show_stats(struct seq_file *m, struct kmem_cache *s)
+{
 }
 
 ssize_t slabinfo_write(struct file *file, const char __user *buffer,