| From 8108bddbb7e3a1917fbb11699010809409c2a858 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Sun, 16 May 2021 00:45:11 +0800 |
| Subject: rcu: Fix to include first blocked task in stall warning |
| |
| From: Yanfei Xu <yanfei.xu@windriver.com> |
| |
| [ Upstream commit e6a901a44f76878ed1653626c9ff4cfc5a3f58f8 ] |
| |
| The for loop in rcu_print_task_stall() always omits ts[0], which points |
| to the first task blocking the stalled grace period. This in turn fails |
| to count this first task, which means that ndetected will be equal to |
| zero when all CPUs have passed through their quiescent states and only |
| one task is blocking the stalled grace period. This zero value for |
| ndetected will in turn result in an incorrect "All QSes seen" message: |
| |
| rcu: INFO: rcu_preempt detected stalls on CPUs/tasks: |
| rcu: Tasks blocked on level-1 rcu_node (CPUs 12-23): |
| (detected by 15, t=6504 jiffies, g=164777, q=9011209) |
| rcu: All QSes seen, last rcu_preempt kthread activity 1 (4295252379-4295252378), jiffies_till_next_fqs=1, root ->qsmask 0x2 |
| BUG: sleeping function called from invalid context at include/linux/uaccess.h:156 |
| in_atomic(): 1, irqs_disabled(): 0, non_block: 0, pid: 70613, name: msgstress04 |
| INFO: lockdep is turned off. |
| Preemption disabled at: |
| [<ffff8000104031a4>] create_object.isra.0+0x204/0x4b0 |
| CPU: 15 PID: 70613 Comm: msgstress04 Kdump: loaded Not tainted |
| 5.12.2-yoctodev-standard #1 |
| Hardware name: Marvell OcteonTX CN96XX board (DT) |
| Call trace: |
| dump_backtrace+0x0/0x2cc |
| show_stack+0x24/0x30 |
| dump_stack+0x110/0x188 |
| ___might_sleep+0x214/0x2d0 |
| __might_sleep+0x7c/0xe0 |
| |
| This commit therefore fixes the loop to include ts[0]. |
| |
| Fixes: c583bcb8f5ed ("rcu: Don't invoke try_invoke_on_locked_down_task() with irqs disabled") |
| Tested-by: Qais Yousef <qais.yousef@arm.com> |
| Signed-off-by: Yanfei Xu <yanfei.xu@windriver.com> |
| Signed-off-by: Paul E. McKenney <paulmck@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| kernel/rcu/tree_stall.h | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| diff --git a/kernel/rcu/tree_stall.h b/kernel/rcu/tree_stall.h |
| index 4aaa4a12e95f..f1e011d4a899 100644 |
| --- a/kernel/rcu/tree_stall.h |
| +++ b/kernel/rcu/tree_stall.h |
| @@ -282,8 +282,8 @@ static int rcu_print_task_stall(struct rcu_node *rnp, unsigned long flags) |
| break; |
| } |
| raw_spin_unlock_irqrestore_rcu_node(rnp, flags); |
| - for (i--; i; i--) { |
| - t = ts[i]; |
| + while (i) { |
| + t = ts[--i]; |
| if (!try_invoke_on_locked_down_task(t, check_slow_task, &rscr)) |
| pr_cont(" P%d", t->pid); |
| else |
| -- |
| 2.30.2 |
| |