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 Link: https://lkml.kernel.org/r/20210713010934.299876-3-surenb@google.com 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> Cc: Tejun Heo <tj@kernel.org> Cc: Roman Gushchin <guro@fb.com> Cc: Yang Shi <shy828301@gmail.com> Cc: Alex Shi <alexs@kernel.org> Cc: Wei Yang <richard.weiyang@gmail.com> Cc: Jens Axboe <axboe@kernel.dk> Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com> Cc: David Hildenbrand <david@redhat.com> Cc: Matthew Wilcox (Oracle) <willy@infradead.org> Cc: Alistair Popple <apopple@nvidia.com> Cc: Minchan Kim <minchan@kernel.org> Cc: Miaohe Lin <linmiaohe@huawei.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Родитель
2c8d8f97ae
Коммит
01c4b28cd2
|
@ -721,7 +721,13 @@ static inline int mem_cgroup_swappiness(struct mem_cgroup *mem)
|
|||
#endif
|
||||
|
||||
#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
|
||||
static inline void cgroup_throttle_swaprate(struct page *page, gfp_t gfp_mask)
|
||||
{
|
||||
|
@ -730,8 +736,22 @@ static inline void cgroup_throttle_swaprate(struct page *page, gfp_t gfp_mask)
|
|||
|
||||
#ifdef CONFIG_MEMCG_SWAP
|
||||
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 void mem_cgroup_uncharge_swap(swp_entry_t entry, unsigned int nr_pages);
|
||||
extern int __mem_cgroup_try_charge_swap(struct page *page, swp_entry_t entry);
|
||||
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 bool mem_cgroup_swap_full(struct page *page);
|
||||
#else
|
||||
|
|
|
@ -7226,7 +7226,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
|
||||
* @entry: swap entry to charge
|
||||
*
|
||||
|
@ -7234,16 +7234,13 @@ void mem_cgroup_swapout(struct page *page, swp_entry_t entry)
|
|||
*
|
||||
* 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);
|
||||
struct page_counter *counter;
|
||||
struct mem_cgroup *memcg;
|
||||
unsigned short oldid;
|
||||
|
||||
if (mem_cgroup_disabled())
|
||||
return 0;
|
||||
|
||||
if (!cgroup_subsys_on_dfl(memory_cgrp_subsys))
|
||||
return 0;
|
||||
|
||||
|
@ -7279,18 +7276,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
|
||||
* @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;
|
||||
unsigned short id;
|
||||
|
||||
if (mem_cgroup_disabled())
|
||||
return;
|
||||
|
||||
id = swap_cgroup_record(entry, 0, nr_pages);
|
||||
rcu_read_lock();
|
||||
memcg = mem_cgroup_from_id(id);
|
||||
|
|
|
@ -3779,14 +3779,11 @@ static void free_swap_count_continuations(struct swap_info_struct *si)
|
|||
}
|
||||
|
||||
#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;
|
||||
int nid = page_to_nid(page);
|
||||
|
||||
if (mem_cgroup_disabled())
|
||||
return;
|
||||
|
||||
if (!(gfp_mask & __GFP_IO))
|
||||
return;
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче