static_call: Don't make __static_call_return0 static
authorChristophe Leroy <christophe.leroy@csgroup.eu>
Mon, 14 Mar 2022 11:49:36 +0000 (12:49 +0100)
committerPeter Zijlstra <peterz@infradead.org>
Tue, 5 Apr 2022 07:59:38 +0000 (09:59 +0200)
commit8fd4ddda2f49a66bf5dd3d0c01966c4b1971308b
treeed31904efc09c25722b30768f54e11c026dad4bd
parent1cd5f059d956e6f614ba6666ecdbcf95db05d5f5
static_call: Don't make __static_call_return0 static

System.map shows that vmlinux contains several instances of
__static_call_return0():

c0004fc0 t __static_call_return0
c0011518 t __static_call_return0
c00d8160 t __static_call_return0

arch_static_call_transform() uses the middle one to check whether we are
setting a call to __static_call_return0 or not:

c0011520 <arch_static_call_transform>:
c0011520:       3d 20 c0 01     lis     r9,-16383 <== r9 =  0xc001 << 16
c0011524:       39 29 15 18     addi    r9,r9,5400 <== r9 += 0x1518
c0011528:       7c 05 48 00     cmpw    r5,r9 <== r9 has value 0xc0011518 here

So if static_call_update() is called with one of the other instances of
__static_call_return0(), arch_static_call_transform() won't recognise it.

In order to work properly, global single instance of __static_call_return0() is required.

Fixes: 3f2a8fc4b15d ("static_call/x86: Add __static_call_return0()")
Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Acked-by: Josh Poimboeuf <jpoimboe@redhat.com>
Link: https://lkml.kernel.org/r/30821468a0e7d28251954b578e5051dc09300d04.1647258493.git.christophe.leroy@csgroup.eu
include/linux/static_call.h
kernel/Makefile
kernel/static_call.c
kernel/static_call_inline.c [new file with mode: 0644]