Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

alpha: fix percpu build breakage

alpha percpu access requires custom SHIFT_PERCPU_PTR() definition for
modules to work around addressing range limitation. This is done via
generating inline assembly using C preprocessing which forces the
assembler to generate external reference. This happens behind the
compiler's back and makes the compiler think that static percpu variables
in modules are unused.

This used to be worked around by using __unused attribute for percpu
variables which prevent the compiler from omitting the variable; however,
recent declare/definition attribute unification change broke this as
__used can't be used for declaration. Also, in the process,
PER_CPU_ATTRIBUTES definition in alpha percpu.h got broken.

This patch adds PER_CPU_DEF_ATTRIBUTES which is only used for definitions
and make alpha use it to add __used for percpu variables in modules. This
also fixes the PER_CPU_ATTRIBUTES double definition bug.

Signed-off-by: Tejun Heo <tj@kernel.org>
Tested-by: maximilian attems <max@stro.at>
Acked-by: Ivan Kokshaysky <ink@jurassic.park.msu.ru>
Cc: Richard Henderson <rth@twiddle.net>
Cc: <stable@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

Tejun Heo and committed by
Linus Torvalds
b01e8dc3 15e32524

+9 -4
+3 -3
arch/alpha/include/asm/percpu.h
··· 30 30 31 31 #ifndef MODULE 32 32 #define SHIFT_PERCPU_PTR(var, offset) RELOC_HIDE(&per_cpu_var(var), (offset)) 33 - #define PER_CPU_ATTRIBUTES 33 + #define PER_CPU_DEF_ATTRIBUTES 34 34 #else 35 35 /* 36 36 * To calculate addresses of locally defined variables, GCC uses 32-bit ··· 49 49 : "=&r"(__ptr), "=&r"(tmp_gp)); \ 50 50 (typeof(&per_cpu_var(var)))(__ptr + (offset)); }) 51 51 52 - #define PER_CPU_ATTRIBUTES __used 52 + #define PER_CPU_DEF_ATTRIBUTES __used 53 53 54 54 #endif /* MODULE */ 55 55 ··· 71 71 #define __get_cpu_var(var) per_cpu_var(var) 72 72 #define __raw_get_cpu_var(var) per_cpu_var(var) 73 73 74 - #define PER_CPU_ATTRIBUTES 74 + #define PER_CPU_DEF_ATTRIBUTES 75 75 76 76 #endif /* SMP */ 77 77
+4
include/asm-generic/percpu.h
··· 97 97 #define PER_CPU_ATTRIBUTES 98 98 #endif 99 99 100 + #ifndef PER_CPU_DEF_ATTRIBUTES 101 + #define PER_CPU_DEF_ATTRIBUTES 102 + #endif 103 + 100 104 #endif /* _ASM_GENERIC_PERCPU_H_ */
+2 -1
include/linux/percpu-defs.h
··· 24 24 25 25 #define DEFINE_PER_CPU_SECTION(type, name, section) \ 26 26 __attribute__((__section__(PER_CPU_BASE_SECTION section))) \ 27 - PER_CPU_ATTRIBUTES __typeof__(type) per_cpu__##name 27 + PER_CPU_ATTRIBUTES PER_CPU_DEF_ATTRIBUTES \ 28 + __typeof__(type) per_cpu__##name 28 29 29 30 /* 30 31 * Variant on the per-CPU variable declaration/definition theme used for