Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 72611ab9 authored by Paul E. McKenney's avatar Paul E. McKenney
Browse files

rcu: Add more diagnostics to expedited stall warning messages.



This commit adds print statements that check the rcu_node structure to
find which ->expmask bits and which ->exp_tasks structures are blocking
the current expedited grace period.

Signed-off-by: default avatarPaul E. McKenney <paulmck@linux.vnet.ibm.com>
parent 73f36f9d
Loading
Loading
Loading
Loading
+21 −3
Original line number Diff line number Diff line
@@ -3745,6 +3745,7 @@ static void synchronize_sched_expedited_wait(struct rcu_state *rsp)
	unsigned long jiffies_stall;
	unsigned long jiffies_start;
	unsigned long mask;
	int ndetected;
	struct rcu_node *rnp;
	struct rcu_node *rnp_root = rcu_get_root(rsp);
	int ret;
@@ -3767,14 +3768,16 @@ static void synchronize_sched_expedited_wait(struct rcu_state *rsp)
		}
		pr_err("INFO: %s detected expedited stalls on CPUs/tasks: {",
		       rsp->name);
		ndetected = 0;
		rcu_for_each_leaf_node(rsp, rnp) {
			(void)rcu_print_task_exp_stall(rnp);
			ndetected = rcu_print_task_exp_stall(rnp);
			mask = 1;
			for (cpu = rnp->grplo; cpu <= rnp->grphi; cpu++, mask <<= 1) {
				struct rcu_data *rdp;

				if (!(rnp->expmask & mask))
					continue;
				ndetected++;
				rdp = per_cpu_ptr(rsp->rda, cpu);
				pr_cont(" %d-%c%c%c", cpu,
					"O."[cpu_online(cpu)],
@@ -3783,8 +3786,23 @@ static void synchronize_sched_expedited_wait(struct rcu_state *rsp)
			}
			mask <<= 1;
		}
		pr_cont(" } %lu jiffies s: %lu\n",
			jiffies - jiffies_start, rsp->expedited_sequence);
		pr_cont(" } %lu jiffies s: %lu root: %#lx/%c\n",
			jiffies - jiffies_start, rsp->expedited_sequence,
			rnp_root->expmask, ".T"[!!rnp_root->exp_tasks]);
		if (!ndetected) {
			pr_err("blocking rcu_node structures:");
			rcu_for_each_node_breadth_first(rsp, rnp) {
				if (rnp == rnp_root)
					continue; /* printed unconditionally */
				if (sync_rcu_preempt_exp_done(rnp))
					continue;
				pr_cont(" l=%u:%d-%d:%#lx/%c",
					rnp->level, rnp->grplo, rnp->grphi,
					rnp->expmask,
					".T"[!!rnp->exp_tasks]);
			}
			pr_cont("\n");
		}
		rcu_for_each_leaf_node(rsp, rnp) {
			mask = 1;
			for (cpu = rnp->grplo; cpu <= rnp->grphi; cpu++, mask <<= 1) {