Skip to content

Commit

Permalink
mm: memcontrol: delete unused lrucare handling
Browse files Browse the repository at this point in the history
Swapin faults were the last event to charge pages after they had already
been put on the LRU list.  Now that we charge directly on swapin, the
lrucare portion of the charge code is unused.

Signed-off-by: Johannes Weiner <hannes@cmpxchg.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Reviewed-by: Joonsoo Kim <iamjoonsoo.kim@lge.com>
Cc: Alex Shi <alex.shi@linux.alibaba.com>
Cc: Hugh Dickins <hughd@google.com>
Cc: "Kirill A. Shutemov" <kirill@shutemov.name>
Cc: Michal Hocko <mhocko@suse.com>
Cc: Roman Gushchin <guro@fb.com>
Cc: Balbir Singh <bsingharora@gmail.com>
Cc: Shakeel Butt <shakeelb@google.com>
Link: http://lkml.kernel.org/r/20200508183105.225460-19-hannes@cmpxchg.org
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
  • Loading branch information
hnaz authored and torvalds committed Jun 4, 2020
1 parent 0a27cae commit d9eb1ea
Show file tree
Hide file tree
Showing 11 changed files with 19 additions and 70 deletions.
5 changes: 2 additions & 3 deletions include/linux/memcontrol.h
Original file line number Diff line number Diff line change
Expand Up @@ -355,8 +355,7 @@ static inline unsigned long mem_cgroup_protection(struct mem_cgroup *memcg,
enum mem_cgroup_protection mem_cgroup_protected(struct mem_cgroup *root,
struct mem_cgroup *memcg);

int mem_cgroup_charge(struct page *page, struct mm_struct *mm, gfp_t gfp_mask,
bool lrucare);
int mem_cgroup_charge(struct page *page, struct mm_struct *mm, gfp_t gfp_mask);

void mem_cgroup_uncharge(struct page *page);
void mem_cgroup_uncharge_list(struct list_head *page_list);
Expand Down Expand Up @@ -839,7 +838,7 @@ static inline enum mem_cgroup_protection mem_cgroup_protected(
}

static inline int mem_cgroup_charge(struct page *page, struct mm_struct *mm,
gfp_t gfp_mask, bool lrucare)
gfp_t gfp_mask)
{
return 0;
}
Expand Down
3 changes: 1 addition & 2 deletions kernel/events/uprobes.c
Original file line number Diff line number Diff line change
Expand Up @@ -167,8 +167,7 @@ static int __replace_page(struct vm_area_struct *vma, unsigned long addr,
addr + PAGE_SIZE);

if (new_page) {
err = mem_cgroup_charge(new_page, vma->vm_mm, GFP_KERNEL,
false);
err = mem_cgroup_charge(new_page, vma->vm_mm, GFP_KERNEL);
if (err)
return err;
}
Expand Down
2 changes: 1 addition & 1 deletion mm/filemap.c
Original file line number Diff line number Diff line change
Expand Up @@ -845,7 +845,7 @@ static int __add_to_page_cache_locked(struct page *page,
page->index = offset;

if (!huge) {
error = mem_cgroup_charge(page, current->mm, gfp_mask, false);
error = mem_cgroup_charge(page, current->mm, gfp_mask);
if (error)
goto error;
}
Expand Down
2 changes: 1 addition & 1 deletion mm/huge_memory.c
Original file line number Diff line number Diff line change
Expand Up @@ -593,7 +593,7 @@ static vm_fault_t __do_huge_pmd_anonymous_page(struct vm_fault *vmf,

VM_BUG_ON_PAGE(!PageCompound(page), page);

if (mem_cgroup_charge(page, vma->vm_mm, gfp, false)) {
if (mem_cgroup_charge(page, vma->vm_mm, gfp)) {
put_page(page);
count_vm_event(THP_FAULT_FALLBACK);
count_vm_event(THP_FAULT_FALLBACK_CHARGE);
Expand Down
4 changes: 2 additions & 2 deletions mm/khugepaged.c
Original file line number Diff line number Diff line change
Expand Up @@ -1059,7 +1059,7 @@ static void collapse_huge_page(struct mm_struct *mm,
goto out_nolock;
}

if (unlikely(mem_cgroup_charge(new_page, mm, gfp, false))) {
if (unlikely(mem_cgroup_charge(new_page, mm, gfp))) {
result = SCAN_CGROUP_CHARGE_FAIL;
goto out_nolock;
}
Expand Down Expand Up @@ -1632,7 +1632,7 @@ static void collapse_file(struct mm_struct *mm,
goto out;
}

if (unlikely(mem_cgroup_charge(new_page, mm, gfp, false))) {
if (unlikely(mem_cgroup_charge(new_page, mm, gfp))) {
result = SCAN_CGROUP_CHARGE_FAIL;
goto out;
}
Expand Down
57 changes: 4 additions & 53 deletions mm/memcontrol.c
Original file line number Diff line number Diff line change
Expand Up @@ -2655,51 +2655,9 @@ static void cancel_charge(struct mem_cgroup *memcg, unsigned int nr_pages)
}
#endif

static void lock_page_lru(struct page *page, int *isolated)
static void commit_charge(struct page *page, struct mem_cgroup *memcg)
{
pg_data_t *pgdat = page_pgdat(page);

spin_lock_irq(&pgdat->lru_lock);
if (PageLRU(page)) {
struct lruvec *lruvec;

lruvec = mem_cgroup_page_lruvec(page, pgdat);
ClearPageLRU(page);
del_page_from_lru_list(page, lruvec, page_lru(page));
*isolated = 1;
} else
*isolated = 0;
}

static void unlock_page_lru(struct page *page, int isolated)
{
pg_data_t *pgdat = page_pgdat(page);

if (isolated) {
struct lruvec *lruvec;

lruvec = mem_cgroup_page_lruvec(page, pgdat);
VM_BUG_ON_PAGE(PageLRU(page), page);
SetPageLRU(page);
add_page_to_lru_list(page, lruvec, page_lru(page));
}
spin_unlock_irq(&pgdat->lru_lock);
}

static void commit_charge(struct page *page, struct mem_cgroup *memcg,
bool lrucare)
{
int isolated;

VM_BUG_ON_PAGE(page->mem_cgroup, page);

/*
* In some cases, SwapCache and FUSE(splice_buf->radixtree), the page
* may already be on some other mem_cgroup's LRU. Take care of it.
*/
if (lrucare)
lock_page_lru(page, &isolated);

/*
* Nobody should be changing or seriously looking at
* page->mem_cgroup at this point:
Expand All @@ -2715,9 +2673,6 @@ static void commit_charge(struct page *page, struct mem_cgroup *memcg,
* have the page locked
*/
page->mem_cgroup = memcg;

if (lrucare)
unlock_page_lru(page, isolated);
}

#ifdef CONFIG_MEMCG_KMEM
Expand Down Expand Up @@ -6503,22 +6458,18 @@ enum mem_cgroup_protection mem_cgroup_protected(struct mem_cgroup *root,
* @page: page to charge
* @mm: mm context of the victim
* @gfp_mask: reclaim mode
* @lrucare: page might be on the LRU already
*
* Try to charge @page to the memcg that @mm belongs to, reclaiming
* pages according to @gfp_mask if necessary.
*
* Returns 0 on success. Otherwise, an error code is returned.
*/
int mem_cgroup_charge(struct page *page, struct mm_struct *mm, gfp_t gfp_mask,
bool lrucare)
int mem_cgroup_charge(struct page *page, struct mm_struct *mm, gfp_t gfp_mask)
{
unsigned int nr_pages = hpage_nr_pages(page);
struct mem_cgroup *memcg = NULL;
int ret = 0;

VM_BUG_ON_PAGE(PageLRU(page) && !lrucare, page);

if (mem_cgroup_disabled())
goto out;

Expand Down Expand Up @@ -6552,7 +6503,7 @@ int mem_cgroup_charge(struct page *page, struct mm_struct *mm, gfp_t gfp_mask,
if (ret)
goto out_put;

commit_charge(page, memcg, lrucare);
commit_charge(page, memcg);

local_irq_disable();
mem_cgroup_charge_statistics(memcg, page, nr_pages);
Expand Down Expand Up @@ -6753,7 +6704,7 @@ void mem_cgroup_migrate(struct page *oldpage, struct page *newpage)
page_counter_charge(&memcg->memsw, nr_pages);
css_get_many(&memcg->css, nr_pages);

commit_charge(newpage, memcg, false);
commit_charge(newpage, memcg);

local_irq_save(flags);
mem_cgroup_charge_statistics(memcg, newpage, nr_pages);
Expand Down
8 changes: 4 additions & 4 deletions mm/memory.c
Original file line number Diff line number Diff line change
Expand Up @@ -2675,7 +2675,7 @@ static vm_fault_t wp_page_copy(struct vm_fault *vmf)
}
}

if (mem_cgroup_charge(new_page, mm, GFP_KERNEL, false))
if (mem_cgroup_charge(new_page, mm, GFP_KERNEL))
goto oom_free_new;
cgroup_throttle_swaprate(new_page, GFP_KERNEL);

Expand Down Expand Up @@ -3134,7 +3134,7 @@ vm_fault_t do_swap_page(struct vm_fault *vmf)
/* Tell memcg to use swap ownership records */
SetPageSwapCache(page);
err = mem_cgroup_charge(page, vma->vm_mm,
GFP_KERNEL, false);
GFP_KERNEL);
ClearPageSwapCache(page);
if (err)
goto out_page;
Expand Down Expand Up @@ -3358,7 +3358,7 @@ static vm_fault_t do_anonymous_page(struct vm_fault *vmf)
if (!page)
goto oom;

if (mem_cgroup_charge(page, vma->vm_mm, GFP_KERNEL, false))
if (mem_cgroup_charge(page, vma->vm_mm, GFP_KERNEL))
goto oom_free_page;
cgroup_throttle_swaprate(page, GFP_KERNEL);

Expand Down Expand Up @@ -3854,7 +3854,7 @@ static vm_fault_t do_cow_fault(struct vm_fault *vmf)
if (!vmf->cow_page)
return VM_FAULT_OOM;

if (mem_cgroup_charge(vmf->cow_page, vma->vm_mm, GFP_KERNEL, false)) {
if (mem_cgroup_charge(vmf->cow_page, vma->vm_mm, GFP_KERNEL)) {
put_page(vmf->cow_page);
return VM_FAULT_OOM;
}
Expand Down
2 changes: 1 addition & 1 deletion mm/migrate.c
Original file line number Diff line number Diff line change
Expand Up @@ -2786,7 +2786,7 @@ static void migrate_vma_insert_page(struct migrate_vma *migrate,

if (unlikely(anon_vma_prepare(vma)))
goto abort;
if (mem_cgroup_charge(page, vma->vm_mm, GFP_KERNEL, false))
if (mem_cgroup_charge(page, vma->vm_mm, GFP_KERNEL))
goto abort;

/*
Expand Down
2 changes: 1 addition & 1 deletion mm/shmem.c
Original file line number Diff line number Diff line change
Expand Up @@ -624,7 +624,7 @@ static int shmem_add_to_page_cache(struct page *page,
page->index = index;

if (!PageSwapCache(page)) {
error = mem_cgroup_charge(page, charge_mm, gfp, false);
error = mem_cgroup_charge(page, charge_mm, gfp);
if (error) {
if (PageTransHuge(page)) {
count_vm_event(THP_FILE_FALLBACK);
Expand Down
2 changes: 1 addition & 1 deletion mm/swap_state.c
Original file line number Diff line number Diff line change
Expand Up @@ -435,7 +435,7 @@ struct page *__read_swap_cache_async(swp_entry_t entry, gfp_t gfp_mask,
goto fail_unlock;
}

if (mem_cgroup_charge(page, NULL, gfp_mask, false)) {
if (mem_cgroup_charge(page, NULL, gfp_mask)) {
delete_from_swap_cache(page);
goto fail_unlock;
}
Expand Down
2 changes: 1 addition & 1 deletion mm/userfaultfd.c
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ static int mcopy_atomic_pte(struct mm_struct *dst_mm,
__SetPageUptodate(page);

ret = -ENOMEM;
if (mem_cgroup_charge(page, dst_mm, GFP_KERNEL, false))
if (mem_cgroup_charge(page, dst_mm, GFP_KERNEL))
goto out_release;

_dst_pte = pte_mkdirty(mk_pte(page, dst_vma->vm_page_prot));
Expand Down

0 comments on commit d9eb1ea

Please sign in to comment.