diff options
| -rw-r--r-- | arch/x86/include/asm/pgtable.h | 2 | ||||
| -rw-r--r-- | arch/x86/include/asm/pgtable_64.h | 20 | ||||
| -rw-r--r-- | arch/x86/mm/pgtable.c | 8 |
3 files changed, 15 insertions, 15 deletions
diff --git a/arch/x86/include/asm/pgtable.h b/arch/x86/include/asm/pgtable.h index e4ffa565a69f..690c0307afed 100644 --- a/arch/x86/include/asm/pgtable.h +++ b/arch/x86/include/asm/pgtable.h | |||
| @@ -1195,7 +1195,7 @@ static inline pmd_t pmdp_establish(struct vm_area_struct *vma, | |||
| 1195 | return xchg(pmdp, pmd); | 1195 | return xchg(pmdp, pmd); |
| 1196 | } else { | 1196 | } else { |
| 1197 | pmd_t old = *pmdp; | 1197 | pmd_t old = *pmdp; |
| 1198 | *pmdp = pmd; | 1198 | WRITE_ONCE(*pmdp, pmd); |
| 1199 | return old; | 1199 | return old; |
| 1200 | } | 1200 | } |
| 1201 | } | 1201 | } |
diff --git a/arch/x86/include/asm/pgtable_64.h b/arch/x86/include/asm/pgtable_64.h index f773d5e6c8cc..ce2b59047cb8 100644 --- a/arch/x86/include/asm/pgtable_64.h +++ b/arch/x86/include/asm/pgtable_64.h | |||
| @@ -55,15 +55,15 @@ struct mm_struct; | |||
| 55 | void set_pte_vaddr_p4d(p4d_t *p4d_page, unsigned long vaddr, pte_t new_pte); | 55 | void set_pte_vaddr_p4d(p4d_t *p4d_page, unsigned long vaddr, pte_t new_pte); |
| 56 | void set_pte_vaddr_pud(pud_t *pud_page, unsigned long vaddr, pte_t new_pte); | 56 | void set_pte_vaddr_pud(pud_t *pud_page, unsigned long vaddr, pte_t new_pte); |
| 57 | 57 | ||
| 58 | static inline void native_pte_clear(struct mm_struct *mm, unsigned long addr, | 58 | static inline void native_set_pte(pte_t *ptep, pte_t pte) |
| 59 | pte_t *ptep) | ||
| 60 | { | 59 | { |
| 61 | *ptep = native_make_pte(0); | 60 | WRITE_ONCE(*ptep, pte); |
| 62 | } | 61 | } |
| 63 | 62 | ||
| 64 | static inline void native_set_pte(pte_t *ptep, pte_t pte) | 63 | static inline void native_pte_clear(struct mm_struct *mm, unsigned long addr, |
| 64 | pte_t *ptep) | ||
| 65 | { | 65 | { |
| 66 | *ptep = pte; | 66 | native_set_pte(ptep, native_make_pte(0)); |
| 67 | } | 67 | } |
| 68 | 68 | ||
| 69 | static inline void native_set_pte_atomic(pte_t *ptep, pte_t pte) | 69 | static inline void native_set_pte_atomic(pte_t *ptep, pte_t pte) |
| @@ -73,7 +73,7 @@ static inline void native_set_pte_atomic(pte_t *ptep, pte_t pte) | |||
| 73 | 73 | ||
| 74 | static inline void native_set_pmd(pmd_t *pmdp, pmd_t pmd) | 74 | static inline void native_set_pmd(pmd_t *pmdp, pmd_t pmd) |
| 75 | { | 75 | { |
| 76 | *pmdp = pmd; | 76 | WRITE_ONCE(*pmdp, pmd); |
| 77 | } | 77 | } |
| 78 | 78 | ||
| 79 | static inline void native_pmd_clear(pmd_t *pmd) | 79 | static inline void native_pmd_clear(pmd_t *pmd) |
| @@ -109,7 +109,7 @@ static inline pmd_t native_pmdp_get_and_clear(pmd_t *xp) | |||
| 109 | 109 | ||
| 110 | static inline void native_set_pud(pud_t *pudp, pud_t pud) | 110 | static inline void native_set_pud(pud_t *pudp, pud_t pud) |
| 111 | { | 111 | { |
| 112 | *pudp = pud; | 112 | WRITE_ONCE(*pudp, pud); |
| 113 | } | 113 | } |
| 114 | 114 | ||
| 115 | static inline void native_pud_clear(pud_t *pud) | 115 | static inline void native_pud_clear(pud_t *pud) |
| @@ -137,13 +137,13 @@ static inline void native_set_p4d(p4d_t *p4dp, p4d_t p4d) | |||
| 137 | pgd_t pgd; | 137 | pgd_t pgd; |
| 138 | 138 | ||
| 139 | if (pgtable_l5_enabled() || !IS_ENABLED(CONFIG_PAGE_TABLE_ISOLATION)) { | 139 | if (pgtable_l5_enabled() || !IS_ENABLED(CONFIG_PAGE_TABLE_ISOLATION)) { |
| 140 | *p4dp = p4d; | 140 | WRITE_ONCE(*p4dp, p4d); |
| 141 | return; | 141 | return; |
| 142 | } | 142 | } |
| 143 | 143 | ||
| 144 | pgd = native_make_pgd(native_p4d_val(p4d)); | 144 | pgd = native_make_pgd(native_p4d_val(p4d)); |
| 145 | pgd = pti_set_user_pgtbl((pgd_t *)p4dp, pgd); | 145 | pgd = pti_set_user_pgtbl((pgd_t *)p4dp, pgd); |
| 146 | *p4dp = native_make_p4d(native_pgd_val(pgd)); | 146 | WRITE_ONCE(*p4dp, native_make_p4d(native_pgd_val(pgd))); |
| 147 | } | 147 | } |
| 148 | 148 | ||
| 149 | static inline void native_p4d_clear(p4d_t *p4d) | 149 | static inline void native_p4d_clear(p4d_t *p4d) |
| @@ -153,7 +153,7 @@ static inline void native_p4d_clear(p4d_t *p4d) | |||
| 153 | 153 | ||
| 154 | static inline void native_set_pgd(pgd_t *pgdp, pgd_t pgd) | 154 | static inline void native_set_pgd(pgd_t *pgdp, pgd_t pgd) |
| 155 | { | 155 | { |
| 156 | *pgdp = pti_set_user_pgtbl(pgdp, pgd); | 156 | WRITE_ONCE(*pgdp, pti_set_user_pgtbl(pgdp, pgd)); |
| 157 | } | 157 | } |
| 158 | 158 | ||
| 159 | static inline void native_pgd_clear(pgd_t *pgd) | 159 | static inline void native_pgd_clear(pgd_t *pgd) |
diff --git a/arch/x86/mm/pgtable.c b/arch/x86/mm/pgtable.c index e848a4811785..ae394552fb94 100644 --- a/arch/x86/mm/pgtable.c +++ b/arch/x86/mm/pgtable.c | |||
| @@ -269,7 +269,7 @@ static void mop_up_one_pmd(struct mm_struct *mm, pgd_t *pgdp) | |||
| 269 | if (pgd_val(pgd) != 0) { | 269 | if (pgd_val(pgd) != 0) { |
| 270 | pmd_t *pmd = (pmd_t *)pgd_page_vaddr(pgd); | 270 | pmd_t *pmd = (pmd_t *)pgd_page_vaddr(pgd); |
| 271 | 271 | ||
| 272 | *pgdp = native_make_pgd(0); | 272 | pgd_clear(pgdp); |
| 273 | 273 | ||
| 274 | paravirt_release_pmd(pgd_val(pgd) >> PAGE_SHIFT); | 274 | paravirt_release_pmd(pgd_val(pgd) >> PAGE_SHIFT); |
| 275 | pmd_free(mm, pmd); | 275 | pmd_free(mm, pmd); |
| @@ -494,7 +494,7 @@ int ptep_set_access_flags(struct vm_area_struct *vma, | |||
| 494 | int changed = !pte_same(*ptep, entry); | 494 | int changed = !pte_same(*ptep, entry); |
| 495 | 495 | ||
| 496 | if (changed && dirty) | 496 | if (changed && dirty) |
| 497 | *ptep = entry; | 497 | set_pte(ptep, entry); |
| 498 | 498 | ||
| 499 | return changed; | 499 | return changed; |
| 500 | } | 500 | } |
| @@ -509,7 +509,7 @@ int pmdp_set_access_flags(struct vm_area_struct *vma, | |||
| 509 | VM_BUG_ON(address & ~HPAGE_PMD_MASK); | 509 | VM_BUG_ON(address & ~HPAGE_PMD_MASK); |
| 510 | 510 | ||
| 511 | if (changed && dirty) { | 511 | if (changed && dirty) { |
| 512 | *pmdp = entry; | 512 | set_pmd(pmdp, entry); |
| 513 | /* | 513 | /* |
| 514 | * We had a write-protection fault here and changed the pmd | 514 | * We had a write-protection fault here and changed the pmd |
| 515 | * to to more permissive. No need to flush the TLB for that, | 515 | * to to more permissive. No need to flush the TLB for that, |
| @@ -529,7 +529,7 @@ int pudp_set_access_flags(struct vm_area_struct *vma, unsigned long address, | |||
| 529 | VM_BUG_ON(address & ~HPAGE_PUD_MASK); | 529 | VM_BUG_ON(address & ~HPAGE_PUD_MASK); |
| 530 | 530 | ||
| 531 | if (changed && dirty) { | 531 | if (changed && dirty) { |
| 532 | *pudp = entry; | 532 | set_pud(pudp, entry); |
| 533 | /* | 533 | /* |
| 534 | * We had a write-protection fault here and changed the pud | 534 | * We had a write-protection fault here and changed the pud |
| 535 | * to to more permissive. No need to flush the TLB for that, | 535 | * to to more permissive. No need to flush the TLB for that, |
