summaryrefslogtreecommitdiffstats
path: root/mm/memcontrol.c
diff options
context:
space:
mode:
authorJohannes Weiner <hannes@cmpxchg.org>2016-01-20 18:02:32 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2016-01-20 20:09:18 -0500
commit127424c86bb6cb87f0b563d9fdcfbbaf3c86ecec (patch)
tree7748cabc717161032e479be17e20f5046c9a8335 /mm/memcontrol.c
parent3893e302f6a377c4ef0f077f190bf760bf84e0be (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.c69
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)
349DEFINE_STATIC_KEY_FALSE(memcg_kmem_enabled_key); 349DEFINE_STATIC_KEY_FALSE(memcg_kmem_enabled_key);
350EXPORT_SYMBOL(memcg_kmem_enabled_key); 350EXPORT_SYMBOL(memcg_kmem_enabled_key);
351 351
352#endif /* CONFIG_MEMCG_KMEM */ 352#endif /* !CONFIG_SLOB */
353 353
354static struct mem_cgroup_per_zone * 354static struct mem_cgroup_per_zone *
355mem_cgroup_zone_zoneinfo(struct mem_cgroup *memcg, struct zone *zone) 355mem_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
2207static int memcg_alloc_cache_id(void) 2207static 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
2864static int memcg_online_kmem(struct mem_cgroup *memcg) 2864static 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
2911static 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);
2924out:
2925 mutex_unlock(&memcg_limit_mutex);
2926 return ret;
2927}
2928
2929static int memcg_propagate_kmem(struct mem_cgroup *memcg) 2911static 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
2985static int memcg_propagate_kmem(struct mem_cgroup *memcg)
2986{
2987 return 0;
2988}
2989static void memcg_offline_kmem(struct mem_cgroup *memcg)
2990{
2991}
2992static void memcg_free_kmem(struct mem_cgroup *memcg)
2993{
2994}
2995#endif /* !CONFIG_SLOB */
2996
2997#ifdef CONFIG_MEMCG_KMEM
3003static int memcg_update_kmem_limit(struct mem_cgroup *memcg, 2998static 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);
3011out:
3012 mutex_unlock(&memcg_limit_mutex);
3013 return ret;
3007} 3014}
3008static void memcg_offline_kmem(struct mem_cgroup *memcg) 3015#else
3016static 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