• Luc Van Oostenryck's avatar
    percpu: fix __percpu annotation in asm-generic · becef184
    Luc Van Oostenryck authored
    The generic implementation of raw_cpu_generic_add_return() is:
    
            #define raw_cpu_generic_add_return(pcp, val)            \
            ({                                                      \
                    typeof(&(pcp)) __p = raw_cpu_ptr(&(pcp));       \
                                                                    \
                    *__p += val;                                    \
                    *__p;                                           \
            })
    
    where the 'pcp' argument is a __percpu lvalue.
    There, the variable '__p' is declared as a __percpu pointer
    the type of the address of 'pcp') but:
    1) the value assigned to it, the return value of raw_cpu_ptr(), is
       a plain (__kernel) pointer, not a __percpu one.
    2) this variable is dereferenced just after while a __percpu
       pointer is implicitly __noderef.
    
    So, fix the declaration of the 'pcp' variable to its correct type:
    the plain (non-percpu) pointer corresponding to pcp's address,
    using the fact that typeof() ignores the address space and the
    'noderef' attribute of its agument.
    
    Same for raw_cpu_generic_xchg(), raw_cpu_generic_cmpxchg() &
    raw_cpu_generic_cmpxchg_double().
    
    This removes 209 warnings on ARM, 525 on ARM64, 220 on x86 &
    more than 2600 on ppc64 (all of them with the default config).
    
    Cc: Tejun Heo <tj@kernel.org>
    Cc: Nicholas Piggin <npiggin@gmail.com>
    Reported-by: default avatarBen Dooks <ben.dooks@codethink.co.uk>
    Signed-off-by: default avatarLuc Van Oostenryck <luc.vanoostenryck@gmail.com>
    Acked-by: default avatarChristoph Lameter <cl@linux.com>
    Signed-off-by: default avatarDennis Zhou <dennis@kernel.org>
    becef184
percpu.h 12.6 KB