aboutsummaryrefslogtreecommitdiffstats
path: root/mm/slab_common.c
diff options
context:
space:
mode:
authorVladimir Davydov <vdavydov@parallels.com>2014-12-10 18:44:19 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2014-12-10 20:41:07 -0500
commitb047501cd9f11d5e1d54ea0f90e2b10754021a0e (patch)
tree5532702b7921006bc6ffd02a04e481c04fa20481 /mm/slab_common.c
parent4ef461e8f4dd13a2e64c6c8f00c420d62294e2d4 (diff)
memcg: use generic slab iterators for showing slabinfo
Let's use generic slab_start/next/stop for showing memcg caches info. In contrast to the current implementation, this will work even if all memcg caches' info doesn't fit into a seq buffer (a page), plus it simply looks neater. Actually, the main reason I do this isn't mere cleanup. I'm going to zap the memcg_slab_caches list, because I find it useless provided we have the slab_caches list, and this patch is a step in this direction. It should be noted that before this patch an attempt to read memory.kmem.slabinfo of a cgroup that doesn't have kmem limit set resulted in -EIO, while after this patch it will silently show nothing except the header, but I don't think it will frustrate anyone. Signed-off-by: Vladimir Davydov <vdavydov@parallels.com> Cc: Christoph Lameter <cl@linux.com> Cc: Pekka Enberg <penberg@kernel.org> Cc: David Rientjes <rientjes@google.com> Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com> Cc: Johannes Weiner <hannes@cmpxchg.org> Cc: Michal Hocko <mhocko@suse.cz> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm/slab_common.c')
-rw-r--r--mm/slab_common.c25
1 files changed, 19 insertions, 6 deletions
diff --git a/mm/slab_common.c b/mm/slab_common.c
index 2a3f5ff410cf..e03dd6f2a272 100644
--- a/mm/slab_common.c
+++ b/mm/slab_common.c
@@ -811,7 +811,7 @@ EXPORT_SYMBOL(kmalloc_order_trace);
811#define SLABINFO_RIGHTS S_IRUSR 811#define SLABINFO_RIGHTS S_IRUSR
812#endif 812#endif
813 813
814void print_slabinfo_header(struct seq_file *m) 814static void print_slabinfo_header(struct seq_file *m)
815{ 815{
816 /* 816 /*
817 * Output format version, so at least we can change it 817 * Output format version, so at least we can change it
@@ -876,7 +876,7 @@ memcg_accumulate_slabinfo(struct kmem_cache *s, struct slabinfo *info)
876 } 876 }
877} 877}
878 878
879int cache_show(struct kmem_cache *s, struct seq_file *m) 879static void cache_show(struct kmem_cache *s, struct seq_file *m)
880{ 880{
881 struct slabinfo sinfo; 881 struct slabinfo sinfo;
882 882
@@ -895,7 +895,6 @@ int cache_show(struct kmem_cache *s, struct seq_file *m)
895 sinfo.active_slabs, sinfo.num_slabs, sinfo.shared_avail); 895 sinfo.active_slabs, sinfo.num_slabs, sinfo.shared_avail);
896 slabinfo_show_stats(m, s); 896 slabinfo_show_stats(m, s);
897 seq_putc(m, '\n'); 897 seq_putc(m, '\n');
898 return 0;
899} 898}
900 899
901static int slab_show(struct seq_file *m, void *p) 900static int slab_show(struct seq_file *m, void *p)
@@ -904,10 +903,24 @@ static int slab_show(struct seq_file *m, void *p)
904 903
905 if (p == slab_caches.next) 904 if (p == slab_caches.next)
906 print_slabinfo_header(m); 905 print_slabinfo_header(m);
907 if (!is_root_cache(s)) 906 if (is_root_cache(s))
908 return 0; 907 cache_show(s, m);
909 return cache_show(s, m); 908 return 0;
909}
910
911#ifdef CONFIG_MEMCG_KMEM
912int memcg_slab_show(struct seq_file *m, void *p)
913{
914 struct kmem_cache *s = list_entry(p, struct kmem_cache, list);
915 struct mem_cgroup *memcg = mem_cgroup_from_css(seq_css(m));
916
917 if (p == slab_caches.next)
918 print_slabinfo_header(m);
919 if (!is_root_cache(s) && s->memcg_params->memcg == memcg)
920 cache_show(s, m);
921 return 0;
910} 922}
923#endif
911 924
912/* 925/*
913 * slabinfo_op - iterator that generates /proc/slabinfo 926 * slabinfo_op - iterator that generates /proc/slabinfo