Commit 6a7ecc2a authored by Matthew Wilcox (Oracle)'s avatar Matthew Wilcox (Oracle) Committed by Liu Shixin
Browse files

mm: convert free_swap_cache() to take a folio

mainline inclusion
from mainline-v6.9-rc1
commit 63b774993dd02b17127cb404b7362fc436632995
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/I9R3AY
CVE: NA

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=63b774993dd02b17127cb404b7362fc436632995

--------------------------------

All but one caller already has a folio, so convert
free_page_and_swap_cache() to have a folio and remove the call to
page_folio().

Link: https://lkml.kernel.org/r/20240227174254.710559-19-willy@infradead.org


Signed-off-by: default avatarMatthew Wilcox (Oracle) <willy@infradead.org>
Reviewed-by: default avatarRyan Roberts <ryan.roberts@arm.com>
Reviewed-by: default avatarDavid Hildenbrand <david@redhat.com>
Cc: Mel Gorman <mgorman@suse.de>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLiu Shixin <liushixin2@huawei.com>
parent 6a9c64d0
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -482,9 +482,9 @@ static inline unsigned long total_swapcache_pages(void)
	return global_node_page_state(NR_SWAPCACHE);
}

extern void free_swap_cache(struct page *page);
extern void free_page_and_swap_cache(struct page *);
extern void free_pages_and_swap_cache(struct encoded_page **, int);
void free_swap_cache(struct folio *folio);
void free_page_and_swap_cache(struct page *);
void free_pages_and_swap_cache(struct encoded_page **, int);
/* linux/mm/swapfile.c */
extern atomic_long_t nr_swap_pages;
extern long total_swap_pages;
@@ -577,7 +577,7 @@ static inline void free_swap_and_cache_nr(swp_entry_t entry, int nr)
{
}

static inline void free_swap_cache(struct page *page)
static inline void free_swap_cache(struct folio *folio)
{
}

+1 −1
Original line number Diff line number Diff line
@@ -738,7 +738,7 @@ static void __collapse_huge_page_copy_succeeded(pte_t *pte,
		node_stat_sub_folio(src, NR_ISOLATED_ANON +
				folio_is_file_lru(src));
		folio_unlock(src);
		free_swap_cache(&src->page);
		free_swap_cache(src);
		folio_putback_lru(src);
	}
}
+1 −1
Original line number Diff line number Diff line
@@ -3390,7 +3390,7 @@ static vm_fault_t wp_page_copy(struct vm_fault *vmf)
		folio_put(new_folio);
	if (old_folio) {
		if (page_copied)
			free_swap_cache(&old_folio->page);
			free_swap_cache(old_folio);
		folio_put(old_folio);
	}

+6 −6
Original line number Diff line number Diff line
@@ -283,10 +283,8 @@ void clear_shadow_from_swap_cache(int type, unsigned long begin,
 * folio_free_swap() _with_ the lock.
 * 					- Marcelo
 */
void free_swap_cache(struct page *page)
void free_swap_cache(struct folio *folio)
{
	struct folio *folio = page_folio(page);

	if (folio_test_swapcache(folio) && !folio_mapped(folio) &&
	    folio_trylock(folio)) {
		folio_free_swap(folio);
@@ -300,9 +298,11 @@ void free_swap_cache(struct page *page)
 */
void free_page_and_swap_cache(struct page *page)
{
	free_swap_cache(page);
	struct folio *folio = page_folio(page);

	free_swap_cache(folio);
	if (!is_huge_zero_page(page))
		put_page(page);
		folio_put(folio);
}

/*
@@ -319,7 +319,7 @@ void free_pages_and_swap_cache(struct encoded_page **pages, int nr)
	for (int i = 0; i < nr; i++) {
		struct folio *folio = page_folio(encoded_page_ptr(pages[i]));

		free_swap_cache(&folio->page);
		free_swap_cache(folio);
		refs[folios.nr] = 1;
		if (unlikely(encoded_page_flags(pages[i]) &
			     ENCODED_PAGE_BIT_NR_PAGES_NEXT))