Re: [PATCH v2 tip/core/rcu 03/39] srcu: Consolidate batch checking into rcu_all_batches_empty()
From: Josh Triplett
Date: Mon Apr 17 2017 - 20:30:50 EST
On Mon, Apr 17, 2017 at 04:44:50PM -0700, Paul E. McKenney wrote:
> 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 <paulmck@xxxxxxxxxxxxxxxxxx>
Reviewed-by: Josh Triplett <josh@xxxxxxxxxxxxxxxx>
> 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
>