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:
parent
32255d51b6
commit
21d0d79ab0
|
@ -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);
|
||||||
|
|
|
@ -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");
|
||||||
|
|
Loading…
Reference in New Issue