• Thomas Gleixner's avatar
    ARM: futex: Address build warning · 8101b5a1
    Thomas Gleixner authored
    Stephen reported the following build warning on a ARM multi_v7_defconfig
    build with GCC 9.2.1:
    
    kernel/futex.c: In function 'do_futex':
    kernel/futex.c:1676:17: warning: 'oldval' may be used uninitialized in this function [-Wmaybe-uninitialized]
     1676 |   return oldval == cmparg;
          |          ~~~~~~~^~~~~~~~~
    kernel/futex.c:1652:6: note: 'oldval' was declared here
     1652 |  int oldval, ret;
          |      ^~~~~~
    
    introduced by commit a08971e9 ("futex: arch_futex_atomic_op_inuser()
    calling conventions change").
    
    While that change should not make any difference it confuses GCC which
    fails to work out that oldval is not referenced when the return value is
    not zero.
    
    GCC fails to properly analyze arch_futex_atomic_op_inuser(). It's not the
    early return, the issue is with the assembly macros. GCC fails to detect
    that those either set 'ret' to 0 and set oldval or set 'ret' to -EFAULT
    which makes oldval uninteresting. The store to the callsite supplied oldval
    pointer is conditional on ret == 0.
    
    The straight forward way to solve this is to make the store unconditional.
    
    Aside of addressing the build warning this makes sense anyway because it
    removes the conditional from the fastpath. In the error case the stored
    value is uninteresting and the extra store does not matter at all.
    Reported-by: default avatarStephen Rothwell <sfr@canb.auug.org.au>
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Link: https://lkml.kernel.org/r/87pncao2ph.fsf@nanos.tec.linutronix.de
    8101b5a1
futex.h 4.25 KB