Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 49a18eae authored by Roman Gushchin's avatar Roman Gushchin Committed by Linus Torvalds
Browse files

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: default avatarRoman Gushchin <guro@fb.com>
Reviewed-by: default avatarShakeel Butt <shakeelb@google.com>
Acked-by: default avatarVladimir 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: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 43486694
Loading
Loading
Loading
Loading
+10 −0
Original line number Original line Diff line number Diff line
@@ -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
+17 −8
Original line number Original line Diff line number Diff line
@@ -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 */