rcu: Add GP-kthread-starvation checks to CPU stall warnings

This commit adds a message that is printed if the relevant grace-period
kthread has not been able to run for the two seconds preceding the
stall warning.  (The two seconds is double the maximum interval between
successive bouts of quiescent-state forcing.)

Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Git-repo: git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
Git-commit: fb81a44b88e6173ed0f6e9d6a1afa5305fb63f6e
[pdaly@codeaurora.org resolve trivial conflicts]
Change-Id: I6861d0e4be1e9c83ce4fd17ec94ef047db38861a
Signed-off-by: Patrick Daly <pdaly@codeaurora.org>
This commit is contained in:
Paul E. McKenney 2014-12-17 08:35:02 -08:00 committed by Patrick Daly
parent 9f269d5020
commit 85bad57169
2 changed files with 29 additions and 1 deletions

View File

@ -139,6 +139,15 @@ no non-lazy callbacks ("." is printed otherwise, as shown above) and
"D" indicates that dyntick-idle processing is enabled ("." is printed
otherwise, for example, if disabled via the "nohz=" kernel boot parameter).
If the relevant grace-period kthread has been unable to run prior to
the stall warning, the following additional line is printed:
rcu_preempt kthread starved for 2023 jiffies!
Starving the grace-period kthreads of CPU time can of course result in
RCU CPU stall warnings even when all CPUs and tasks have passed through
the required quiescent states.
Multiple Warnings From One Stall

View File

@ -826,6 +826,21 @@ static void record_gp_stall_check_time(struct rcu_state *rsp)
rsp->n_force_qs_gpstart = ACCESS_ONCE(rsp->n_force_qs);
}
/*
* Complain about starvation of grace-period kthread.
*/
static void rcu_check_gp_kthread_starvation(struct rcu_state *rsp)
{
unsigned long gpa;
unsigned long j;
j = jiffies;
gpa = ACCESS_ONCE(rsp->gp_activity);
if (j - gpa > 2 * HZ)
pr_err("%s kthread starved for %ld jiffies!\n",
rsp->name, j - gpa);
}
/*
* Dump stacks of all tasks running on stalled CPUs. This is a fallback
* for architectures that do not implement trigger_all_cpu_backtrace().
@ -926,9 +941,10 @@ static void print_other_cpu_stall(struct rcu_state *rsp, unsigned long gpnum)
}
/* Complain about tasks blocking the grace period. */
rcu_print_detail_task_stall(rsp);
rcu_check_gp_kthread_starvation(rsp);
force_quiescent_state(rsp); /* Kick them all. */
}
@ -952,6 +968,9 @@ static void print_cpu_stall(struct rcu_state *rsp)
totqlen += per_cpu_ptr(rsp->rda, cpu)->qlen;
pr_cont(" (t=%lu jiffies g=%lu c=%lu q=%lu)\n",
jiffies - rsp->gp_start, rsp->gpnum, rsp->completed, totqlen);
rcu_check_gp_kthread_starvation(rsp);
if (!trigger_all_cpu_backtrace())
dump_stack();