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

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

srcu: Consolidate batch checking into rcu_all_batches_empty()



The srcu_reschedule() function invokes rcu_batch_empty() on each of
the four rcu_batch structures in the srcu_struct in question twice.
Given that this check will also be needed in cleanup_srcu_struct(), this
commit consolidates these four checks into a new rcu_all_batches_empty()
function.

Signed-off-by: default avatarPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Reviewed-by: default avatarJosh Triplett <josh@joshtriplett.org>
parent 77e58496
Loading
Loading
Loading
Loading
+13 −8
Original line number Diff line number Diff line
@@ -64,6 +64,17 @@ static inline bool rcu_batch_empty(struct rcu_batch *b)
	return b->tail == &b->head;
}

/*
 * Are all batches empty for the specified srcu_struct?
 */
static inline bool rcu_all_batches_empty(struct srcu_struct *sp)
{
	return rcu_batch_empty(&sp->batch_done) &&
	       rcu_batch_empty(&sp->batch_check1) &&
	       rcu_batch_empty(&sp->batch_check0) &&
	       rcu_batch_empty(&sp->batch_queue);
}

/*
 * Remove the callback at the head of the specified rcu_batch structure
 * and return a pointer to it, or return NULL if the structure is empty.
@@ -619,15 +630,9 @@ static void srcu_reschedule(struct srcu_struct *sp)
{
	bool pending = true;

	if (rcu_batch_empty(&sp->batch_done) &&
	    rcu_batch_empty(&sp->batch_check1) &&
	    rcu_batch_empty(&sp->batch_check0) &&
	    rcu_batch_empty(&sp->batch_queue)) {
	if (rcu_all_batches_empty(sp)) {
		spin_lock_irq(&sp->queue_lock);
		if (rcu_batch_empty(&sp->batch_done) &&
		    rcu_batch_empty(&sp->batch_check1) &&
		    rcu_batch_empty(&sp->batch_check0) &&
		    rcu_batch_empty(&sp->batch_queue)) {
		if (rcu_all_batches_empty(sp)) {
			sp->running = false;
			pending = false;
		}