Skip to content

Commit e7fe7b5

Browse files
djbwtorvalds
authored andcommitted
mm: replace pud_write with pud_access_permitted in fault + gup paths
The 'access_permitted' helper is used in the gup-fast path and goes beyond the simple _PAGE_RW check to also: - validate that the mapping is writable from a protection keys standpoint - validate that the pte has _PAGE_USER set since all fault paths where pud_write is must be referencing user-memory. [[email protected]: fix powerpc compile error] Link: http://lkml.kernel.org/r/151129127237.37405.16073414520854722485.stgit@dwillia2-desk3.amr.corp.intel.com Link: http://lkml.kernel.org/r/151043110453.2842.2166049702068628177.stgit@dwillia2-desk3.amr.corp.intel.com Signed-off-by: Dan Williams <[email protected]> Cc: Dave Hansen <[email protected]> Cc: "David S. Miller" <[email protected]> Cc: Kirill A. Shutemov <[email protected]> Cc: Martin Schwidefsky <[email protected]> Cc: Heiko Carstens <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
1 parent e4e40e0 commit e7fe7b5

File tree

4 files changed

+9
-3
lines changed

4 files changed

+9
-3
lines changed

arch/s390/include/asm/pgtable.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1264,6 +1264,12 @@ static inline pud_t pud_mkwrite(pud_t pud)
12641264
return pud;
12651265
}
12661266

1267+
#define pud_write pud_write
1268+
static inline int pud_write(pud_t pud)
1269+
{
1270+
return (pud_val(pud) & _REGION3_ENTRY_WRITE) != 0;
1271+
}
1272+
12671273
static inline pud_t pud_mkclean(pud_t pud)
12681274
{
12691275
if (pud_large(pud)) {

arch/sparc/mm/gup.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ static int gup_huge_pud(pud_t *pudp, pud_t pud, unsigned long addr,
114114
if (!(pud_val(pud) & _PAGE_VALID))
115115
return 0;
116116

117-
if (write && !pud_write(pud))
117+
if (!pud_access_permitted(pud, write))
118118
return 0;
119119

120120
refs = 0;

mm/huge_memory.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1019,7 +1019,7 @@ struct page *follow_devmap_pud(struct vm_area_struct *vma, unsigned long addr,
10191019

10201020
assert_spin_locked(pud_lockptr(mm, pud));
10211021

1022-
if (flags & FOLL_WRITE && !pud_write(*pud))
1022+
if (!pud_access_permitted(*pud, flags & FOLL_WRITE))
10231023
return NULL;
10241024

10251025
if (pud_present(*pud) && pud_devmap(*pud))

mm/memory.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4013,7 +4013,7 @@ static int __handle_mm_fault(struct vm_area_struct *vma, unsigned long address,
40134013

40144014
/* NUMA case for anonymous PUDs would go here */
40154015

4016-
if (dirty && !pud_write(orig_pud)) {
4016+
if (dirty && !pud_access_permitted(orig_pud, WRITE)) {
40174017
ret = wp_huge_pud(&vmf, orig_pud);
40184018
if (!(ret & VM_FAULT_FALLBACK))
40194019
return ret;

0 commit comments

Comments
 (0)