lkml.org 
[lkml]   [2022]   [Sep]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.4 50/77] s390/mm: do not trigger write fault when vma does not allow VM_WRITE
    Date
    From: Gerald Schaefer <gerald.schaefer@linux.ibm.com>

    commit 41ac42f137080bc230b5882e3c88c392ab7f2d32 upstream.

    For non-protection pXd_none() page faults in do_dat_exception(), we
    call do_exception() with access == (VM_READ | VM_WRITE | VM_EXEC).
    In do_exception(), vma->vm_flags is checked against that before
    calling handle_mm_fault().

    Since commit 92f842eac7ee3 ("[S390] store indication fault optimization"),
    we call handle_mm_fault() with FAULT_FLAG_WRITE, when recognizing that
    it was a write access. However, the vma flags check is still only
    checking against (VM_READ | VM_WRITE | VM_EXEC), and therefore also
    calling handle_mm_fault() with FAULT_FLAG_WRITE in cases where the vma
    does not allow VM_WRITE.

    Fix this by changing access check in do_exception() to VM_WRITE only,
    when recognizing write access.

    Link: https://lkml.kernel.org/r/20220811103435.188481-3-david@redhat.com
    Fixes: 92f842eac7ee3 ("[S390] store indication fault optimization")
    Cc: <stable@vger.kernel.org>
    Reported-by: David Hildenbrand <david@redhat.com>
    Reviewed-by: Heiko Carstens <hca@linux.ibm.com>
    Signed-off-by: Gerald Schaefer <gerald.schaefer@linux.ibm.com>
    Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
    Signed-off-by: Gerald Schaefer <gerald.schaefer@linux.ibm.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    arch/s390/mm/fault.c | 4 +++-
    1 file changed, 3 insertions(+), 1 deletion(-)

    --- a/arch/s390/mm/fault.c
    +++ b/arch/s390/mm/fault.c
    @@ -432,7 +432,9 @@ static inline vm_fault_t do_exception(st
    flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
    if (user_mode(regs))
    flags |= FAULT_FLAG_USER;
    - if (access == VM_WRITE || (trans_exc_code & store_indication) == 0x400)
    + if ((trans_exc_code & store_indication) == 0x400)
    + access = VM_WRITE;
    + if (access == VM_WRITE)
    flags |= FAULT_FLAG_WRITE;
    down_read(&mm->mmap_sem);


    \
     
     \ /
      Last update: 2022-09-02 14:40    [W:4.073 / U:1.360 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site