forked from Minki/linux
b01e8dc343
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>
19 lines
488 B
C
19 lines
488 B
C
#ifndef __ALPHA_PERCPU_H
|
|
#define __ALPHA_PERCPU_H
|
|
|
|
/*
|
|
* To calculate addresses of locally defined variables, GCC uses
|
|
* 32-bit displacement from the GP. Which doesn't work for per cpu
|
|
* variables in modules, as an offset to the kernel per cpu area is
|
|
* way above 4G.
|
|
*
|
|
* Always use weak definitions for percpu variables in modules.
|
|
*/
|
|
#if defined(MODULE) && defined(CONFIG_SMP)
|
|
#define ARCH_NEEDS_WEAK_PER_CPU
|
|
#endif
|
|
|
|
#include <asm-generic/percpu.h>
|
|
|
|
#endif /* __ALPHA_PERCPU_H */
|