diff options
author | Li Zefan <lizefan@huawei.com> | 2013-07-08 19:00:31 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-07-09 13:33:24 -0400 |
commit | 20f05310ba62d5816fb339d08effe78683137197 (patch) | |
tree | 2909c3e1ef2091dfd45fc674ab48d21871555aca /mm | |
parent | 5347e5ae13710420eebbbd0b22c045685704da80 (diff) |
memcg: don't use mem_cgroup_get() when creating a kmemcg cache
Use css_get()/css_put() instead of mem_cgroup_get()/mem_cgroup_put().
There are two things being done in the current code:
First, we acquired a css_ref to make sure that the underlying cgroup
would not go away. That is a short lived reference, and it is put as
soon as the cache is created.
At this point, we acquire a long-lived per-cache memcg reference count
to guarantee that the memcg will still be alive.
so it is:
enqueue: css_get
create : memcg_get, css_put
destroy: memcg_put
So we only need to get rid of the memcg_get, change the memcg_put to
css_put, and get rid of the now extra css_put.
(This changelog is mostly written by Glauber)
Signed-off-by: Li Zefan <lizefan@huawei.com>
Acked-by: Michal Hocko <mhocko@suse.cz>
Acked-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Cc: Hugh Dickins <hughd@google.com>
Cc: Tejun Heo <tj@kernel.org>
Cc: Glauber Costa <glommer@openvz.org>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm')
-rw-r--r-- | mm/memcontrol.c | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 4c31a21a55be..80175ded718d 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c | |||
@@ -3242,7 +3242,7 @@ void memcg_release_cache(struct kmem_cache *s) | |||
3242 | list_del(&s->memcg_params->list); | 3242 | list_del(&s->memcg_params->list); |
3243 | mutex_unlock(&memcg->slab_caches_mutex); | 3243 | mutex_unlock(&memcg->slab_caches_mutex); |
3244 | 3244 | ||
3245 | mem_cgroup_put(memcg); | 3245 | css_put(&memcg->css); |
3246 | out: | 3246 | out: |
3247 | kfree(s->memcg_params); | 3247 | kfree(s->memcg_params); |
3248 | } | 3248 | } |
@@ -3402,16 +3402,18 @@ static struct kmem_cache *memcg_create_kmem_cache(struct mem_cgroup *memcg, | |||
3402 | 3402 | ||
3403 | mutex_lock(&memcg_cache_mutex); | 3403 | mutex_lock(&memcg_cache_mutex); |
3404 | new_cachep = cachep->memcg_params->memcg_caches[idx]; | 3404 | new_cachep = cachep->memcg_params->memcg_caches[idx]; |
3405 | if (new_cachep) | 3405 | if (new_cachep) { |
3406 | css_put(&memcg->css); | ||
3406 | goto out; | 3407 | goto out; |
3408 | } | ||
3407 | 3409 | ||
3408 | new_cachep = kmem_cache_dup(memcg, cachep); | 3410 | new_cachep = kmem_cache_dup(memcg, cachep); |
3409 | if (new_cachep == NULL) { | 3411 | if (new_cachep == NULL) { |
3410 | new_cachep = cachep; | 3412 | new_cachep = cachep; |
3413 | css_put(&memcg->css); | ||
3411 | goto out; | 3414 | goto out; |
3412 | } | 3415 | } |
3413 | 3416 | ||
3414 | mem_cgroup_get(memcg); | ||
3415 | atomic_set(&new_cachep->memcg_params->nr_pages , 0); | 3417 | atomic_set(&new_cachep->memcg_params->nr_pages , 0); |
3416 | 3418 | ||
3417 | cachep->memcg_params->memcg_caches[idx] = new_cachep; | 3419 | cachep->memcg_params->memcg_caches[idx] = new_cachep; |
@@ -3499,8 +3501,6 @@ static void memcg_create_cache_work_func(struct work_struct *w) | |||
3499 | 3501 | ||
3500 | cw = container_of(w, struct create_work, work); | 3502 | cw = container_of(w, struct create_work, work); |
3501 | memcg_create_kmem_cache(cw->memcg, cw->cachep); | 3503 | memcg_create_kmem_cache(cw->memcg, cw->cachep); |
3502 | /* Drop the reference gotten when we enqueued. */ | ||
3503 | css_put(&cw->memcg->css); | ||
3504 | kfree(cw); | 3504 | kfree(cw); |
3505 | } | 3505 | } |
3506 | 3506 | ||