Commit 67786313 authored by Kefeng Wang's avatar Kefeng Wang
Browse files

mm: use pfn_swap_entry_to_folio() in zap_huge_pmd()

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

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

Call pfn_swap_entry_to_folio() in zap_huge_pmd() as preparation for
converting mm counter functions to take a folio.  Saves a call to
compound_head() embedded inside PageAnon().

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


Signed-off-by: default avatarKefeng Wang <wangkefeng.wang@huawei.com>
Signed-off-by: default avatarMatthew Wilcox (Oracle) <willy@infradead.org>
Cc: David Hildenbrand <david@redhat.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
(cherry picked from commit 0103b27a6b826729dc1500d013e53ebed48980b3)
Signed-off-by: default avatarKefeng Wang <wangkefeng.wang@huawei.com>
parent f4afee11
Loading
Loading
Loading
Loading
+10 −7
Original line number Diff line number Diff line
@@ -1870,13 +1870,15 @@ int zap_huge_pmd(struct mmu_gather *tlb, struct vm_area_struct *vma,
		zap_deposited_table(tlb->mm, pmd);
		spin_unlock(ptl);
	} else {
		struct page *page = NULL;
		struct folio *folio = NULL;
		int flush_needed = 1;

		if (pmd_present(orig_pmd)) {
			page = pmd_page(orig_pmd);
			struct page *page = pmd_page(orig_pmd);

			folio = page_folio(page);
			add_reliable_page_counter(page, tlb->mm, -HPAGE_PMD_NR);
			folio_remove_rmap_pmd(page_folio(page), page, vma);
			folio_remove_rmap_pmd(folio, page, vma);
			VM_BUG_ON_PAGE(page_mapcount(page) < 0, page);
			VM_BUG_ON_PAGE(!PageHead(page), page);
		} else if (thp_migration_supported()) {
@@ -1884,23 +1886,24 @@ int zap_huge_pmd(struct mmu_gather *tlb, struct vm_area_struct *vma,

			VM_BUG_ON(!is_pmd_migration_entry(orig_pmd));
			entry = pmd_to_swp_entry(orig_pmd);
			page = pfn_swap_entry_to_page(entry);
			folio = pfn_swap_entry_folio(entry);
			flush_needed = 0;
		} else
			WARN_ONCE(1, "Non present huge pmd without pmd migration enabled!");

		if (PageAnon(page)) {
		if (folio_test_anon(folio)) {
			zap_deposited_table(tlb->mm, pmd);
			add_mm_counter(tlb->mm, MM_ANONPAGES, -HPAGE_PMD_NR);
		} else {
			if (arch_needs_pgtable_deposit())
				zap_deposited_table(tlb->mm, pmd);
			add_mm_counter(tlb->mm, mm_counter_file(page), -HPAGE_PMD_NR);
			add_mm_counter(tlb->mm, mm_counter_file(&folio->page),
				       -HPAGE_PMD_NR);
		}

		spin_unlock(ptl);
		if (flush_needed)
			tlb_remove_page_size(tlb, page, HPAGE_PMD_SIZE);
			tlb_remove_page_size(tlb, &folio->page, HPAGE_PMD_SIZE);
	}
	return 1;
}