diff options
author | Vladimir Davydov <vdavydov@parallels.com> | 2014-01-23 18:52:58 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-01-23 19:36:51 -0500 |
commit | 1aa13254259bdef0bca723849ab3bab308d2f0c3 (patch) | |
tree | 4d2207788bf99f908ffed696f9d58c96eaf0b8b0 /mm/slab_common.c | |
parent | 363a044f739b0f07a8c063b838c5528d10720e02 (diff) |
memcg, slab: clean up memcg cache initialization/destruction
Currently, we have rather a messy function set relating to per-memcg
kmem cache initialization/destruction.
Per-memcg caches are created in memcg_create_kmem_cache(). This
function calls kmem_cache_create_memcg() to allocate and initialize a
kmem cache and then "registers" the new cache in the
memcg_params::memcg_caches array of the parent cache.
During its work-flow, kmem_cache_create_memcg() executes the following
memcg-related functions:
- memcg_alloc_cache_params(), to initialize memcg_params of the newly
created cache;
- memcg_cache_list_add(), to add the new cache to the memcg_slab_caches
list.
On the other hand, kmem_cache_destroy() called on a cache destruction
only calls memcg_release_cache(), which does all the work: it cleans the
reference to the cache in its parent's memcg_params::memcg_caches,
removes the cache from the memcg_slab_caches list, and frees
memcg_params.
Such an inconsistency between destruction and initialization paths make
the code difficult to read, so let's clean this up a bit.
This patch moves all the code relating to registration of per-memcg
caches (adding to memcg list, setting the pointer to a cache from its
parent) to the newly created memcg_register_cache() and
memcg_unregister_cache() functions making the initialization and
destruction paths look symmetrical.
Signed-off-by: Vladimir Davydov <vdavydov@parallels.com>
Cc: Michal Hocko <mhocko@suse.cz>
Cc: Glauber Costa <glommer@gmail.com>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Balbir Singh <bsingharora@gmail.com>
Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Cc: Pekka Enberg <penberg@kernel.org>
Cc: Christoph Lameter <cl@linux.com>
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.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/mm/slab_common.c b/mm/slab_common.c index 70f9e249ac30..db24ec48b946 100644 --- a/mm/slab_common.c +++ b/mm/slab_common.c | |||
@@ -215,7 +215,7 @@ kmem_cache_create_memcg(struct mem_cgroup *memcg, const char *name, size_t size, | |||
215 | 215 | ||
216 | s->refcount = 1; | 216 | s->refcount = 1; |
217 | list_add(&s->list, &slab_caches); | 217 | list_add(&s->list, &slab_caches); |
218 | memcg_cache_list_add(memcg, s); | 218 | memcg_register_cache(s); |
219 | 219 | ||
220 | out_unlock: | 220 | out_unlock: |
221 | mutex_unlock(&slab_mutex); | 221 | mutex_unlock(&slab_mutex); |
@@ -265,7 +265,8 @@ void kmem_cache_destroy(struct kmem_cache *s) | |||
265 | if (s->flags & SLAB_DESTROY_BY_RCU) | 265 | if (s->flags & SLAB_DESTROY_BY_RCU) |
266 | rcu_barrier(); | 266 | rcu_barrier(); |
267 | 267 | ||
268 | memcg_release_cache(s); | 268 | memcg_unregister_cache(s); |
269 | memcg_free_cache_params(s); | ||
269 | kfree(s->name); | 270 | kfree(s->name); |
270 | kmem_cache_free(kmem_cache, s); | 271 | kmem_cache_free(kmem_cache, s); |
271 | } else { | 272 | } else { |