]> git.baikalelectronics.ru Git - kernel.git/commit
MIPS: Fix MSA ld unaligned failure cases
authorPaul Burton <paul.burton@imgtec.com>
Wed, 3 Feb 2016 03:35:49 +0000 (03:35 +0000)
committerRalf Baechle <ralf@linux-mips.org>
Tue, 29 Mar 2016 12:18:18 +0000 (14:18 +0200)
commit32a7b567bdadba9f23a39a269dc0f4aea8c6b90c
tree74653d535d164057871ab6a72bbfc44df842cde3
parent0dda54d7c9222ce28f1e235c5af9260e520f9de7
MIPS: Fix MSA ld unaligned failure cases

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: 519c9d7a8f6c "MIPS: MSA unaligned memory access support"
Reported-by: James Hogan <james.hogan@imgtec.com>
Signed-off-by: Paul Burton <paul.burton@imgtec.com>
Reviewed-by: James 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: Ralf Baechle <ralf@linux-mips.org>
arch/mips/kernel/unaligned.c