diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2022-03-22 17:03:12 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2022-03-22 17:03:12 -0700 | 
| commit | 9030fb0bb9d607908d51f9ee02efdbe01da355ee (patch) | |
| tree | 9ee1d9d47fbb4b30c7f5cbc291432e666e58967a /mm/page_idle.c | |
| parent | 3bf03b9a0839c9fb06927ae53ebd0f960b19d408 (diff) | |
| parent | 2a3c4bce3edb0d54983384aa8a88c0da330638f4 (diff) | |
Merge tag 'folio-5.18c' of git://git.infradead.org/users/willy/pagecache
Pull folio updates from Matthew Wilcox:
 - Rewrite how munlock works to massively reduce the contention on
   i_mmap_rwsem (Hugh Dickins):
     https://lore.kernel.org/linux-mm/8e4356d-9622-a7f0-b2c-f116b5f2efea@google.com/
 - Sort out the page refcount mess for ZONE_DEVICE pages (Christoph
   Hellwig):
     https://lore.kernel.org/linux-mm/20220210072828.2930359-1-hch@lst.de/
 - Convert GUP to use folios and make pincount available for order-1
   pages. (Matthew Wilcox)
 - Convert a few more truncation functions to use folios (Matthew
   Wilcox)
 - Convert page_vma_mapped_walk to use PFNs instead of pages (Matthew
   Wilcox)
 - Convert rmap_walk to use folios (Matthew Wilcox)
 - Convert most of shrink_page_list() to use a folio (Matthew Wilcox)
 - Add support for creating large folios in readahead (Matthew Wilcox)
* tag 'folio-5.18c' of git://git.infradead.org/users/willy/pagecache: (114 commits)
  mm/damon: minor cleanup for damon_pa_young
  selftests/vm/transhuge-stress: Support file-backed PMD folios
  mm/filemap: Support VM_HUGEPAGE for file mappings
  mm/readahead: Switch to page_cache_ra_order
  mm/readahead: Align file mappings for non-DAX
  mm/readahead: Add large folio readahead
  mm: Support arbitrary THP sizes
  mm: Make large folios depend on THP
  mm: Fix READ_ONLY_THP warning
  mm/filemap: Allow large folios to be added to the page cache
  mm: Turn can_split_huge_page() into can_split_folio()
  mm/vmscan: Convert pageout() to take a folio
  mm/vmscan: Turn page_check_references() into folio_check_references()
  mm/vmscan: Account large folios correctly
  mm/vmscan: Optimise shrink_page_list for non-PMD-sized folios
  mm/vmscan: Free non-shmem folios without splitting them
  mm/rmap: Constify the rmap_walk_control argument
  mm/rmap: Convert rmap_walk() to take a folio
  mm: Turn page_anon_vma() into folio_anon_vma()
  mm/rmap: Turn page_lock_anon_vma_read() into folio_lock_anon_vma_read()
  ...
Diffstat (limited to 'mm/page_idle.c')
| -rw-r--r-- | mm/page_idle.c | 30 | 
1 files changed, 14 insertions, 16 deletions
diff --git a/mm/page_idle.c b/mm/page_idle.c index edead6a8a5f9..fc0435abf909 100644 --- a/mm/page_idle.c +++ b/mm/page_idle.c @@ -13,6 +13,8 @@  #include <linux/page_ext.h>  #include <linux/page_idle.h> +#include "internal.h" +  #define BITMAP_CHUNK_SIZE	sizeof(u64)  #define BITMAP_CHUNK_BITS	(BITMAP_CHUNK_SIZE * BITS_PER_BYTE) @@ -44,15 +46,11 @@ static struct page *page_idle_get_page(unsigned long pfn)  	return page;  } -static bool page_idle_clear_pte_refs_one(struct page *page, +static bool page_idle_clear_pte_refs_one(struct folio *folio,  					struct vm_area_struct *vma,  					unsigned long addr, void *arg)  { -	struct page_vma_mapped_walk pvmw = { -		.page = page, -		.vma = vma, -		.address = addr, -	}; +	DEFINE_FOLIO_VMA_WALK(pvmw, folio, vma, addr, 0);  	bool referenced = false;  	while (page_vma_mapped_walk(&pvmw)) { @@ -74,41 +72,41 @@ static bool page_idle_clear_pte_refs_one(struct page *page,  	}  	if (referenced) { -		clear_page_idle(page); +		folio_clear_idle(folio);  		/*  		 * We cleared the referenced bit in a mapping to this page. To  		 * avoid interference with page reclaim, mark it young so that -		 * page_referenced() will return > 0. +		 * folio_referenced() will return > 0.  		 */ -		set_page_young(page); +		folio_set_young(folio);  	}  	return true;  }  static void page_idle_clear_pte_refs(struct page *page)  { +	struct folio *folio = page_folio(page);  	/*  	 * Since rwc.arg is unused, rwc is effectively immutable, so we  	 * can make it static const to save some cycles and stack.  	 */  	static const struct rmap_walk_control rwc = {  		.rmap_one = page_idle_clear_pte_refs_one, -		.anon_lock = page_lock_anon_vma_read, +		.anon_lock = folio_lock_anon_vma_read,  	};  	bool need_lock; -	if (!page_mapped(page) || -	    !page_rmapping(page)) +	if (!folio_mapped(folio) || !folio_raw_mapping(folio))  		return; -	need_lock = !PageAnon(page) || PageKsm(page); -	if (need_lock && !trylock_page(page)) +	need_lock = !folio_test_anon(folio) || folio_test_ksm(folio); +	if (need_lock && !folio_trylock(folio))  		return; -	rmap_walk(page, (struct rmap_walk_control *)&rwc); +	rmap_walk(folio, &rwc);  	if (need_lock) -		unlock_page(page); +		folio_unlock(folio);  }  static ssize_t page_idle_bitmap_read(struct file *file, struct kobject *kobj,  | 
