FROMLIST: mm, memcg: inline swap-related functions to improve disabled memcg config
Inline mem_cgroup_try_charge_swap, mem_cgroup_uncharge_swap and cgroup_throttle_swaprate functions to perform mem_cgroup_disabled static key check inline before calling the main body of the function. This minimizes the memcg overhead in the pagefault and exit_mmap paths when memcgs are disabled using cgroup_disable=memory command-line option. This change results in ~1% overhead reduction when running PFT test [1] comparing {CONFIG_MEMCG=n} against {CONFIG_MEMCG=y, cgroup_disable=memory} configuration on an 8-core ARM64 Android device. [1] https://lkml.org/lkml/2006/8/29/294 also used in mmtests suite Signed-off-by: Suren Baghdasaryan <surenb@google.com> Reviewed-by: Shakeel Butt <shakeelb@google.com> Reviewed-by: Muchun Song <songmuchun@bytedance.com> Acked-by: Johannes Weiner <hannes@cmpxchg.org> Acked-by: Michal Hocko <mhocko@suse.com> Link: https://lore.kernel.org/patchwork/patch/1458908/ Bug: 191223209 Signed-off-by: Suren Baghdasaryan <surenb@google.com> Change-Id: I18d59090ec908037b39324d1f1bb511d06e9c690
This commit is contained in:
@@ -695,7 +695,13 @@ static inline int mem_cgroup_swappiness(struct mem_cgroup *mem)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_SWAP) && defined(CONFIG_MEMCG) && defined(CONFIG_BLK_CGROUP)
|
#if defined(CONFIG_SWAP) && defined(CONFIG_MEMCG) && defined(CONFIG_BLK_CGROUP)
|
||||||
extern void cgroup_throttle_swaprate(struct page *page, gfp_t gfp_mask);
|
extern void __cgroup_throttle_swaprate(struct page *page, gfp_t gfp_mask);
|
||||||
|
static inline void cgroup_throttle_swaprate(struct page *page, gfp_t gfp_mask)
|
||||||
|
{
|
||||||
|
if (mem_cgroup_disabled())
|
||||||
|
return;
|
||||||
|
__cgroup_throttle_swaprate(page, gfp_mask);
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
static inline void cgroup_throttle_swaprate(struct page *page, gfp_t gfp_mask)
|
static inline void cgroup_throttle_swaprate(struct page *page, gfp_t gfp_mask)
|
||||||
{
|
{
|
||||||
@@ -704,8 +710,22 @@ static inline void cgroup_throttle_swaprate(struct page *page, gfp_t gfp_mask)
|
|||||||
|
|
||||||
#ifdef CONFIG_MEMCG_SWAP
|
#ifdef CONFIG_MEMCG_SWAP
|
||||||
extern void mem_cgroup_swapout(struct page *page, swp_entry_t entry);
|
extern void mem_cgroup_swapout(struct page *page, swp_entry_t entry);
|
||||||
extern int mem_cgroup_try_charge_swap(struct page *page, swp_entry_t entry);
|
extern int __mem_cgroup_try_charge_swap(struct page *page, swp_entry_t entry);
|
||||||
extern void mem_cgroup_uncharge_swap(swp_entry_t entry, unsigned int nr_pages);
|
static inline int mem_cgroup_try_charge_swap(struct page *page, swp_entry_t entry)
|
||||||
|
{
|
||||||
|
if (mem_cgroup_disabled())
|
||||||
|
return 0;
|
||||||
|
return __mem_cgroup_try_charge_swap(page, entry);
|
||||||
|
}
|
||||||
|
|
||||||
|
extern void __mem_cgroup_uncharge_swap(swp_entry_t entry, unsigned int nr_pages);
|
||||||
|
static inline void mem_cgroup_uncharge_swap(swp_entry_t entry, unsigned int nr_pages)
|
||||||
|
{
|
||||||
|
if (mem_cgroup_disabled())
|
||||||
|
return;
|
||||||
|
__mem_cgroup_uncharge_swap(entry, nr_pages);
|
||||||
|
}
|
||||||
|
|
||||||
extern long mem_cgroup_get_nr_swap_pages(struct mem_cgroup *memcg);
|
extern long mem_cgroup_get_nr_swap_pages(struct mem_cgroup *memcg);
|
||||||
extern bool mem_cgroup_swap_full(struct page *page);
|
extern bool mem_cgroup_swap_full(struct page *page);
|
||||||
#else
|
#else
|
||||||
|
@@ -7252,7 +7252,7 @@ void mem_cgroup_swapout(struct page *page, swp_entry_t entry)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* mem_cgroup_try_charge_swap - try charging swap space for a page
|
* __mem_cgroup_try_charge_swap - try charging swap space for a page
|
||||||
* @page: page being added to swap
|
* @page: page being added to swap
|
||||||
* @entry: swap entry to charge
|
* @entry: swap entry to charge
|
||||||
*
|
*
|
||||||
@@ -7260,16 +7260,13 @@ void mem_cgroup_swapout(struct page *page, swp_entry_t entry)
|
|||||||
*
|
*
|
||||||
* Returns 0 on success, -ENOMEM on failure.
|
* Returns 0 on success, -ENOMEM on failure.
|
||||||
*/
|
*/
|
||||||
int mem_cgroup_try_charge_swap(struct page *page, swp_entry_t entry)
|
int __mem_cgroup_try_charge_swap(struct page *page, swp_entry_t entry)
|
||||||
{
|
{
|
||||||
unsigned int nr_pages = thp_nr_pages(page);
|
unsigned int nr_pages = thp_nr_pages(page);
|
||||||
struct page_counter *counter;
|
struct page_counter *counter;
|
||||||
struct mem_cgroup *memcg;
|
struct mem_cgroup *memcg;
|
||||||
unsigned short oldid;
|
unsigned short oldid;
|
||||||
|
|
||||||
if (mem_cgroup_disabled())
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (!cgroup_subsys_on_dfl(memory_cgrp_subsys))
|
if (!cgroup_subsys_on_dfl(memory_cgrp_subsys))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@@ -7305,18 +7302,15 @@ int mem_cgroup_try_charge_swap(struct page *page, swp_entry_t entry)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* mem_cgroup_uncharge_swap - uncharge swap space
|
* __mem_cgroup_uncharge_swap - uncharge swap space
|
||||||
* @entry: swap entry to uncharge
|
* @entry: swap entry to uncharge
|
||||||
* @nr_pages: the amount of swap space to uncharge
|
* @nr_pages: the amount of swap space to uncharge
|
||||||
*/
|
*/
|
||||||
void mem_cgroup_uncharge_swap(swp_entry_t entry, unsigned int nr_pages)
|
void __mem_cgroup_uncharge_swap(swp_entry_t entry, unsigned int nr_pages)
|
||||||
{
|
{
|
||||||
struct mem_cgroup *memcg;
|
struct mem_cgroup *memcg;
|
||||||
unsigned short id;
|
unsigned short id;
|
||||||
|
|
||||||
if (mem_cgroup_disabled())
|
|
||||||
return;
|
|
||||||
|
|
||||||
id = swap_cgroup_record(entry, 0, nr_pages);
|
id = swap_cgroup_record(entry, 0, nr_pages);
|
||||||
rcu_read_lock();
|
rcu_read_lock();
|
||||||
memcg = mem_cgroup_from_id(id);
|
memcg = mem_cgroup_from_id(id);
|
||||||
|
@@ -3813,14 +3813,11 @@ static void free_swap_count_continuations(struct swap_info_struct *si)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if defined(CONFIG_MEMCG) && defined(CONFIG_BLK_CGROUP)
|
#if defined(CONFIG_MEMCG) && defined(CONFIG_BLK_CGROUP)
|
||||||
void cgroup_throttle_swaprate(struct page *page, gfp_t gfp_mask)
|
void __cgroup_throttle_swaprate(struct page *page, gfp_t gfp_mask)
|
||||||
{
|
{
|
||||||
struct swap_info_struct *si, *next;
|
struct swap_info_struct *si, *next;
|
||||||
int nid = page_to_nid(page);
|
int nid = page_to_nid(page);
|
||||||
|
|
||||||
if (mem_cgroup_disabled())
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (!(gfp_mask & __GFP_IO))
|
if (!(gfp_mask & __GFP_IO))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user