diff options
author | Johannes Weiner <hannes@cmpxchg.org> | 2016-01-20 18:02:26 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2016-01-20 20:09:18 -0500 |
commit | 8e0a891213fbddcec231c9d1d7577c320c77a25a (patch) | |
tree | 92d4a3803d2ddd0acb4d6248fb1364b3bfa924fd /mm | |
parent | 567e9ab2e614e55feca20e8bcb54b629e9cc1a3b (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.c | 157 |
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 | |||
2949 | static 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 | |||
2960 | static 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 | |||
3005 | static 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 |
2949 | static int memcg_update_kmem_limit(struct mem_cgroup *memcg, | 3015 | static 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 | } |
3020 | static int memcg_init_kmem(struct mem_cgroup *memcg) | ||
3021 | { | ||
3022 | return 0; | ||
3023 | } | ||
3024 | static void memcg_offline_kmem(struct mem_cgroup *memcg) | ||
3025 | { | ||
3026 | } | ||
3027 | static 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 | ||
3581 | static 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 | |||
3592 | static 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 | |||
3637 | static 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 | ||
3647 | static int memcg_init_kmem(struct mem_cgroup *memcg, struct cgroup_subsys *ss) | ||
3648 | { | ||
3649 | return 0; | ||
3650 | } | ||
3651 | |||
3652 | static void memcg_offline_kmem(struct mem_cgroup *memcg) | ||
3653 | { | ||
3654 | } | ||
3655 | |||
3656 | static 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 | ||
3663 | struct list_head *mem_cgroup_cgwb_list(struct mem_cgroup *memcg) | 3658 | struct list_head *mem_cgroup_cgwb_list(struct mem_cgroup *memcg) |