• Paul Burton's avatar
    MIPS: Fix MSA ld unaligned failure cases · fa8ff601
    Paul Burton authored
    Copying the content of an MSA vector from user memory may involve TLB
    faults & mapping in pages. This will fail when preemption is disabled
    due to an inability to acquire mmap_sem from do_page_fault, which meant
    such vector loads to unmapped pages would always fail to be emulated.
    Fix this by disabling preemption later only around the updating of
    vector register state.
    
    This change does however introduce a race between performing the load
    into thread context & the thread being preempted, saving its current
    live context & clobbering the loaded value. This should be a rare
    occureence, so optimise for the fast path by simply repeating the load if
    we are preempted.
    
    Additionally if the copy failed then the failure path was taken with
    preemption left disabled, leading to the kernel typically encountering
    further issues around sleeping whilst atomic. The change to where
    preemption is disabled avoids this issue.
    
    Fixes: e4aa1f15 "MIPS: MSA unaligned memory access support"
    Reported-by: default avatarJames Hogan <james.hogan@imgtec.com>
    Signed-off-by: default avatarPaul Burton <paul.burton@imgtec.com>
    Reviewed-by: default avatarJames Hogan <james.hogan@imgtec.com>
    Cc: Leonid Yegoshin <Leonid.Yegoshin@imgtec.com>
    Cc: Maciej W. Rozycki <macro@linux-mips.org>
    Cc: James Cowgill <James.Cowgill@imgtec.com>
    Cc: Markos Chandras <markos.chandras@imgtec.com>
    Cc: stable <stable@vger.kernel.org> # v4.3
    Cc: linux-mips@linux-mips.org
    Cc: linux-kernel@vger.kernel.org
    Patchwork: https://patchwork.linux-mips.org/patch/12345/Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
    fa8ff601
unaligned.c 59.7 KB