|
@@ -585,6 +585,27 @@ static int rcu_print_task_stall(struct rcu_node *rnp)
|
|
|
return ndetected;
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * Scan the current list of tasks blocked within RCU read-side critical
|
|
|
+ * sections, printing out the tid of each that is blocking the current
|
|
|
+ * expedited grace period.
|
|
|
+ */
|
|
|
+static int rcu_print_task_exp_stall(struct rcu_node *rnp)
|
|
|
+{
|
|
|
+ struct task_struct *t;
|
|
|
+ int ndetected = 0;
|
|
|
+
|
|
|
+ if (!rnp->exp_tasks)
|
|
|
+ return 0;
|
|
|
+ t = list_entry(rnp->exp_tasks->prev,
|
|
|
+ struct task_struct, rcu_node_entry);
|
|
|
+ list_for_each_entry_continue(t, &rnp->blkd_tasks, rcu_node_entry) {
|
|
|
+ pr_cont(" P%d", t->pid);
|
|
|
+ ndetected++;
|
|
|
+ }
|
|
|
+ return ndetected;
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* Check that the list of blocked tasks for the newly completed grace
|
|
|
* period is in fact empty. It is a serious bug to complete a grace
|
|
@@ -845,6 +866,16 @@ static int rcu_print_task_stall(struct rcu_node *rnp)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * Because preemptible RCU does not exist, we never have to check for
|
|
|
+ * tasks blocked within RCU read-side critical sections that are
|
|
|
+ * blocking the current expedited grace period.
|
|
|
+ */
|
|
|
+static int rcu_print_task_exp_stall(struct rcu_node *rnp)
|
|
|
+{
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* Because there is no preemptible RCU, there can be no readers blocked,
|
|
|
* so there is no need to check for blocked tasks. So check only for
|