lkml.org 
[lkml]   [2016]   [Jan]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Subject[PATCH 15/31] mm: factor out VMA fault permission checking
    From
    Date

    From: Dave Hansen <dave.hansen@linux.intel.com>

    This code matches a fault condition up with the VMA and ensures
    that the VMA allows the fault to be handled instead of just
    erroring out.

    We will be extending this in a moment to comprehend protection
    keys.

    Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com>
    Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
    ---

    b/mm/gup.c | 16 +++++++++++++---
    1 file changed, 13 insertions(+), 3 deletions(-)

    diff -puN mm/gup.c~pkeys-10-pte-fault mm/gup.c
    --- a/mm/gup.c~pkeys-10-pte-fault 2016-01-28 15:52:22.856518359 -0800
    +++ b/mm/gup.c 2016-01-28 15:52:22.860518543 -0800
    @@ -611,6 +611,18 @@ next_page:
    }
    EXPORT_SYMBOL(__get_user_pages);

    +bool vma_permits_fault(struct vm_area_struct *vma, unsigned int fault_flags)
    +{
    + vm_flags_t vm_flags;
    +
    + vm_flags = (fault_flags & FAULT_FLAG_WRITE) ? VM_WRITE : VM_READ;
    +
    + if (!(vm_flags & vma->vm_flags))
    + return false;
    +
    + return true;
    +}
    +
    /*
    * fixup_user_fault() - manually resolve a user page fault
    * @tsk: the task_struct to use for page fault accounting, or
    @@ -646,7 +658,6 @@ int fixup_user_fault(struct task_struct
    bool *unlocked)
    {
    struct vm_area_struct *vma;
    - vm_flags_t vm_flags;
    int ret, major = 0;

    if (unlocked)
    @@ -657,8 +668,7 @@ retry:
    if (!vma || address < vma->vm_start)
    return -EFAULT;

    - vm_flags = (fault_flags & FAULT_FLAG_WRITE) ? VM_WRITE : VM_READ;
    - if (!(vm_flags & vma->vm_flags))
    + if (!vma_permits_fault(vma, fault_flags))
    return -EFAULT;

    ret = handle_mm_fault(mm, vma, address, fault_flags);
    _
    \
     
     \ /
      Last update: 2016-01-29 19:41    [W:4.640 / U:0.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site