The patch titled Subject: memcg-unify-slab-and-other-kmem-pages-charging-fix has been added to the -mm tree. Its filename is memcg-unify-slab-and-other-kmem-pages-charging-fix.patch This patch should soon appear at http://ozlabs.org/~akpm/mmots/broken-out/memcg-unify-slab-and-other-kmem-pages-charging-fix.patch and later at http://ozlabs.org/~akpm/mmotm/broken-out/memcg-unify-slab-and-other-kmem-pages-charging-fix.patch Before you just go and hit "reply", please: a) Consider who else should be cc'ed b) Prefer to cc a suitable mailing list as well c) Ideally: find the original patch on the mailing list and do a reply-to-all to that, adding suitable additional cc's *** Remember to use Documentation/SubmitChecklist when testing your code *** The -mm tree is included into linux-next and is updated there every 3-4 working days ------------------------------------------------------ From: Johannes Weiner <hannes@xxxxxxxxxxx> Subject: memcg-unify-slab-and-other-kmem-pages-charging-fix I think it'd be better to have an outer function than a magic parameter for the memcg lookup. Signed-off-by: Johannes Weiner <hannes@xxxxxxxxxxx> Cc: Vladimir Davydov <vdavydov@xxxxxxxxxxxxx> Cc: Michal Hocko <mhocko@xxxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> --- include/linux/memcontrol.h | 7 +++--- mm/memcontrol.c | 36 +++++++++++++++++------------------ mm/slab.h | 4 +-- 3 files changed, 24 insertions(+), 23 deletions(-) diff -puN include/linux/memcontrol.h~memcg-unify-slab-and-other-kmem-pages-charging-fix include/linux/memcontrol.h --- a/include/linux/memcontrol.h~memcg-unify-slab-and-other-kmem-pages-charging-fix +++ a/include/linux/memcontrol.h @@ -750,8 +750,9 @@ static inline bool memcg_kmem_is_active( * conditions, but because they are pretty simple, they are expected to be * fast. */ -int __memcg_kmem_charge(struct page *page, gfp_t gfp, int order, - struct mem_cgroup *memcg); +int __memcg_kmem_charge_memcg(struct page *page, gfp_t gfp, int order, + struct mem_cgroup *memcg); +int __memcg_kmem_charge(struct page *page, gfp_t gfp, int order); void __memcg_kmem_uncharge(struct page *page, int order); /* @@ -793,7 +794,7 @@ static __always_inline int memcg_kmem_ch { if (__memcg_kmem_bypass(gfp)) return 0; - return __memcg_kmem_charge(page, gfp, order, NULL); + return __memcg_kmem_charge(page, gfp, order); } /** diff -puN mm/memcontrol.c~memcg-unify-slab-and-other-kmem-pages-charging-fix mm/memcontrol.c --- a/mm/memcontrol.c~memcg-unify-slab-and-other-kmem-pages-charging-fix +++ a/mm/memcontrol.c @@ -2376,39 +2376,39 @@ void __memcg_kmem_put_cache(struct kmem_ css_put(&cachep->memcg_params.memcg->css); } -/* - * If @memcg != NULL, charge to @memcg, otherwise charge to the memcg the - * current task belongs to. - */ -int __memcg_kmem_charge(struct page *page, gfp_t gfp, int order, - struct mem_cgroup *memcg) +int __memcg_kmem_charge_memcg(struct page *page, gfp_t gfp, int order, + struct mem_cgroup *memcg) { - struct page_counter *counter; unsigned int nr_pages = 1 << order; - bool put = false; + struct page_counter *counter; int ret = 0; - if (!memcg) { - memcg = get_mem_cgroup_from_mm(current->mm); - put = true; - } if (!memcg_kmem_is_active(memcg)) - goto out; + return 0; ret = page_counter_try_charge(&memcg->kmem, nr_pages, &counter); if (ret) - goto out; + return ret; ret = try_charge(memcg, gfp, nr_pages); if (ret) { page_counter_uncharge(&memcg->kmem, nr_pages); - goto out; + return ret; } page->mem_cgroup = memcg; -out: - if (put) - css_put(&memcg->css); + + return 0; +} + +int __memcg_kmem_charge(struct page *page, gfp_t gfp, int order) +{ + struct mem_cgroup *memcg; + int ret; + + memcg = get_mem_cgroup_from_mm(current->mm); + ret = __memcg_kmem_charge_memcg(page, gfp, order, memcg); + css_put(&memcg->css); return ret; } diff -puN mm/slab.h~memcg-unify-slab-and-other-kmem-pages-charging-fix mm/slab.h --- a/mm/slab.h~memcg-unify-slab-and-other-kmem-pages-charging-fix +++ a/mm/slab.h @@ -244,8 +244,8 @@ static __always_inline int memcg_charge_ return 0; if (is_root_cache(s)) return 0; - return __memcg_kmem_charge(page, gfp, order, - s->memcg_params.memcg); + return __memcg_kmem_charge_memcg(page, gfp, order, + s->memcg_params.memcg); } extern void slab_init_memcg_params(struct kmem_cache *); _ Patches currently in -mm which might be from hannes@xxxxxxxxxxx are memcg-unify-slab-and-other-kmem-pages-charging-fix.patch mm-vmscan-count-slab-shrinking-results-after-each-shrink_slab.patch mm-increase-swap_cluster_max-to-batch-tlb-flushes-fix.patch -- To unsubscribe from this list: send the line "unsubscribe mm-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html