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: Paul E. McKenney <[email protected]>
---
 kernel/rcu/srcu.c | 21 +++++++++++++--------
 1 file changed, 13 insertions(+), 8 deletions(-)

diff --git a/kernel/rcu/srcu.c b/kernel/rcu/srcu.c
index ef3bcfb15b39..ba41a5d04b49 100644
--- a/kernel/rcu/srcu.c
+++ b/kernel/rcu/srcu.c
@@ -65,6 +65,17 @@ static inline bool rcu_batch_empty(struct rcu_batch *b)
 }
 
 /*
+ * 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;
                }
-- 
2.5.2

Reply via email to