rcu: Inline RCU task stall-warning helper functions

The rcu_print_detail_task_stall(), rcu_print_task_stall_begin(), and
rcu_print_task_stall_end() functions were defined to allow long-gone
Kconfig options to provide an abbreviated RCU CPU stall warning printout.
This commit saves a few lines of code by inlining them into their sole
callers.

While in the area, a useless call of rcu_print_detail_task_stall_rnp()
on the root rcu_node structure was eliminated.  If there is only one
rcu_node structure, its tasks get printed twice, but if there are more,
the root rcu_node structure is guaranteed to have an empty list of blocked
tasks, hence the uselessness.  (Long ago, root rcu_node structures with
non-empty ->blkd_tasks lists could happen, but no longer.)

Signed-off-by: Paul E. McKenney <paulmck@linux.ibm.com>
This commit is contained in:
Paul E. McKenney 2019-01-11 20:36:45 -08:00
parent 32255d51b6
commit 21d0d79ab0
2 changed files with 7 additions and 30 deletions

View File

@ -445,7 +445,6 @@ static void rcu_dynticks_task_enter(void);
static void rcu_dynticks_task_exit(void); static void rcu_dynticks_task_exit(void);
/* Forward declarations for tree_stall.h */ /* Forward declarations for tree_stall.h */
static void rcu_print_detail_task_stall(void);
static int rcu_print_task_stall(struct rcu_node *rnp); static int rcu_print_task_stall(struct rcu_node *rnp);
static void record_gp_stall_check_time(void); static void record_gp_stall_check_time(void);
static void check_cpu_stall(struct rcu_data *rdp); static void check_cpu_stall(struct rcu_data *rdp);

View File

@ -94,30 +94,6 @@ static void rcu_print_detail_task_stall_rnp(struct rcu_node *rnp)
raw_spin_unlock_irqrestore_rcu_node(rnp, flags); raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
} }
/*
* Dump detailed information for all tasks blocking the current RCU
* grace period.
*/
static void rcu_print_detail_task_stall(void)
{
struct rcu_node *rnp = rcu_get_root();
rcu_print_detail_task_stall_rnp(rnp);
rcu_for_each_leaf_node(rnp)
rcu_print_detail_task_stall_rnp(rnp);
}
static void rcu_print_task_stall_begin(struct rcu_node *rnp)
{
pr_err("\tTasks blocked on level-%d rcu_node (CPUs %d-%d):",
rnp->level, rnp->grplo, rnp->grphi);
}
static void rcu_print_task_stall_end(void)
{
pr_cont("\n");
}
/* /*
* Scan the current list of tasks blocked within RCU read-side critical * Scan the current list of tasks blocked within RCU read-side critical
* sections, printing out the tid of each. * sections, printing out the tid of each.
@ -129,14 +105,15 @@ static int rcu_print_task_stall(struct rcu_node *rnp)
if (!rcu_preempt_blocked_readers_cgp(rnp)) if (!rcu_preempt_blocked_readers_cgp(rnp))
return 0; return 0;
rcu_print_task_stall_begin(rnp); pr_err("\tTasks blocked on level-%d rcu_node (CPUs %d-%d):",
rnp->level, rnp->grplo, rnp->grphi);
t = list_entry(rnp->gp_tasks->prev, t = list_entry(rnp->gp_tasks->prev,
struct task_struct, rcu_node_entry); struct task_struct, rcu_node_entry);
list_for_each_entry_continue(t, &rnp->blkd_tasks, rcu_node_entry) { list_for_each_entry_continue(t, &rnp->blkd_tasks, rcu_node_entry) {
pr_cont(" P%d", t->pid); pr_cont(" P%d", t->pid);
ndetected++; ndetected++;
} }
rcu_print_task_stall_end(); pr_cont("\n");
return ndetected; return ndetected;
} }
@ -146,7 +123,7 @@ static int rcu_print_task_stall(struct rcu_node *rnp)
* Because preemptible RCU does not exist, we never have to check for * Because preemptible RCU does not exist, we never have to check for
* tasks blocked within RCU read-side critical sections. * tasks blocked within RCU read-side critical sections.
*/ */
static void rcu_print_detail_task_stall(void) static void rcu_print_detail_task_stall_rnp(struct rcu_node *rnp)
{ {
} }
@ -253,7 +230,7 @@ static void print_other_cpu_stall(unsigned long gp_seq)
unsigned long gpa; unsigned long gpa;
unsigned long j; unsigned long j;
int ndetected = 0; int ndetected = 0;
struct rcu_node *rnp = rcu_get_root(); struct rcu_node *rnp;
long totqlen = 0; long totqlen = 0;
/* Kick and suppress, if so configured. */ /* Kick and suppress, if so configured. */
@ -291,7 +268,8 @@ static void print_other_cpu_stall(unsigned long gp_seq)
rcu_dump_cpu_stacks(); rcu_dump_cpu_stacks();
/* Complain about tasks blocking the grace period. */ /* Complain about tasks blocking the grace period. */
rcu_print_detail_task_stall(); rcu_for_each_leaf_node(rnp)
rcu_print_detail_task_stall_rnp(rnp);
} else { } else {
if (rcu_seq_current(&rcu_state.gp_seq) != gp_seq) { if (rcu_seq_current(&rcu_state.gp_seq) != gp_seq) {
pr_err("INFO: Stall ended before state dump start\n"); pr_err("INFO: Stall ended before state dump start\n");