lkml.org 
[lkml]   [2021]   [Nov]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.14 407/849] rcu: Always inline rcu_dynticks_task*_{enter,exit}()
    Date
    From: Peter Zijlstra <peterz@infradead.org>

    [ Upstream commit 7663ad9a5dbcc27f3090e6bfd192c7e59222709f ]

    RCU managed to grow a few noinstr violations:

    vmlinux.o: warning: objtool: rcu_dynticks_eqs_enter()+0x0: call to rcu_dynticks_task_trace_enter() leaves .noinstr.text section
    vmlinux.o: warning: objtool: rcu_dynticks_eqs_exit()+0xe: call to rcu_dynticks_task_trace_exit() leaves .noinstr.text section

    Fix them by adding __always_inline to the relevant trivial functions.

    Also replace the noinstr with __always_inline for the existing
    rcu_dynticks_task_*() functions since noinstr would force noinline
    them, even when empty, which seems silly.

    Fixes: 7d0c9c50c5a1 ("rcu-tasks: Avoid IPIing userspace/idle tasks if kernel is so built")
    Reported-by: Stephen Rothwell <sfr@canb.auug.org.au>
    Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    kernel/rcu/tree_plugin.h | 8 ++++----
    1 file changed, 4 insertions(+), 4 deletions(-)

    diff --git a/kernel/rcu/tree_plugin.h b/kernel/rcu/tree_plugin.h
    index 6ce104242b23d..591e038e7670d 100644
    --- a/kernel/rcu/tree_plugin.h
    +++ b/kernel/rcu/tree_plugin.h
    @@ -2964,7 +2964,7 @@ static void rcu_bind_gp_kthread(void)
    }

    /* Record the current task on dyntick-idle entry. */
    -static void noinstr rcu_dynticks_task_enter(void)
    +static __always_inline void rcu_dynticks_task_enter(void)
    {
    #if defined(CONFIG_TASKS_RCU) && defined(CONFIG_NO_HZ_FULL)
    WRITE_ONCE(current->rcu_tasks_idle_cpu, smp_processor_id());
    @@ -2972,7 +2972,7 @@ static void noinstr rcu_dynticks_task_enter(void)
    }

    /* Record no current task on dyntick-idle exit. */
    -static void noinstr rcu_dynticks_task_exit(void)
    +static __always_inline void rcu_dynticks_task_exit(void)
    {
    #if defined(CONFIG_TASKS_RCU) && defined(CONFIG_NO_HZ_FULL)
    WRITE_ONCE(current->rcu_tasks_idle_cpu, -1);
    @@ -2980,7 +2980,7 @@ static void noinstr rcu_dynticks_task_exit(void)
    }

    /* Turn on heavyweight RCU tasks trace readers on idle/user entry. */
    -static void rcu_dynticks_task_trace_enter(void)
    +static __always_inline void rcu_dynticks_task_trace_enter(void)
    {
    #ifdef CONFIG_TASKS_TRACE_RCU
    if (IS_ENABLED(CONFIG_TASKS_TRACE_RCU_READ_MB))
    @@ -2989,7 +2989,7 @@ static void rcu_dynticks_task_trace_enter(void)
    }

    /* Turn off heavyweight RCU tasks trace readers on idle/user exit. */
    -static void rcu_dynticks_task_trace_exit(void)
    +static __always_inline void rcu_dynticks_task_trace_exit(void)
    {
    #ifdef CONFIG_TASKS_TRACE_RCU
    if (IS_ENABLED(CONFIG_TASKS_TRACE_RCU_READ_MB))
    --
    2.33.0


    \
     
     \ /
      Last update: 2021-11-15 23:57    [W:4.052 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site