aboutsummaryrefslogtreecommitdiffstats
path: root/mm
diff options
context:
space:
mode:
authorJohannes Weiner <hannes@cmpxchg.org>2016-01-20 18:02:26 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2016-01-20 20:09:18 -0500
commit8e0a891213fbddcec231c9d1d7577c320c77a25a (patch)
tree92d4a3803d2ddd0acb4d6248fb1364b3bfa924fd /mm
parent567e9ab2e614e55feca20e8bcb54b629e9cc1a3b (diff)
mm: memcontrol: group kmem init and exit functions together
Put all the related code to setup and teardown the kmem accounting state into the same location. No functional change intended. Signed-off-by: Johannes Weiner <hannes@cmpxchg.org> Acked-by: Michal Hocko <mhocko@suse.com> Cc: Tejun Heo <tj@kernel.org> Acked-by: Vladimir Davydov <vdavydov@virtuozzo.com> 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.c157
1 files changed, 76 insertions, 81 deletions
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index 24b6bded13f8..3dd9fe35fe62 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -2945,12 +2945,88 @@ static int memcg_propagate_kmem(struct mem_cgroup *memcg)
2945 mutex_unlock(&memcg_limit_mutex); 2945 mutex_unlock(&memcg_limit_mutex);
2946 return ret; 2946 return ret;
2947} 2947}
2948
2949static int memcg_init_kmem(struct mem_cgroup *memcg)
2950{
2951 int ret;
2952
2953 ret = memcg_propagate_kmem(memcg);
2954 if (ret)
2955 return ret;
2956
2957 return tcp_init_cgroup(memcg);
2958}
2959
2960static void memcg_offline_kmem(struct mem_cgroup *memcg)
2961{
2962 struct cgroup_subsys_state *css;
2963 struct mem_cgroup *parent, *child;
2964 int kmemcg_id;
2965
2966 if (memcg->kmem_state != KMEM_ONLINE)
2967 return;
2968 /*
2969 * Clear the online state before clearing memcg_caches array
2970 * entries. The slab_mutex in memcg_deactivate_kmem_caches()
2971 * guarantees that no cache will be created for this cgroup
2972 * after we are done (see memcg_create_kmem_cache()).
2973 */
2974 memcg->kmem_state = KMEM_ALLOCATED;
2975
2976 memcg_deactivate_kmem_caches(memcg);
2977
2978 kmemcg_id = memcg->kmemcg_id;
2979 BUG_ON(kmemcg_id < 0);
2980
2981 parent = parent_mem_cgroup(memcg);
2982 if (!parent)
2983 parent = root_mem_cgroup;
2984
2985 /*
2986 * Change kmemcg_id of this cgroup and all its descendants to the
2987 * parent's id, and then move all entries from this cgroup's list_lrus
2988 * to ones of the parent. After we have finished, all list_lrus
2989 * corresponding to this cgroup are guaranteed to remain empty. The
2990 * ordering is imposed by list_lru_node->lock taken by
2991 * memcg_drain_all_list_lrus().
2992 */
2993 css_for_each_descendant_pre(css, &memcg->css) {
2994 child = mem_cgroup_from_css(css);
2995 BUG_ON(child->kmemcg_id != kmemcg_id);
2996 child->kmemcg_id = parent->kmemcg_id;
2997 if (!memcg->use_hierarchy)
2998 break;
2999 }
3000 memcg_drain_all_list_lrus(kmemcg_id, parent->kmemcg_id);
3001
3002 memcg_free_cache_id(kmemcg_id);
3003}
3004
3005static void memcg_free_kmem(struct mem_cgroup *memcg)
3006{
3007 if (memcg->kmem_state == KMEM_ALLOCATED) {
3008 memcg_destroy_kmem_caches(memcg);
3009 static_branch_dec(&memcg_kmem_enabled_key);
3010 WARN_ON(page_counter_read(&memcg->kmem));
3011 }
3012 tcp_destroy_cgroup(memcg);
3013}
2948#else 3014#else
2949static int memcg_update_kmem_limit(struct mem_cgroup *memcg, 3015static int memcg_update_kmem_limit(struct mem_cgroup *memcg,
2950 unsigned long limit) 3016 unsigned long limit)
2951{ 3017{
2952 return -EINVAL; 3018 return -EINVAL;
2953} 3019}
3020static int memcg_init_kmem(struct mem_cgroup *memcg)
3021{
3022 return 0;
3023}
3024static void memcg_offline_kmem(struct mem_cgroup *memcg)
3025{
3026}
3027static void memcg_free_kmem(struct mem_cgroup *memcg)
3028{
3029}
2954#endif /* CONFIG_MEMCG_KMEM */ 3030#endif /* CONFIG_MEMCG_KMEM */
2955 3031
2956/* 3032/*
@@ -3577,87 +3653,6 @@ static int mem_cgroup_oom_control_write(struct cgroup_subsys_state *css,
3577 return 0; 3653 return 0;
3578} 3654}
3579 3655
3580#ifdef CONFIG_MEMCG_KMEM
3581static int memcg_init_kmem(struct mem_cgroup *memcg)
3582{
3583 int ret;
3584
3585 ret = memcg_propagate_kmem(memcg);
3586 if (ret)
3587 return ret;
3588
3589 return tcp_init_cgroup(memcg);
3590}
3591
3592static void memcg_offline_kmem(struct mem_cgroup *memcg)
3593{
3594 struct cgroup_subsys_state *css;
3595 struct mem_cgroup *parent, *child;
3596 int kmemcg_id;
3597
3598 if (memcg->kmem_state != KMEM_ONLINE)
3599 return;
3600 /*
3601 * Clear the online state before clearing memcg_caches array
3602 * entries. The slab_mutex in memcg_deactivate_kmem_caches()
3603 * guarantees that no cache will be created for this cgroup
3604 * after we are done (see memcg_create_kmem_cache()).
3605 */
3606 memcg->kmem_state = KMEM_ALLOCATED;
3607
3608 memcg_deactivate_kmem_caches(memcg);
3609
3610 kmemcg_id = memcg->kmemcg_id;
3611 BUG_ON(kmemcg_id < 0);
3612
3613 parent = parent_mem_cgroup(memcg);
3614 if (!parent)
3615 parent = root_mem_cgroup;
3616
3617 /*
3618 * Change kmemcg_id of this cgroup and all its descendants to the
3619 * parent's id, and then move all entries from this cgroup's list_lrus
3620 * to ones of the parent. After we have finished, all list_lrus
3621 * corresponding to this cgroup are guaranteed to remain empty. The
3622 * ordering is imposed by list_lru_node->lock taken by
3623 * memcg_drain_all_list_lrus().
3624 */
3625 css_for_each_descendant_pre(css, &memcg->css) {
3626 child = mem_cgroup_from_css(css);
3627 BUG_ON(child->kmemcg_id != kmemcg_id);
3628 child->kmemcg_id = parent->kmemcg_id;
3629 if (!memcg->use_hierarchy)
3630 break;
3631 }
3632 memcg_drain_all_list_lrus(kmemcg_id, parent->kmemcg_id);
3633
3634 memcg_free_cache_id(kmemcg_id);
3635}
3636
3637static void memcg_free_kmem(struct mem_cgroup *memcg)
3638{
3639 if (memcg->kmem_state == KMEM_ALLOCATED) {
3640 memcg_destroy_kmem_caches(memcg);
3641 static_branch_dec(&memcg_kmem_enabled_key);
3642 WARN_ON(page_counter_read(&memcg->kmem));
3643 }
3644 tcp_destroy_cgroup(memcg);
3645}
3646#else
3647static int memcg_init_kmem(struct mem_cgroup *memcg, struct cgroup_subsys *ss)
3648{
3649 return 0;
3650}
3651
3652static void memcg_offline_kmem(struct mem_cgroup *memcg)
3653{
3654}
3655
3656static void memcg_free_kmem(struct mem_cgroup *memcg)
3657{
3658}
3659#endif
3660
3661#ifdef CONFIG_CGROUP_WRITEBACK 3656#ifdef CONFIG_CGROUP_WRITEBACK
3662 3657
3663struct list_head *mem_cgroup_cgwb_list(struct mem_cgroup *memcg) 3658struct list_head *mem_cgroup_cgwb_list(struct mem_cgroup *memcg)