lkml.org 
[lkml]   [2021]   [Feb]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.10 24/56] sched/core: Allow try_invoke_on_locked_down_task() with irqs disabled
    Date
    From: Peter Zijlstra <peterz@infradead.org>

    [ Upstream commit 1b7af295541d75535374325fd617944534853919 ]

    The try_invoke_on_locked_down_task() function currently requires
    that interrupts be enabled, but it is called with interrupts
    disabled from rcu_print_task_stall(), resulting in an "IRQs not
    enabled as expected" diagnostic. This commit therefore updates
    try_invoke_on_locked_down_task() to use raw_spin_lock_irqsave() instead
    of raw_spin_lock_irq(), thus allowing use from either context.

    Link: https://lore.kernel.org/lkml/000000000000903d5805ab908fc4@google.com/
    Link: https://lore.kernel.org/lkml/20200928075729.GC2611@hirez.programming.kicks-ass.net/
    Reported-by: syzbot+cb3b69ae80afd6535b0e@syzkaller.appspotmail.com
    Signed-off-by: Peter Zijlstra <peterz@infradead.org>
    Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    kernel/sched/core.c | 9 ++++-----
    1 file changed, 4 insertions(+), 5 deletions(-)

    diff --git a/kernel/sched/core.c b/kernel/sched/core.c
    index 77aa0e788b9b7..269165bf440af 100644
    --- a/kernel/sched/core.c
    +++ b/kernel/sched/core.c
    @@ -2989,7 +2989,7 @@ try_to_wake_up(struct task_struct *p, unsigned int state, int wake_flags)

    /**
    * try_invoke_on_locked_down_task - Invoke a function on task in fixed state
    - * @p: Process for which the function is to be invoked.
    + * @p: Process for which the function is to be invoked, can be @current.
    * @func: Function to invoke.
    * @arg: Argument to function.
    *
    @@ -3007,12 +3007,11 @@ try_to_wake_up(struct task_struct *p, unsigned int state, int wake_flags)
    */
    bool try_invoke_on_locked_down_task(struct task_struct *p, bool (*func)(struct task_struct *t, void *arg), void *arg)
    {
    - bool ret = false;
    struct rq_flags rf;
    + bool ret = false;
    struct rq *rq;

    - lockdep_assert_irqs_enabled();
    - raw_spin_lock_irq(&p->pi_lock);
    + raw_spin_lock_irqsave(&p->pi_lock, rf.flags);
    if (p->on_rq) {
    rq = __task_rq_lock(p, &rf);
    if (task_rq(p) == rq)
    @@ -3029,7 +3028,7 @@ bool try_invoke_on_locked_down_task(struct task_struct *p, bool (*func)(struct t
    ret = func(p, arg);
    }
    }
    - raw_spin_unlock_irq(&p->pi_lock);
    + raw_spin_unlock_irqrestore(&p->pi_lock, rf.flags);
    return ret;
    }

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