diff options
-rw-r--r-- | mm/memcontrol.c | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/mm/memcontrol.c b/mm/memcontrol.c index fe51d5e61389..9e7a4e521917 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c | |||
@@ -2381,13 +2381,14 @@ int __memcg_kmem_charge_memcg(struct page *page, gfp_t gfp, int order, | |||
2381 | if (!memcg_kmem_online(memcg)) | 2381 | if (!memcg_kmem_online(memcg)) |
2382 | return 0; | 2382 | return 0; |
2383 | 2383 | ||
2384 | if (!page_counter_try_charge(&memcg->kmem, nr_pages, &counter)) | ||
2385 | return -ENOMEM; | ||
2386 | |||
2387 | ret = try_charge(memcg, gfp, nr_pages); | 2384 | ret = try_charge(memcg, gfp, nr_pages); |
2388 | if (ret) { | 2385 | if (ret) |
2389 | page_counter_uncharge(&memcg->kmem, nr_pages); | ||
2390 | return ret; | 2386 | return ret; |
2387 | |||
2388 | if (!cgroup_subsys_on_dfl(memory_cgrp_subsys) && | ||
2389 | !page_counter_try_charge(&memcg->kmem, nr_pages, &counter)) { | ||
2390 | cancel_charge(memcg, nr_pages); | ||
2391 | return -ENOMEM; | ||
2391 | } | 2392 | } |
2392 | 2393 | ||
2393 | page->mem_cgroup = memcg; | 2394 | page->mem_cgroup = memcg; |
@@ -2416,7 +2417,9 @@ void __memcg_kmem_uncharge(struct page *page, int order) | |||
2416 | 2417 | ||
2417 | VM_BUG_ON_PAGE(mem_cgroup_is_root(memcg), page); | 2418 | VM_BUG_ON_PAGE(mem_cgroup_is_root(memcg), page); |
2418 | 2419 | ||
2419 | page_counter_uncharge(&memcg->kmem, nr_pages); | 2420 | if (!cgroup_subsys_on_dfl(memory_cgrp_subsys)) |
2421 | page_counter_uncharge(&memcg->kmem, nr_pages); | ||
2422 | |||
2420 | page_counter_uncharge(&memcg->memory, nr_pages); | 2423 | page_counter_uncharge(&memcg->memory, nr_pages); |
2421 | if (do_memsw_account()) | 2424 | if (do_memsw_account()) |
2422 | page_counter_uncharge(&memcg->memsw, nr_pages); | 2425 | page_counter_uncharge(&memcg->memsw, nr_pages); |
@@ -2922,7 +2925,8 @@ static int memcg_propagate_kmem(struct mem_cgroup *memcg) | |||
2922 | * onlined after this point, because it has at least one child | 2925 | * onlined after this point, because it has at least one child |
2923 | * already. | 2926 | * already. |
2924 | */ | 2927 | */ |
2925 | if (memcg_kmem_online(parent)) | 2928 | if (cgroup_subsys_on_dfl(memory_cgrp_subsys) || |
2929 | memcg_kmem_online(parent)) | ||
2926 | ret = memcg_online_kmem(memcg); | 2930 | ret = memcg_online_kmem(memcg); |
2927 | mutex_unlock(&memcg_limit_mutex); | 2931 | mutex_unlock(&memcg_limit_mutex); |
2928 | return ret; | 2932 | return ret; |