• Peter Zijlstra's avatar
    ARC: Improve cmpxchg syscall implementation · e8708786
    Peter Zijlstra authored
    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: default avatarAlexey Brodkin <abrodkin@synopsys.com>
    Signed-off-by: default avatarPeter Zijlstra <peterz@infradead.org>
    Signed-off-by: default avatarVineet Gupta <vgupta@synopsys.com>
    [vgupta: rewrote the changelog]
    e8708786
process.c 7.15 KB