Commit 42667f75 authored by Matthew Wilcox (Oracle)'s avatar Matthew Wilcox (Oracle) Committed by Kefeng Wang
Browse files

mm: add pfn_swap_entry_folio()

mainline inclusion
from mainline-v6.9-rc1
commit 5662400a9ac03f38ef3b84e4ff9a640a4604bef9
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/I9CHB4
CVE: NA

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

Patch series "mm: convert mm counter to take a folio", v3.

Make sure all mm_counter() and mm_counter_file() callers have a folio,
then convert mm counter functions to take a folio, which saves some
compound_head() calls.

This patch (of 10):

Thanks to the compound_head() hidden inside PageLocked(), this saves a
call to compound_head() over calling page_folio(pfn_swap_entry_to_page())

Link: https://lkml.kernel.org/r/20240111152429.3374566-1-willy@infradead.org
Link: https://lkml.kernel.org/r/20240111152429.3374566-2-willy@infradead.org


Signed-off-by: default avatarMatthew Wilcox (Oracle) <willy@infradead.org>
Cc: David Hildenbrand <david@redhat.com>
Cc: Kefeng Wang <wangkefeng.wang@huawei.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
(cherry picked from commit 5662400a9ac03f38ef3b84e4ff9a640a4604bef9)
Signed-off-by: default avatarKefeng Wang <wangkefeng.wang@huawei.com>
parent cd428475
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -484,6 +484,19 @@ static inline struct page *pfn_swap_entry_to_page(swp_entry_t entry)
	return p;
}

static inline struct folio *pfn_swap_entry_folio(swp_entry_t entry)
{
	struct folio *folio = pfn_folio(swp_offset_pfn(entry));

	/*
	 * Any use of migration entries may only occur while the
	 * corresponding folio is locked
	 */
	BUG_ON(is_migration_entry(entry) && !folio_test_locked(folio));

	return folio;
}

/*
 * A pfn swap entry is a special type of swap entry that always has a pfn stored
 * in the swap offset. They are used to represent unaddressable device memory
+1 −1
Original line number Diff line number Diff line
@@ -1369,7 +1369,7 @@ void migration_entry_wait_on_locked(swp_entry_t entry, spinlock_t *ptl)
	unsigned long pflags = 0;
	bool in_thrashing;
	wait_queue_head_t *q;
	struct folio *folio = page_folio(pfn_swap_entry_to_page(entry));
	struct folio *folio = pfn_swap_entry_folio(entry);

	q = folio_waitqueue(folio);
	if (!folio_test_uptodate(folio) && folio_test_workingset(folio)) {
+1 −1
Original line number Diff line number Diff line
@@ -2011,7 +2011,7 @@ int change_huge_pmd(struct mmu_gather *tlb, struct vm_area_struct *vma,
#ifdef CONFIG_ARCH_ENABLE_THP_MIGRATION
	if (is_swap_pmd(*pmd)) {
		swp_entry_t entry = pmd_to_swp_entry(*pmd);
		struct folio *folio = page_folio(pfn_swap_entry_to_page(entry));
		struct folio *folio = pfn_swap_entry_folio(entry);
		pmd_t newpmd;

		VM_BUG_ON(!is_pmd_migration_entry(*pmd));