mm: memcg/slab: introduce __memcg_kmem_uncharge_memcg()
Let's separate the page counter modification code out of __memcg_kmem_uncharge() in a way similar to what __memcg_kmem_charge() and __memcg_kmem_charge_memcg() work. This will allow to reuse this code later using a new memcg_kmem_uncharge_memcg() wrapper, which calls __memcg_kmem_uncharge_memcg() if memcg_kmem_enabled() check is passed. Link: http://lkml.kernel.org/r/20190611231813.3148843-5-guro@fb.com Signed-off-by: Roman Gushchin <guro@fb.com> Reviewed-by: Shakeel Butt <shakeelb@google.com> Acked-by: Vladimir Davydov <vdavydov.dev@gmail.com> Cc: Christoph Lameter <cl@linux.com> Cc: Johannes Weiner <hannes@cmpxchg.org> Cc: Michal Hocko <mhocko@suse.com> Cc: Waiman Long <longman@redhat.com> Cc: David Rientjes <rientjes@google.com> Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com> Cc: Pekka Enberg <penberg@kernel.org> Cc: Andrei Vagin <avagin@gmail.com> Cc: Qian Cai <cai@lca.pw> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
4348669475
commit
49a18eae2e
|
@ -1278,6 +1278,8 @@ int __memcg_kmem_charge(struct page *page, gfp_t gfp, int order);
|
||||||
void __memcg_kmem_uncharge(struct page *page, int order);
|
void __memcg_kmem_uncharge(struct page *page, int order);
|
||||||
int __memcg_kmem_charge_memcg(struct page *page, gfp_t gfp, int order,
|
int __memcg_kmem_charge_memcg(struct page *page, gfp_t gfp, int order,
|
||||||
struct mem_cgroup *memcg);
|
struct mem_cgroup *memcg);
|
||||||
|
void __memcg_kmem_uncharge_memcg(struct mem_cgroup *memcg,
|
||||||
|
unsigned int nr_pages);
|
||||||
|
|
||||||
extern struct static_key_false memcg_kmem_enabled_key;
|
extern struct static_key_false memcg_kmem_enabled_key;
|
||||||
extern struct workqueue_struct *memcg_kmem_cache_wq;
|
extern struct workqueue_struct *memcg_kmem_cache_wq;
|
||||||
|
@ -1319,6 +1321,14 @@ static inline int memcg_kmem_charge_memcg(struct page *page, gfp_t gfp,
|
||||||
return __memcg_kmem_charge_memcg(page, gfp, order, memcg);
|
return __memcg_kmem_charge_memcg(page, gfp, order, memcg);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void memcg_kmem_uncharge_memcg(struct page *page, int order,
|
||||||
|
struct mem_cgroup *memcg)
|
||||||
|
{
|
||||||
|
if (memcg_kmem_enabled())
|
||||||
|
__memcg_kmem_uncharge_memcg(memcg, 1 << order);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* helper for accessing a memcg's index. It will be used as an index in the
|
* helper for accessing a memcg's index. It will be used as an index in the
|
||||||
* child cache array in kmem_cache, and also to derive its name. This function
|
* child cache array in kmem_cache, and also to derive its name. This function
|
||||||
|
|
|
@ -2807,6 +2807,22 @@ int __memcg_kmem_charge(struct page *page, gfp_t gfp, int order)
|
||||||
css_put(&memcg->css);
|
css_put(&memcg->css);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* __memcg_kmem_uncharge_memcg: uncharge a kmem page
|
||||||
|
* @memcg: memcg to uncharge
|
||||||
|
* @nr_pages: number of pages to uncharge
|
||||||
|
*/
|
||||||
|
void __memcg_kmem_uncharge_memcg(struct mem_cgroup *memcg,
|
||||||
|
unsigned int nr_pages)
|
||||||
|
{
|
||||||
|
if (!cgroup_subsys_on_dfl(memory_cgrp_subsys))
|
||||||
|
page_counter_uncharge(&memcg->kmem, nr_pages);
|
||||||
|
|
||||||
|
page_counter_uncharge(&memcg->memory, nr_pages);
|
||||||
|
if (do_memsw_account())
|
||||||
|
page_counter_uncharge(&memcg->memsw, nr_pages);
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* __memcg_kmem_uncharge: uncharge a kmem page
|
* __memcg_kmem_uncharge: uncharge a kmem page
|
||||||
* @page: page to uncharge
|
* @page: page to uncharge
|
||||||
|
@ -2821,14 +2837,7 @@ void __memcg_kmem_uncharge(struct page *page, int order)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
VM_BUG_ON_PAGE(mem_cgroup_is_root(memcg), page);
|
VM_BUG_ON_PAGE(mem_cgroup_is_root(memcg), page);
|
||||||
|
__memcg_kmem_uncharge_memcg(memcg, nr_pages);
|
||||||
if (!cgroup_subsys_on_dfl(memory_cgrp_subsys))
|
|
||||||
page_counter_uncharge(&memcg->kmem, nr_pages);
|
|
||||||
|
|
||||||
page_counter_uncharge(&memcg->memory, nr_pages);
|
|
||||||
if (do_memsw_account())
|
|
||||||
page_counter_uncharge(&memcg->memsw, nr_pages);
|
|
||||||
|
|
||||||
page->mem_cgroup = NULL;
|
page->mem_cgroup = NULL;
|
||||||
|
|
||||||
/* slab pages do not have PageKmemcg flag set */
|
/* slab pages do not have PageKmemcg flag set */
|
||||||
|
|
Loading…
Reference in New Issue