• Michael Ellerman's avatar
    powerpc/64: Fix atomic64_inc_not_zero() to return an int · f9b66deb
    Michael Ellerman authored
    [ Upstream commit 01e6a61a ]
    
    Although it's not documented anywhere, there is an expectation that
    atomic64_inc_not_zero() returns a result which fits in an int. This is
    the behaviour implemented on all arches except powerpc.
    
    This has caused at least one bug in practice, in the percpu-refcount
    code, where the long result from our atomic64_inc_not_zero() was
    truncated to an int leading to lost references and stuck systems. That
    was worked around in that code in commit 966d2b04 ("percpu-refcount:
    fix reference leak during percpu-atomic transition").
    
    To the best of my grepping abilities there are no other callers
    in-tree which truncate the value, but we should fix it anyway. Because
    the breakage is subtle and potentially very harmful I'm also tagging
    it for stable.
    
    Code generation is largely unaffected because in most cases the
    callers are just using the result for a test anyway. In particular the
    case of fget() that was mentioned in commit a6cf7ed5
    ("powerpc/atomic: Implement atomic*_inc_not_zero") generates exactly
    the same code.
    
    Fixes: a6cf7ed5 ("powerpc/atomic: Implement atomic*_inc_not_zero")
    Cc: stable@vger.kernel.org # v3.4
    Noticed-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    Signed-off-by: default avatarSasha Levin <alexander.levin@verizon.com>
    f9b66deb
atomic.h 10.1 KB