rcutorture: Delay-based false positives for RCU priority boosting tests
If an rcu_torture_boost() kthread determines that its grace period has not yet ended, it invokes rcu_torture_boost_failed() which checks whether enough time has elapsed for this to be considered a failure of RCU priority boosting, and, if so, flags the error. Unfortunately, that kthread might be preempted for some seconds between the time that it checks the grace period and the time that it checks the time. This delay can result in a false positive, featuring a complaint that a particular grace period has not ended, followed by a diagnostic dump featuring a much later grace period. This commit avoids these false positives by rechecking for the end of the grace period after the time check. Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
This commit is contained in:
parent
00ad25f601
commit
7b9dad7aba
|
@ -921,6 +921,10 @@ static bool rcu_torture_boost_failed(unsigned long gp_state, unsigned long start
|
|||
static int dbg_done;
|
||||
|
||||
if (end - start > test_boost_duration * HZ - HZ / 2) {
|
||||
// Recheck after checking time to avoid false positives.
|
||||
smp_mb(); // Time check before grace-period check.
|
||||
if (cur_ops->poll_gp_state(gp_state))
|
||||
return false; // passed, though perhaps just barely
|
||||
VERBOSE_TOROUT_STRING("rcu_torture_boost boosting failed");
|
||||
n_rcu_torture_boost_failure++;
|
||||
if (!xchg(&dbg_done, 1) && cur_ops->gp_kthread_dbg) {
|
||||
|
@ -929,10 +933,10 @@ static bool rcu_torture_boost_failed(unsigned long gp_state, unsigned long start
|
|||
cur_ops->gp_kthread_dbg();
|
||||
}
|
||||
|
||||
return true; /* failed */
|
||||
return true; // failed
|
||||
}
|
||||
|
||||
return false; /* passed */
|
||||
return false; // passed
|
||||
}
|
||||
|
||||
static int rcu_torture_boost(void *arg)
|
||||
|
|
Loading…
Reference in New Issue