mm-change-huge_ptep_clear_flush-to-return-the-original-pte.patch removed from -mm tree
The quilt patch titled
Subject: mm: change huge_ptep_clear_flush() to return the original pte
has been removed from the -mm tree. Its filename was
mm-change-huge_ptep_clear_flush-to-return-the-original-pte.patch
This patch was dropped because it was merged into the mm-stable branch\nof git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm
------------------------------------------------------
From: Baolin Wang <[email protected]>
Subject: mm: change huge_ptep_clear_flush() to return the original pte
Patch series "Fix CONT-PTE/PMD size hugetlb issue when unmapping or migrating", v4.
presently, migrating a hugetlb page or unmapping a poisoned hugetlb page, we'll use ptep_clear_flush() and set_pte_at() to nuke the page table entry and remap it, and this is incorrect for CONT-PTE or CONT-PMD size hugetlb page, which will cause potential data consistent issue. This patch set will change to use hugetlb related APIs to fix this issue.
Note: Mike pointed out the huge_ptep_get() will only return the one specific value, and it would not take into account the dirty or young bits of CONT-PTE/PMDs like the huge_ptep_get_and_clear() [1]. This inconsistent issue is not introduced by this patch set, and this issue will be addressed in another thread [2]. Meanwhile the uffd for hugetlb case [3] pointed out by Gerald also needs another patch to address.
[1] https://lore.kernel.org/linux-mm/[email protected]/
[2] https://lore.kernel.org/all/[email protected]/
[3] https://lore.kernel.org/linux-mm/20220503120343.6264e126@thinkpad/
This patch (of 3):
It is incorrect to use ptep_clear_flush() to nuke a hugetlb page table when unmapping or migrating a hugetlb page, and will change to use huge_ptep_clear_flush() instead in the following patches.
So this is a preparation patch, which changes the huge_ptep_clear_flush() to return the original pte to help to nuke a hugetlb page table.
---
arch/arm64/include/asm/hugetlb.h | 4 ++-- arch/arm64/mm/hugetlbpage.c | 12 +++++------- arch/ia64/include/asm/hugetlb.h | 5 +++-- arch/mips/include/asm/hugetlb.h | 9 ++++++--- arch/parisc/include/asm/hugetlb.h | 5 +++-- arch/powerpc/include/asm/hugetlb.h | 9 ++++++--- arch/s390/include/asm/hugetlb.h | 6 +++--- arch/sh/include/asm/hugetlb.h | 5 +++-- arch/sparc/include/asm/hugetlb.h | 5 +++-- include/asm-generic/hugetlb.h | 4 ++-- 10 files changed, 36 insertions(+), 28 deletions(-)
arch/arm64/include/asm/hugetlb.h renamed from arch/arm64/include/asm/hugetlb.h~mm-change-huge_ptep_clear_flush-to-return-the-original-pte +2 -2
@@ -39,8 +39,8 @@ extern pte_t huge_ptep_get_and_clear(strextern void huge_ptep_set_wrprotect (struct mm_struct *mm,unsigned long addr,pte_t *ptep);#define __HAVE_ARCH_HUGE_PTEP_CLEAR_FLUSH -extern void huge_ptep_clear_flush (struct vm_area_struct *vma, -unsigned long addr,pte_t *ptep); +extern pte_t huge_ptep_clear_flush (struct vm_area_struct *vma, +unsigned long addr,pte_t *ptep);#define __HAVE_ARCH_HUGE_PTE_CLEARextern void huge_pte_clear (struct mm_struct *mm,unsigned long addr,pte_t *ptep,unsigned long sz);
arch/arm64/mm/hugetlbpage.c renamed from arch/arm64/mm/hugetlbpage.c~mm-change-huge_ptep_clear_flush-to-return-the-original-pte +5 -7
@@ -486,19 +486,17 @@ void huge_ptep_set_wrprotect(struct mm_sset_pte_at (mm, addr, ptep,pfn_pte (pfn, hugeprot)); } -void huge_ptep_clear_flush (struct vm_area_struct *vma, -unsigned long addr,pte_t *ptep) +pte_t huge_ptep_clear_flush (struct vm_area_struct *vma, +unsigned long addr,pte_t *ptep) {size_t pgsize;int ncontig; -if (!pte_cont (READ_ONCE (*ptep))) { -ptep_clear_flush (vma, addr, ptep); -return ; - } +if (!pte_cont (READ_ONCE (*ptep))) +return ptep_clear_flush (vma, addr, ptep); ncontig =find_num_contig (vma->vm_mm, addr, ptep, &pgsize); -clear_flush (vma->vm_mm, addr, ptep, pgsize, ncontig); +return get_clear_flush (vma->vm_mm, addr, ptep, pgsize, ncontig); }static int __init hugetlbpage_init (void )
arch/ia64/include/asm/hugetlb.h renamed from arch/ia64/include/asm/hugetlb.h~mm-change-huge_ptep_clear_flush-to-return-the-original-pte +3 -2
@@ -23,9 +23,10 @@ static inline int is_hugepage_only_range#define is_hugepage_only_range is_hugepage_only_range#define __HAVE_ARCH_HUGE_PTEP_CLEAR_FLUSH -static inline void huge_ptep_clear_flush (struct vm_area_struct *vma, -unsigned long addr,pte_t *ptep) +static inline pte_t huge_ptep_clear_flush (struct vm_area_struct *vma, +unsigned long addr,pte_t *ptep) { +return *ptep; }#include <asm-generic/hugetlb.h>
arch/mips/include/asm/hugetlb.h renamed from arch/mips/include/asm/hugetlb.h~mm-change-huge_ptep_clear_flush-to-return-the-original-pte +6 -3
@@ -43,16 +43,19 @@ static inline pte_t huge_ptep_get_and_cl }#define __HAVE_ARCH_HUGE_PTEP_CLEAR_FLUSH -static inline void huge_ptep_clear_flush (struct vm_area_struct *vma, -unsigned long addr,pte_t *ptep) +static inline pte_t huge_ptep_clear_flush (struct vm_area_struct *vma, +unsigned long addr,pte_t *ptep) { +pte_t pte; +/* * clear the huge pte entry firstly, so that the other smp threads will * not get old pte entry after finishing flush_tlb_page and before * setting new huge pte entry */ -huge_ptep_get_and_clear (vma->vm_mm, addr, ptep); + pte =huge_ptep_get_and_clear (vma->vm_mm, addr, ptep);flush_tlb_page (vma, addr); +return pte; }#define __HAVE_ARCH_HUGE_PTE_NONE
arch/parisc/include/asm/hugetlb.h renamed from arch/parisc/include/asm/hugetlb.h~mm-change-huge_ptep_clear_flush-to-return-the-original-pte +3 -2
@@ -28,9 +28,10 @@ static inline int prepare_hugepage_range }#define __HAVE_ARCH_HUGE_PTEP_CLEAR_FLUSH -static inline void huge_ptep_clear_flush (struct vm_area_struct *vma, -unsigned long addr,pte_t *ptep) +static inline pte_t huge_ptep_clear_flush (struct vm_area_struct *vma, +unsigned long addr,pte_t *ptep) { +return *ptep; }#define __HAVE_ARCH_HUGE_PTEP_SET_WRPROTECT
arch/powerpc/include/asm/hugetlb.h renamed from arch/powerpc/include/asm/hugetlb.h~mm-change-huge_ptep_clear_flush-to-return-the-original-pte +6 -3
@@ -43,11 +43,14 @@ static inline pte_t huge_ptep_get_and_cl }#define __HAVE_ARCH_HUGE_PTEP_CLEAR_FLUSH -static inline void huge_ptep_clear_flush (struct vm_area_struct *vma, -unsigned long addr,pte_t *ptep) +static inline pte_t huge_ptep_clear_flush (struct vm_area_struct *vma, +unsigned long addr,pte_t *ptep) { -huge_ptep_get_and_clear (vma->vm_mm, addr, ptep); +pte_t pte; + + pte =huge_ptep_get_and_clear (vma->vm_mm, addr, ptep);flush_hugetlb_page (vma, addr); +return pte; }#define __HAVE_ARCH_HUGE_PTEP_SET_ACCESS_FLAGS
arch/s390/include/asm/hugetlb.h renamed from arch/s390/include/asm/hugetlb.h~mm-change-huge_ptep_clear_flush-to-return-the-original-pte +3 -3
@@ -50,10 +50,10 @@ static inline void huge_pte_clear(structset_pte (ptep,__pte (_SEGMENT_ENTRY_EMPTY)); } -static inline void huge_ptep_clear_flush (struct vm_area_struct *vma, -unsigned long address,pte_t *ptep) +static inline pte_t huge_ptep_clear_flush (struct vm_area_struct *vma, +unsigned long address,pte_t *ptep) { -huge_ptep_get_and_clear (vma->vm_mm, address, ptep); +return huge_ptep_get_and_clear (vma->vm_mm, address, ptep); } static inline int huge_ptep_set_access_flags(struct vm_area_struct *vma,
arch/sh/include/asm/hugetlb.h renamed from arch/sh/include/asm/hugetlb.h~mm-change-huge_ptep_clear_flush-to-return-the-original-pte +3 -2
@@ -21,9 +21,10 @@ static inline int prepare_hugepage_range }#define __HAVE_ARCH_HUGE_PTEP_CLEAR_FLUSH -static inline void huge_ptep_clear_flush (struct vm_area_struct *vma, -unsigned long addr,pte_t *ptep) +static inline pte_t huge_ptep_clear_flush (struct vm_area_struct *vma, +unsigned long addr,pte_t *ptep) { +return *ptep; }static inline void arch_clear_hugepage_flags (struct page *page)
arch/sparc/include/asm/hugetlb.h renamed from arch/sparc/include/asm/hugetlb.h~mm-change-huge_ptep_clear_flush-to-return-the-original-pte +3 -2
@@ -21,9 +21,10 @@ pte_t huge_ptep_get_and_clear(struct mm_ pte_t *ptep);#define __HAVE_ARCH_HUGE_PTEP_CLEAR_FLUSH -static inline void huge_ptep_clear_flush (struct vm_area_struct *vma, -unsigned long addr,pte_t *ptep) +static inline pte_t huge_ptep_clear_flush (struct vm_area_struct *vma, +unsigned long addr,pte_t *ptep) { +return *ptep; }#define __HAVE_ARCH_HUGE_PTEP_SET_WRPROTECT
include/asm-generic/hugetlb.h renamed from include/asm-generic/hugetlb.h~mm-change-huge_ptep_clear_flush-to-return-the-original-pte +2 -2
@@ -84,10 +84,10 @@ static inline pte_t huge_ptep_get_and_cl#endif #ifndef __HAVE_ARCH_HUGE_PTEP_CLEAR_FLUSH -static inline void huge_ptep_clear_flush (struct vm_area_struct *vma, +static inline pte_t huge_ptep_clear_flush (struct vm_area_struct *vma,unsigned long addr,pte_t *ptep) { -ptep_clear_flush (vma, addr, ptep); +return ptep_clear_flush (vma, addr, ptep); }#endif
_
Patches currently in -mm which might be from [email protected] are