aboutsummaryrefslogtreecommitdiffstats
path: root/mm
diff options
context:
space:
mode:
authorAneesh Kumar K.V <aneesh.kumar@linux.ibm.com>2019-03-05 18:46:37 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2019-03-06 00:07:18 -0500
commit023bdd00235eb0dcb71fd98f0b8347a9bb85d417 (patch)
treefe0e865386b9acfeec2362d25c4718618f9c9e1f /mm
parent5b323367ef2567dff0d3daff477186002754f0bd (diff)
mm/hugetlb: add prot_modify_start/commit sequence for hugetlb update
Architectures like ppc64 require to do a conditional tlb flush based on the old and new value of pte. Follow the regular pte change protection sequence for hugetlb too. This allows the architectures to override the update sequence. Link: http://lkml.kernel.org/r/20190116085035.29729-5-aneesh.kumar@linux.ibm.com Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.ibm.com> Reviewed-by: Michael Ellerman <mpe@ellerman.id.au> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> Cc: Heiko Carstens <heiko.carstens@de.ibm.com> Cc: "H. Peter Anvin" <hpa@zytor.com> Cc: Ingo Molnar <mingo@elte.hu> Cc: Martin Schwidefsky <schwidefsky@de.ibm.com> Cc: Nicholas Piggin <npiggin@gmail.com> Cc: Paul Mackerras <paulus@samba.org> Cc: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm')
-rw-r--r--mm/hugetlb.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/mm/hugetlb.c b/mm/hugetlb.c
index 2fb3062a3595..0c7848fccf93 100644
--- a/mm/hugetlb.c
+++ b/mm/hugetlb.c
@@ -4399,10 +4399,12 @@ unsigned long hugetlb_change_protection(struct vm_area_struct *vma,
4399 continue; 4399 continue;
4400 } 4400 }
4401 if (!huge_pte_none(pte)) { 4401 if (!huge_pte_none(pte)) {
4402 pte = huge_ptep_get_and_clear(mm, address, ptep); 4402 pte_t old_pte;
4403 pte = pte_mkhuge(huge_pte_modify(pte, newprot)); 4403
4404 old_pte = huge_ptep_modify_prot_start(vma, address, ptep);
4405 pte = pte_mkhuge(huge_pte_modify(old_pte, newprot));
4404 pte = arch_make_huge_pte(pte, vma, NULL, 0); 4406 pte = arch_make_huge_pte(pte, vma, NULL, 0);
4405 set_huge_pte_at(mm, address, ptep, pte); 4407 huge_ptep_modify_prot_commit(vma, address, ptep, old_pte, pte);
4406 pages++; 4408 pages++;
4407 } 4409 }
4408 spin_unlock(ptl); 4410 spin_unlock(ptl);