diff options
author | Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com> | 2018-01-31 19:18:02 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2018-01-31 20:18:37 -0500 |
commit | 8cc931e03339eebbdbaa2ac1998d25a8a90b77d4 (patch) | |
tree | d73e172b9436740a9721374376070d53a768fb4a | |
parent | b6b34b2dfb7bab7b76a08862fe034c3bb29ec20d (diff) |
powerpc/mm: update pmdp_invalidate to return old pmd value
It's required to avoid losing dirty and accessed bits.
Link: http://lkml.kernel.org/r/20171213105756.69879-7-kirill.shutemov@linux.intel.com
Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
Cc: Vlastimil Babka <vbabka@suse.cz>
Cc: Andrea Arcangeli <aarcange@redhat.com>
Cc: Michal Hocko <mhocko@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r-- | arch/powerpc/include/asm/book3s/64/pgtable.h | 4 | ||||
-rw-r--r-- | arch/powerpc/mm/pgtable-book3s64.c | 7 |
2 files changed, 7 insertions, 4 deletions
diff --git a/arch/powerpc/include/asm/book3s/64/pgtable.h b/arch/powerpc/include/asm/book3s/64/pgtable.h index 44697817ccc6..ee19d5bbee06 100644 --- a/arch/powerpc/include/asm/book3s/64/pgtable.h +++ b/arch/powerpc/include/asm/book3s/64/pgtable.h | |||
@@ -1137,8 +1137,8 @@ static inline pgtable_t pgtable_trans_huge_withdraw(struct mm_struct *mm, | |||
1137 | } | 1137 | } |
1138 | 1138 | ||
1139 | #define __HAVE_ARCH_PMDP_INVALIDATE | 1139 | #define __HAVE_ARCH_PMDP_INVALIDATE |
1140 | extern void pmdp_invalidate(struct vm_area_struct *vma, unsigned long address, | 1140 | extern pmd_t pmdp_invalidate(struct vm_area_struct *vma, unsigned long address, |
1141 | pmd_t *pmdp); | 1141 | pmd_t *pmdp); |
1142 | 1142 | ||
1143 | #define __HAVE_ARCH_PMDP_HUGE_SPLIT_PREPARE | 1143 | #define __HAVE_ARCH_PMDP_HUGE_SPLIT_PREPARE |
1144 | static inline void pmdp_huge_split_prepare(struct vm_area_struct *vma, | 1144 | static inline void pmdp_huge_split_prepare(struct vm_area_struct *vma, |
diff --git a/arch/powerpc/mm/pgtable-book3s64.c b/arch/powerpc/mm/pgtable-book3s64.c index 3b65917785a5..422e80253a33 100644 --- a/arch/powerpc/mm/pgtable-book3s64.c +++ b/arch/powerpc/mm/pgtable-book3s64.c | |||
@@ -90,16 +90,19 @@ void serialize_against_pte_lookup(struct mm_struct *mm) | |||
90 | * We use this to invalidate a pmdp entry before switching from a | 90 | * We use this to invalidate a pmdp entry before switching from a |
91 | * hugepte to regular pmd entry. | 91 | * hugepte to regular pmd entry. |
92 | */ | 92 | */ |
93 | void pmdp_invalidate(struct vm_area_struct *vma, unsigned long address, | 93 | pmd_t pmdp_invalidate(struct vm_area_struct *vma, unsigned long address, |
94 | pmd_t *pmdp) | 94 | pmd_t *pmdp) |
95 | { | 95 | { |
96 | pmd_hugepage_update(vma->vm_mm, address, pmdp, _PAGE_PRESENT, 0); | 96 | unsigned long old_pmd; |
97 | |||
98 | old_pmd = pmd_hugepage_update(vma->vm_mm, address, pmdp, _PAGE_PRESENT, 0); | ||
97 | flush_pmd_tlb_range(vma, address, address + HPAGE_PMD_SIZE); | 99 | flush_pmd_tlb_range(vma, address, address + HPAGE_PMD_SIZE); |
98 | /* | 100 | /* |
99 | * This ensures that generic code that rely on IRQ disabling | 101 | * This ensures that generic code that rely on IRQ disabling |
100 | * to prevent a parallel THP split work as expected. | 102 | * to prevent a parallel THP split work as expected. |
101 | */ | 103 | */ |
102 | serialize_against_pte_lookup(vma->vm_mm); | 104 | serialize_against_pte_lookup(vma->vm_mm); |
105 | return __pmd(old_pmd); | ||
103 | } | 106 | } |
104 | 107 | ||
105 | static pmd_t pmd_set_protbits(pmd_t pmd, pgprot_t pgprot) | 108 | static pmd_t pmd_set_protbits(pmd_t pmd, pgprot_t pgprot) |