]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
rcutorture: Fix rcu_fwd_mutex deadlock
authorPaul E. McKenney <paulmck@kernel.org>
Tue, 28 Dec 2021 23:59:38 +0000 (15:59 -0800)
committerPaul E. McKenney <paulmck@kernel.org>
Wed, 2 Feb 2022 01:24:39 +0000 (17:24 -0800)
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: kernel test robot <oliver.sang@intel.com>
Tested-by: Oliver Sang <oliver.sang@intel.com>
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
kernel/rcu/rcutorture.c

index e99658efd97f4d5e207f897af17c0c4ff7bea6dd..1c8f40b90f70b7e8c09950ec02c2e5b967fc2166 100644 (file)
@@ -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);