aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGlauber Costa <glommer@parallels.com>2012-12-18 17:22:27 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2012-12-18 18:02:13 -0500
commitba6c496ed834a37a26fc6fc87fc9aecb0fa0014d (patch)
treecd229b78ca04817354865c9fdf57b564a6bf7852
parentd5bdae7d59451b9d63303f7794ef32bb76ba6330 (diff)
slab/slub: struct memcg_params
For the kmem slab controller, we need to record some extra information in the kmem_cache structure. Signed-off-by: Glauber Costa <glommer@parallels.com> Signed-off-by: Suleiman Souhlal <suleiman@google.com> Cc: Christoph Lameter <cl@linux.com> Cc: David Rientjes <rientjes@google.com> Cc: Frederic Weisbecker <fweisbec@redhat.com> Cc: Greg Thelen <gthelen@google.com> Cc: Johannes Weiner <hannes@cmpxchg.org> Cc: JoonSoo Kim <js1304@gmail.com> Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> Cc: Mel Gorman <mel@csn.ul.ie> Cc: Michal Hocko <mhocko@suse.cz> Cc: Pekka Enberg <penberg@cs.helsinki.fi> Cc: Rik van Riel <riel@redhat.com> Cc: Tejun Heo <tj@kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--include/linux/slab.h24
-rw-r--r--include/linux/slab_def.h3
-rw-r--r--include/linux/slub_def.h3
-rw-r--r--mm/slab.h13
4 files changed, 43 insertions, 0 deletions
diff --git a/include/linux/slab.h b/include/linux/slab.h
index 743a10415122..00efba149222 100644
--- a/include/linux/slab.h
+++ b/include/linux/slab.h
@@ -177,6 +177,30 @@ void kmem_cache_free(struct kmem_cache *, void *);
177#endif 177#endif
178 178
179/* 179/*
180 * This is the main placeholder for memcg-related information in kmem caches.
181 * struct kmem_cache will hold a pointer to it, so the memory cost while
182 * disabled is 1 pointer. The runtime cost while enabled, gets bigger than it
183 * would otherwise be if that would be bundled in kmem_cache: we'll need an
184 * extra pointer chase. But the trade off clearly lays in favor of not
185 * penalizing non-users.
186 *
187 * Both the root cache and the child caches will have it. For the root cache,
188 * this will hold a dynamically allocated array large enough to hold
189 * information about the currently limited memcgs in the system.
190 *
191 * Child caches will hold extra metadata needed for its operation. Fields are:
192 *
193 * @memcg: pointer to the memcg this cache belongs to
194 */
195struct memcg_cache_params {
196 bool is_root_cache;
197 union {
198 struct kmem_cache *memcg_caches[0];
199 struct mem_cgroup *memcg;
200 };
201};
202
203/*
180 * Common kmalloc functions provided by all allocators 204 * Common kmalloc functions provided by all allocators
181 */ 205 */
182void * __must_check __krealloc(const void *, size_t, gfp_t); 206void * __must_check __krealloc(const void *, size_t, gfp_t);
diff --git a/include/linux/slab_def.h b/include/linux/slab_def.h
index 45c0356fdc8c..8bb6e0eaf3c6 100644
--- a/include/linux/slab_def.h
+++ b/include/linux/slab_def.h
@@ -81,6 +81,9 @@ struct kmem_cache {
81 */ 81 */
82 int obj_offset; 82 int obj_offset;
83#endif /* CONFIG_DEBUG_SLAB */ 83#endif /* CONFIG_DEBUG_SLAB */
84#ifdef CONFIG_MEMCG_KMEM
85 struct memcg_cache_params *memcg_params;
86#endif
84 87
85/* 6) per-cpu/per-node data, touched during every alloc/free */ 88/* 6) per-cpu/per-node data, touched during every alloc/free */
86 /* 89 /*
diff --git a/include/linux/slub_def.h b/include/linux/slub_def.h
index df448adb7283..961e72eab907 100644
--- a/include/linux/slub_def.h
+++ b/include/linux/slub_def.h
@@ -101,6 +101,9 @@ struct kmem_cache {
101#ifdef CONFIG_SYSFS 101#ifdef CONFIG_SYSFS
102 struct kobject kobj; /* For sysfs */ 102 struct kobject kobj; /* For sysfs */
103#endif 103#endif
104#ifdef CONFIG_MEMCG_KMEM
105 struct memcg_cache_params *memcg_params;
106#endif
104 107
105#ifdef CONFIG_NUMA 108#ifdef CONFIG_NUMA
106 /* 109 /*
diff --git a/mm/slab.h b/mm/slab.h
index 1cb9c9ee0e6f..49e7a8b1d27e 100644
--- a/mm/slab.h
+++ b/mm/slab.h
@@ -100,4 +100,17 @@ void get_slabinfo(struct kmem_cache *s, struct slabinfo *sinfo);
100void slabinfo_show_stats(struct seq_file *m, struct kmem_cache *s); 100void slabinfo_show_stats(struct seq_file *m, struct kmem_cache *s);
101ssize_t slabinfo_write(struct file *file, const char __user *buffer, 101ssize_t slabinfo_write(struct file *file, const char __user *buffer,
102 size_t count, loff_t *ppos); 102 size_t count, loff_t *ppos);
103
104#ifdef CONFIG_MEMCG_KMEM
105static inline bool is_root_cache(struct kmem_cache *s)
106{
107 return !s->memcg_params || s->memcg_params->is_root_cache;
108}
109#else
110static inline bool is_root_cache(struct kmem_cache *s)
111{
112 return true;
113}
114
115#endif
103#endif 116#endif