diff options
author | Johannes Weiner <hannes@cmpxchg.org> | 2016-01-20 18:02:32 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2016-01-20 20:09:18 -0500 |
commit | 127424c86bb6cb87f0b563d9fdcfbbaf3c86ecec (patch) | |
tree | 7748cabc717161032e479be17e20f5046c9a8335 /mm/memcontrol.c | |
parent | 3893e302f6a377c4ef0f077f190bf760bf84e0be (diff) |
mm: memcontrol: move kmem accounting code to CONFIG_MEMCG
The cgroup2 memory controller will account important in-kernel memory
consumers per default. Move all necessary components to CONFIG_MEMCG.
Signed-off-by: Johannes Weiner <hannes@cmpxchg.org>
Acked-by: Vladimir Davydov <vdavydov@virtuozzo.com>
Cc: Michal Hocko <mhocko@suse.cz>
Cc: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm/memcontrol.c')
-rw-r--r-- | mm/memcontrol.c | 69 |
1 files changed, 41 insertions, 28 deletions
diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 7f8219b58e0c..fe51d5e61389 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c | |||
@@ -297,7 +297,7 @@ static inline struct mem_cgroup *mem_cgroup_from_id(unsigned short id) | |||
297 | return mem_cgroup_from_css(css); | 297 | return mem_cgroup_from_css(css); |
298 | } | 298 | } |
299 | 299 | ||
300 | #ifdef CONFIG_MEMCG_KMEM | 300 | #ifndef CONFIG_SLOB |
301 | /* | 301 | /* |
302 | * This will be the memcg's index in each cache's ->memcg_params.memcg_caches. | 302 | * This will be the memcg's index in each cache's ->memcg_params.memcg_caches. |
303 | * The main reason for not using cgroup id for this: | 303 | * The main reason for not using cgroup id for this: |
@@ -349,7 +349,7 @@ void memcg_put_cache_ids(void) | |||
349 | DEFINE_STATIC_KEY_FALSE(memcg_kmem_enabled_key); | 349 | DEFINE_STATIC_KEY_FALSE(memcg_kmem_enabled_key); |
350 | EXPORT_SYMBOL(memcg_kmem_enabled_key); | 350 | EXPORT_SYMBOL(memcg_kmem_enabled_key); |
351 | 351 | ||
352 | #endif /* CONFIG_MEMCG_KMEM */ | 352 | #endif /* !CONFIG_SLOB */ |
353 | 353 | ||
354 | static struct mem_cgroup_per_zone * | 354 | static struct mem_cgroup_per_zone * |
355 | mem_cgroup_zone_zoneinfo(struct mem_cgroup *memcg, struct zone *zone) | 355 | mem_cgroup_zone_zoneinfo(struct mem_cgroup *memcg, struct zone *zone) |
@@ -2203,7 +2203,7 @@ static void commit_charge(struct page *page, struct mem_cgroup *memcg, | |||
2203 | unlock_page_lru(page, isolated); | 2203 | unlock_page_lru(page, isolated); |
2204 | } | 2204 | } |
2205 | 2205 | ||
2206 | #ifdef CONFIG_MEMCG_KMEM | 2206 | #ifndef CONFIG_SLOB |
2207 | static int memcg_alloc_cache_id(void) | 2207 | static int memcg_alloc_cache_id(void) |
2208 | { | 2208 | { |
2209 | int id, size; | 2209 | int id, size; |
@@ -2424,7 +2424,7 @@ void __memcg_kmem_uncharge(struct page *page, int order) | |||
2424 | page->mem_cgroup = NULL; | 2424 | page->mem_cgroup = NULL; |
2425 | css_put_many(&memcg->css, nr_pages); | 2425 | css_put_many(&memcg->css, nr_pages); |
2426 | } | 2426 | } |
2427 | #endif /* CONFIG_MEMCG_KMEM */ | 2427 | #endif /* !CONFIG_SLOB */ |
2428 | 2428 | ||
2429 | #ifdef CONFIG_TRANSPARENT_HUGEPAGE | 2429 | #ifdef CONFIG_TRANSPARENT_HUGEPAGE |
2430 | 2430 | ||
@@ -2860,7 +2860,7 @@ static u64 mem_cgroup_read_u64(struct cgroup_subsys_state *css, | |||
2860 | } | 2860 | } |
2861 | } | 2861 | } |
2862 | 2862 | ||
2863 | #ifdef CONFIG_MEMCG_KMEM | 2863 | #ifndef CONFIG_SLOB |
2864 | static int memcg_online_kmem(struct mem_cgroup *memcg) | 2864 | static int memcg_online_kmem(struct mem_cgroup *memcg) |
2865 | { | 2865 | { |
2866 | int err = 0; | 2866 | int err = 0; |
@@ -2908,24 +2908,6 @@ out: | |||
2908 | return err; | 2908 | return err; |
2909 | } | 2909 | } |
2910 | 2910 | ||
2911 | static int memcg_update_kmem_limit(struct mem_cgroup *memcg, | ||
2912 | unsigned long limit) | ||
2913 | { | ||
2914 | int ret; | ||
2915 | |||
2916 | mutex_lock(&memcg_limit_mutex); | ||
2917 | /* Top-level cgroup doesn't propagate from root */ | ||
2918 | if (!memcg_kmem_online(memcg)) { | ||
2919 | ret = memcg_online_kmem(memcg); | ||
2920 | if (ret) | ||
2921 | goto out; | ||
2922 | } | ||
2923 | ret = page_counter_limit(&memcg->kmem, limit); | ||
2924 | out: | ||
2925 | mutex_unlock(&memcg_limit_mutex); | ||
2926 | return ret; | ||
2927 | } | ||
2928 | |||
2929 | static int memcg_propagate_kmem(struct mem_cgroup *memcg) | 2911 | static int memcg_propagate_kmem(struct mem_cgroup *memcg) |
2930 | { | 2912 | { |
2931 | int ret = 0; | 2913 | int ret = 0; |
@@ -3000,16 +2982,45 @@ static void memcg_free_kmem(struct mem_cgroup *memcg) | |||
3000 | } | 2982 | } |
3001 | } | 2983 | } |
3002 | #else | 2984 | #else |
2985 | static int memcg_propagate_kmem(struct mem_cgroup *memcg) | ||
2986 | { | ||
2987 | return 0; | ||
2988 | } | ||
2989 | static void memcg_offline_kmem(struct mem_cgroup *memcg) | ||
2990 | { | ||
2991 | } | ||
2992 | static void memcg_free_kmem(struct mem_cgroup *memcg) | ||
2993 | { | ||
2994 | } | ||
2995 | #endif /* !CONFIG_SLOB */ | ||
2996 | |||
2997 | #ifdef CONFIG_MEMCG_KMEM | ||
3003 | static int memcg_update_kmem_limit(struct mem_cgroup *memcg, | 2998 | static int memcg_update_kmem_limit(struct mem_cgroup *memcg, |
3004 | unsigned long limit) | 2999 | unsigned long limit) |
3005 | { | 3000 | { |
3006 | return -EINVAL; | 3001 | int ret; |
3002 | |||
3003 | mutex_lock(&memcg_limit_mutex); | ||
3004 | /* Top-level cgroup doesn't propagate from root */ | ||
3005 | if (!memcg_kmem_online(memcg)) { | ||
3006 | ret = memcg_online_kmem(memcg); | ||
3007 | if (ret) | ||
3008 | goto out; | ||
3009 | } | ||
3010 | ret = page_counter_limit(&memcg->kmem, limit); | ||
3011 | out: | ||
3012 | mutex_unlock(&memcg_limit_mutex); | ||
3013 | return ret; | ||
3007 | } | 3014 | } |
3008 | static void memcg_offline_kmem(struct mem_cgroup *memcg) | 3015 | #else |
3016 | static int memcg_update_kmem_limit(struct mem_cgroup *memcg, | ||
3017 | unsigned long limit) | ||
3009 | { | 3018 | { |
3019 | return -EINVAL; | ||
3010 | } | 3020 | } |
3011 | #endif /* CONFIG_MEMCG_KMEM */ | 3021 | #endif /* CONFIG_MEMCG_KMEM */ |
3012 | 3022 | ||
3023 | |||
3013 | /* | 3024 | /* |
3014 | * The user of this function is... | 3025 | * The user of this function is... |
3015 | * RES_LIMIT. | 3026 | * RES_LIMIT. |
@@ -4182,7 +4193,7 @@ mem_cgroup_css_alloc(struct cgroup_subsys_state *parent_css) | |||
4182 | vmpressure_init(&memcg->vmpressure); | 4193 | vmpressure_init(&memcg->vmpressure); |
4183 | INIT_LIST_HEAD(&memcg->event_list); | 4194 | INIT_LIST_HEAD(&memcg->event_list); |
4184 | spin_lock_init(&memcg->event_list_lock); | 4195 | spin_lock_init(&memcg->event_list_lock); |
4185 | #ifdef CONFIG_MEMCG_KMEM | 4196 | #ifndef CONFIG_SLOB |
4186 | memcg->kmemcg_id = -1; | 4197 | memcg->kmemcg_id = -1; |
4187 | #endif | 4198 | #endif |
4188 | #ifdef CONFIG_CGROUP_WRITEBACK | 4199 | #ifdef CONFIG_CGROUP_WRITEBACK |
@@ -4244,10 +4255,11 @@ mem_cgroup_css_online(struct cgroup_subsys_state *css) | |||
4244 | } | 4255 | } |
4245 | mutex_unlock(&memcg_create_mutex); | 4256 | mutex_unlock(&memcg_create_mutex); |
4246 | 4257 | ||
4247 | #ifdef CONFIG_MEMCG_KMEM | ||
4248 | ret = memcg_propagate_kmem(memcg); | 4258 | ret = memcg_propagate_kmem(memcg); |
4249 | if (ret) | 4259 | if (ret) |
4250 | return ret; | 4260 | return ret; |
4261 | |||
4262 | #ifdef CONFIG_MEMCG_KMEM | ||
4251 | ret = tcp_init_cgroup(memcg); | 4263 | ret = tcp_init_cgroup(memcg); |
4252 | if (ret) | 4264 | if (ret) |
4253 | return ret; | 4265 | return ret; |
@@ -4308,8 +4320,9 @@ static void mem_cgroup_css_free(struct cgroup_subsys_state *css) | |||
4308 | static_branch_dec(&memcg_sockets_enabled_key); | 4320 | static_branch_dec(&memcg_sockets_enabled_key); |
4309 | #endif | 4321 | #endif |
4310 | 4322 | ||
4311 | #ifdef CONFIG_MEMCG_KMEM | ||
4312 | memcg_free_kmem(memcg); | 4323 | memcg_free_kmem(memcg); |
4324 | |||
4325 | #ifdef CONFIG_MEMCG_KMEM | ||
4313 | tcp_destroy_cgroup(memcg); | 4326 | tcp_destroy_cgroup(memcg); |
4314 | #endif | 4327 | #endif |
4315 | 4328 | ||