Commit 89440d2d authored by Paul E. McKenney's avatar Paul E. McKenney
Browse files

rcutorture: Fix rcu_fwd_mutex deadlock



The rcu_torture_fwd_cb_hist() function acquires rcu_fwd_mutex, but is
invoked from rcutorture_oom_notify() function, which hold this same
mutex across this call.  This commit fixes the resulting deadlock.

Reported-by: default avatarkernel test robot <oliver.sang@intel.com>
Tested-by: default avatarOliver Sang <oliver.sang@intel.com>
Signed-off-by: default avatarPaul E. McKenney <paulmck@kernel.org>
parent 02b51a1c
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -2180,7 +2180,6 @@ static void rcu_torture_fwd_cb_hist(struct rcu_fwd *rfp)
	for (i = ARRAY_SIZE(rfp->n_launders_hist) - 1; i > 0; i--)
		if (rfp->n_launders_hist[i].n_launders > 0)
			break;
	mutex_lock(&rcu_fwd_mutex); // Serialize histograms.
	pr_alert("%s: Callback-invocation histogram %d (duration %lu jiffies):",
		 __func__, rfp->rcu_fwd_id, jiffies - rfp->rcu_fwd_startat);
	gps_old = rfp->rcu_launder_gp_seq_start;
@@ -2193,7 +2192,6 @@ static void rcu_torture_fwd_cb_hist(struct rcu_fwd *rfp)
		gps_old = gps;
	}
	pr_cont("\n");
	mutex_unlock(&rcu_fwd_mutex);
}

/* Callback function for continuous-flood RCU callbacks. */
@@ -2431,7 +2429,9 @@ static void rcu_torture_fwd_prog_cr(struct rcu_fwd *rfp)
			 n_launders, n_launders_sa,
			 n_max_gps, n_max_cbs, cver, gps);
		atomic_long_add(n_max_cbs, &rcu_fwd_max_cbs);
		mutex_lock(&rcu_fwd_mutex); // Serialize histograms.
		rcu_torture_fwd_cb_hist(rfp);
		mutex_unlock(&rcu_fwd_mutex);
	}
	schedule_timeout_uninterruptible(HZ); /* Let CBs drain. */
	tick_dep_clear_task(current, TICK_DEP_BIT_RCU);