lkml.org 
[lkml]   [2019]   [Feb]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH RT 3/2] softirq: Avoid "local_softirq_pending" messages if task is in cpu_chill()
    If the softirq thread enters cpu_chill() then ->state is UNINTERRUPTIBLE
    and has no ->pi_blocked_on set and so its mask is not taken into account.

    ->sleeping_lock is increased by cpu_chill() since it is also requried to
    avoid a splat by RCU in case cpu_chill() is used while a RCU-read lock
    is held. Use the same mechanism for the softirq-pending check.

    Cc: stable-rt@vger.kernel.org
    Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
    ---
    kernel/softirq.c | 5 ++++-
    1 file changed, 4 insertions(+), 1 deletion(-)

    diff --git a/kernel/softirq.c b/kernel/softirq.c
    index 48ae7dae81b9c..25bcf2f2714ba 100644
    --- a/kernel/softirq.c
    +++ b/kernel/softirq.c
    @@ -105,9 +105,12 @@ static bool softirq_check_runner_tsk(struct task_struct *tsk,
    * _before_ it sets pi_blocked_on to NULL under
    * tsk->pi_lock. So we need to check for both: state
    * and pi_blocked_on.
    + * The test against UNINTERRUPTIBLE + ->sleeping_lock is in case the
    + * task does cpu_chill().
    */
    raw_spin_lock(&tsk->pi_lock);
    - if (tsk->pi_blocked_on || tsk->state == TASK_RUNNING) {
    + if (tsk->pi_blocked_on || tsk->state == TASK_RUNNING ||
    + (tsk->state == TASK_UNINTERRUPTIBLE && tsk->sleeping_lock)) {
    /* Clear all bits pending in that task */
    *pending &= ~(tsk->softirqs_raised);
    ret = true;
    --
    2.20.1
    \
     
     \ /
      Last update: 2019-02-19 17:08    [W:2.323 / U:0.144 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site