ARC: Improve cmpxchg syscall implementation
authorPeter Zijlstra <peterz@infradead.org>
Tue, 19 Jun 2018 14:22:05 +0000 (17:22 +0300)
committerVineet Gupta <vgupta@synopsys.com>
Mon, 9 Jul 2018 18:22:05 +0000 (11:22 -0700)
commite8708786d4fe21c043d38d760f768949a3d71185
treed918e94ec1ee952d87d5948f4256d20103d19864
parentec58ba16e174d7ca24c8955a21cd0a53e0c32fdf
ARC: Improve cmpxchg syscall implementation

This is used in configs lacking hardware atomics to emulate atomic r-m-w
for user space, implemented by disabling preemption in kernel.

However there are issues in current implementation:

1. Process not terminated if invalid user pointer passed:
   i.e. __get_user() failed.

2. The reason for this patch was __put_user() failure not being handled
   either, specifically for the COW break scenario.
   The zero page is initially wired up and read from __get_user()
   succeeds. A subsequent write by __put_user() induces a
   Protection Violation, but COW can't finish as Linux page fault
   handler is disabled due to preempt disable.
   And what's worse is we silently return the stale value to user space.
   Fix this specific case by re-enabling preemption and explicitly
   fixing up the fault and retrying the whole sequence over.

Cc: Max Filippov <jcmvbkbc@gmail.com>
Cc: linux-arch@vger.kernel.org
Signed-off-by: Alexey Brodkin <abrodkin@synopsys.com>
Signed-off-by: Peter Zijlstra <peterz@infradead.org>
Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
[vgupta: rewrote the changelog]
arch/arc/kernel/process.c