Commit Graph

2 Commits

Author SHA1 Message Date
Waiman Long 7dd9aa64c3 static_call: Add call depth tracking support
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2190342

commit 7825451fa4dc04660f1f53d236e4302161d0ebd1
Author: Peter Zijlstra <peterz@infradead.org>
Date:   Thu, 15 Sep 2022 13:11:31 +0200

    static_call: Add call depth tracking support

    When indirect calls are switched to direct calls then it has to be ensured
    that the call target is not the function, but the call thunk when call
    depth tracking is enabled. But static calls are available before call
    thunks have been set up.

    Ensure a second run through the static call patching code after call thunks
    have been created. When call thunks are not enabled this has no side
    effects.

    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Link: https://lore.kernel.org/r/20220915111148.306100465@infradead.org

Signed-off-by: Waiman Long <longman@redhat.com>
2023-06-30 20:31:53 -04:00
Waiman Long d676ce57d5 static_call: Don't make __static_call_return0 static
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2190342

commit 8fd4ddda2f49a66bf5dd3d0c01966c4b1971308b
Author: Christophe Leroy <christophe.leroy@csgroup.eu>
Date:   Mon, 14 Mar 2022 12:49:36 +0100

    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: 3f2a8fc4b1 ("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

Signed-off-by: Waiman Long <longman@redhat.com>
2023-06-30 19:59:53 -04:00