rcu: Pull out wait_event*() condition into helper function
The condition for the wait_event_interruptible_timeout() that waits to do the next force-quiescent-state scan is a bit ornate: ((gf = READ_ONCE(rsp->gp_flags)) & RCU_GP_FLAG_FQS) || (!READ_ONCE(rnp->qsmask) && !rcu_preempt_blocked_readers_cgp(rnp)) This commit therefore pulls this condition out into a helper function and comments its component conditions. Reported-by: Peter Zijlstra <peterz@infradead.org> Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
This commit is contained in:
Родитель
99a930b0d2
Коммит
b9a425cfcb
|
@ -1903,6 +1903,26 @@ static int rcu_gp_init(struct rcu_state *rsp)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Helper function for wait_event_interruptible_timeout() wakeup
|
||||||
|
* at force-quiescent-state time.
|
||||||
|
*/
|
||||||
|
static bool rcu_gp_fqs_check_wake(struct rcu_state *rsp, int *gfp)
|
||||||
|
{
|
||||||
|
struct rcu_node *rnp = rcu_get_root(rsp);
|
||||||
|
|
||||||
|
/* Someone like call_rcu() requested a force-quiescent-state scan. */
|
||||||
|
*gfp = READ_ONCE(rsp->gp_flags);
|
||||||
|
if (*gfp & RCU_GP_FLAG_FQS)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
/* The current grace period has completed. */
|
||||||
|
if (!READ_ONCE(rnp->qsmask) && !rcu_preempt_blocked_readers_cgp(rnp))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Do one round of quiescent-state forcing.
|
* Do one round of quiescent-state forcing.
|
||||||
*/
|
*/
|
||||||
|
@ -2067,11 +2087,7 @@ static int __noreturn rcu_gp_kthread(void *arg)
|
||||||
TPS("fqswait"));
|
TPS("fqswait"));
|
||||||
rsp->gp_state = RCU_GP_WAIT_FQS;
|
rsp->gp_state = RCU_GP_WAIT_FQS;
|
||||||
ret = wait_event_interruptible_timeout(rsp->gp_wq,
|
ret = wait_event_interruptible_timeout(rsp->gp_wq,
|
||||||
((gf = READ_ONCE(rsp->gp_flags)) &
|
rcu_gp_fqs_check_wake(rsp, &gf), j);
|
||||||
RCU_GP_FLAG_FQS) ||
|
|
||||||
(!READ_ONCE(rnp->qsmask) &&
|
|
||||||
!rcu_preempt_blocked_readers_cgp(rnp)),
|
|
||||||
j);
|
|
||||||
rsp->gp_state = RCU_GP_DONE_FQS;
|
rsp->gp_state = RCU_GP_DONE_FQS;
|
||||||
/* Locking provides needed memory barriers. */
|
/* Locking provides needed memory barriers. */
|
||||||
/* If grace period done, leave loop. */
|
/* If grace period done, leave loop. */
|
||||||
|
|
Загрузка…
Ссылка в новой задаче