mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-03-16 12:14:06 +00:00
mm: vmscan: refactor updating current->reclaim_state
During reclaim, we keep track of pages reclaimed from other means than LRU-based reclaim through scan_control->reclaim_state->reclaimed_slab, which we stash a pointer to in current task_struct. However, we keep track of more than just reclaimed slab pages through this. We also use it for clean file pages dropped through pruned inodes, and xfs buffer pages freed. Rename reclaimed_slab to reclaimed, and add a helper function that wraps updating it through current, so that future changes to this logic are contained within include/linux/swap.h. Link: https://lkml.kernel.org/r/20230413104034.1086717-4-yosryahmed@google.com Signed-off-by: Yosry Ahmed <yosryahmed@google.com> Acked-by: Michal Hocko <mhocko@suse.com> Cc: Alexander Viro <viro@zeniv.linux.org.uk> Cc: Christoph Lameter <cl@linux.com> Cc: Darrick J. Wong <djwong@kernel.org> Cc: Dave Chinner <david@fromorbit.com> Cc: David Hildenbrand <david@redhat.com> Cc: David Rientjes <rientjes@google.com> Cc: Hyeonggon Yoo <42.hyeyoo@gmail.com> Cc: Johannes Weiner <hannes@cmpxchg.org> Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com> Cc: Matthew Wilcox <willy@infradead.org> Cc: Miaohe Lin <linmiaohe@huawei.com> Cc: NeilBrown <neilb@suse.de> Cc: Peter Xu <peterx@redhat.com> Cc: Roman Gushchin <roman.gushchin@linux.dev> Cc: Shakeel Butt <shakeelb@google.com> Cc: Tim Chen <tim.c.chen@linux.intel.com> Cc: Vlastimil Babka <vbabka@suse.cz> Cc: Yu Zhao <yuzhao@google.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
parent
ef05e68936
commit
c7b23b68e2
6 changed files with 23 additions and 14 deletions
|
@ -864,8 +864,7 @@ static enum lru_status inode_lru_isolate(struct list_head *item,
|
|||
__count_vm_events(KSWAPD_INODESTEAL, reap);
|
||||
else
|
||||
__count_vm_events(PGINODESTEAL, reap);
|
||||
if (current->reclaim_state)
|
||||
current->reclaim_state->reclaimed_slab += reap;
|
||||
mm_account_reclaimed_pages(reap);
|
||||
}
|
||||
iput(inode);
|
||||
spin_lock(lru_lock);
|
||||
|
|
|
@ -286,8 +286,7 @@ xfs_buf_free_pages(
|
|||
if (bp->b_pages[i])
|
||||
__free_page(bp->b_pages[i]);
|
||||
}
|
||||
if (current->reclaim_state)
|
||||
current->reclaim_state->reclaimed_slab += bp->b_page_count;
|
||||
mm_account_reclaimed_pages(bp->b_page_count);
|
||||
|
||||
if (bp->b_pages != bp->b_page_array)
|
||||
kmem_free(bp->b_pages);
|
||||
|
|
|
@ -153,13 +153,28 @@ union swap_header {
|
|||
* memory reclaim
|
||||
*/
|
||||
struct reclaim_state {
|
||||
unsigned long reclaimed_slab;
|
||||
/* pages reclaimed outside of LRU-based reclaim */
|
||||
unsigned long reclaimed;
|
||||
#ifdef CONFIG_LRU_GEN
|
||||
/* per-thread mm walk data */
|
||||
struct lru_gen_mm_walk *mm_walk;
|
||||
#endif
|
||||
};
|
||||
|
||||
/*
|
||||
* mm_account_reclaimed_pages(): account reclaimed pages outside of LRU-based
|
||||
* reclaim
|
||||
* @pages: number of pages reclaimed
|
||||
*
|
||||
* If the current process is undergoing a reclaim operation, increment the
|
||||
* number of reclaimed pages by @pages.
|
||||
*/
|
||||
static inline void mm_account_reclaimed_pages(unsigned long pages)
|
||||
{
|
||||
if (current->reclaim_state)
|
||||
current->reclaim_state->reclaimed += pages;
|
||||
}
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
struct address_space;
|
||||
|
|
|
@ -1392,8 +1392,7 @@ static void kmem_freepages(struct kmem_cache *cachep, struct slab *slab)
|
|||
smp_wmb();
|
||||
__folio_clear_slab(folio);
|
||||
|
||||
if (current->reclaim_state)
|
||||
current->reclaim_state->reclaimed_slab += 1 << order;
|
||||
mm_account_reclaimed_pages(1 << order);
|
||||
unaccount_slab(slab, order, cachep);
|
||||
__free_pages(&folio->page, order);
|
||||
}
|
||||
|
|
|
@ -61,7 +61,7 @@
|
|||
#include <linux/slab.h>
|
||||
|
||||
#include <linux/mm.h>
|
||||
#include <linux/swap.h> /* struct reclaim_state */
|
||||
#include <linux/swap.h> /* mm_account_reclaimed_pages() */
|
||||
#include <linux/cache.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/export.h>
|
||||
|
@ -211,9 +211,7 @@ static void slob_free_pages(void *b, int order)
|
|||
{
|
||||
struct page *sp = virt_to_page(b);
|
||||
|
||||
if (current->reclaim_state)
|
||||
current->reclaim_state->reclaimed_slab += 1 << order;
|
||||
|
||||
mm_account_reclaimed_pages(1 << order);
|
||||
mod_node_page_state(page_pgdat(sp), NR_SLAB_UNRECLAIMABLE_B,
|
||||
-(PAGE_SIZE << order));
|
||||
__free_pages(sp, order);
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
*/
|
||||
|
||||
#include <linux/mm.h>
|
||||
#include <linux/swap.h> /* struct reclaim_state */
|
||||
#include <linux/swap.h> /* mm_account_reclaimed_pages() */
|
||||
#include <linux/module.h>
|
||||
#include <linux/bit_spinlock.h>
|
||||
#include <linux/interrupt.h>
|
||||
|
@ -2063,8 +2063,7 @@ static void __free_slab(struct kmem_cache *s, struct slab *slab)
|
|||
/* Make the mapping reset visible before clearing the flag */
|
||||
smp_wmb();
|
||||
__folio_clear_slab(folio);
|
||||
if (current->reclaim_state)
|
||||
current->reclaim_state->reclaimed_slab += pages;
|
||||
mm_account_reclaimed_pages(pages);
|
||||
unaccount_slab(slab, order, s);
|
||||
__free_pages(&folio->page, order);
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue