Commit e7884f8e authored by Kirill A. Shutemov's avatar Kirill A. Shutemov Committed by Ingo Molnar
Browse files

mm/gup: Move permission checks into helpers

This is a preparation patch for the transition of x86 to the generic GUP_fast()

On x86, we would need to do additional permission checks to determine if
access is allowed.

Let's abstract it out into separate helpers.
Signed-off-by: default avatarKirill A. Shutemov <>
Cc: Andrew Morton <>
Cc: Aneesh Kumar K . V <>
Cc: Borislav Petkov <>
Cc: Catalin Marinas <>
Cc: Dann Frazier <>
Cc: Dave Hansen <>
Cc: H. Peter Anvin <>
Cc: Linus Torvalds <>
Cc: Peter Zijlstra <>
Cc: Rik van Riel <>
Cc: Steve Capper <>
Cc: Thomas Gleixner <>

Signed-off-by: default avatarIngo Molnar <>
parent 9a804fec
......@@ -341,6 +341,31 @@ static inline int pte_unused(pte_t pte)
#ifndef pte_access_permitted
#define pte_access_permitted(pte, write) \
(pte_present(pte) && (!(write) || pte_write(pte)))
#ifndef pmd_access_permitted
#define pmd_access_permitted(pmd, write) \
(pmd_present(pmd) && (!(write) || pmd_write(pmd)))
#ifndef pud_access_permitted
#define pud_access_permitted(pud, write) \
(pud_present(pud) && (!(write) || pud_write(pud)))
#ifndef p4d_access_permitted
#define p4d_access_permitted(p4d, write) \
(p4d_present(p4d) && (!(write) || p4d_write(p4d)))
#ifndef pgd_access_permitted
#define pgd_access_permitted(pgd, write) \
(pgd_present(pgd) && (!(write) || pgd_write(pgd)))
static inline int pmd_same(pmd_t pmd_a, pmd_t pmd_b)
......@@ -1212,8 +1212,13 @@ static int gup_pte_range(pmd_t pmd, unsigned long addr, unsigned long end,
* Similar to the PMD case below, NUMA hinting must take slow
* path using the pte_protnone check.
if (!pte_present(pte) || pte_special(pte) ||
pte_protnone(pte) || (write && !pte_write(pte)))
if (pte_protnone(pte))
goto pte_unmap;
if (!pte_access_permitted(pte, write))
goto pte_unmap;
if (pte_special(pte))
goto pte_unmap;
......@@ -1264,7 +1269,7 @@ static int gup_huge_pmd(pmd_t orig, pmd_t *pmdp, unsigned long addr,
struct page *head, *page;
int refs;
if (write && !pmd_write(orig))
if (!pmd_access_permitted(orig, write))
return 0;
refs = 0;
......@@ -1299,7 +1304,7 @@ static int gup_huge_pud(pud_t orig, pud_t *pudp, unsigned long addr,
struct page *head, *page;
int refs;
if (write && !pud_write(orig))
if (!pud_access_permitted(orig, write))
return 0;
refs = 0;
......@@ -1335,7 +1340,7 @@ static int gup_huge_pgd(pgd_t orig, pgd_t *pgdp, unsigned long addr,
int refs;
struct page *head, *page;
if (write && !pgd_write(orig))
if (!pgd_access_permitted(orig, write))
return 0;
refs = 0;
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment