The following commit has been merged into the core/rcu branch of tip:

Commit-ID:     1a893c711a600ab57526619b56e6f6b7be00956e
Gitweb:        
https://git.kernel.org/tip/1a893c711a600ab57526619b56e6f6b7be00956e
Author:        Paul E. McKenney <paul...@kernel.org>
AuthorDate:    Fri, 13 Nov 2020 09:37:39 -08:00
Committer:     Paul E. McKenney <paul...@kernel.org>
CommitterDate: Mon, 04 Jan 2021 13:53:37 -08:00

srcu: Provide internal interface to start a Tiny SRCU grace period

There is a need for a polling interface for SRCU grace periods.
This polling needs to initiate an SRCU grace period without
having to queue (and manage) a callback.  This commit therefore
splits the Tiny SRCU call_srcu() function into callback-queuing and
start-grace-period portions, with the latter in a new function named
srcu_gp_start_if_needed().

Link: https://lore.kernel.org/rcu/20201112201547.gf3365...@moria.home.lan/
Reported-by: Kent Overstreet <kent.overstr...@gmail.com>
Reviewed-by: Neeraj Upadhyay <neer...@codeaurora.org>
Signed-off-by: Paul E. McKenney <paul...@kernel.org>
---
 kernel/rcu/srcutiny.c | 17 +++++++++++------
 1 file changed, 11 insertions(+), 6 deletions(-)

diff --git a/kernel/rcu/srcutiny.c b/kernel/rcu/srcutiny.c
index 5598cf6..3bac1db 100644
--- a/kernel/rcu/srcutiny.c
+++ b/kernel/rcu/srcutiny.c
@@ -152,6 +152,16 @@ void srcu_drive_gp(struct work_struct *wp)
 }
 EXPORT_SYMBOL_GPL(srcu_drive_gp);
 
+static void srcu_gp_start_if_needed(struct srcu_struct *ssp)
+{
+       if (!READ_ONCE(ssp->srcu_gp_running)) {
+               if (likely(srcu_init_done))
+                       schedule_work(&ssp->srcu_work);
+               else if (list_empty(&ssp->srcu_work.entry))
+                       list_add(&ssp->srcu_work.entry, &srcu_boot_list);
+       }
+}
+
 /*
  * Enqueue an SRCU callback on the specified srcu_struct structure,
  * initiating grace-period processing if it is not already running.
@@ -167,12 +177,7 @@ void call_srcu(struct srcu_struct *ssp, struct rcu_head 
*rhp,
        *ssp->srcu_cb_tail = rhp;
        ssp->srcu_cb_tail = &rhp->next;
        local_irq_restore(flags);
-       if (!READ_ONCE(ssp->srcu_gp_running)) {
-               if (likely(srcu_init_done))
-                       schedule_work(&ssp->srcu_work);
-               else if (list_empty(&ssp->srcu_work.entry))
-                       list_add(&ssp->srcu_work.entry, &srcu_boot_list);
-       }
+       srcu_gp_start_if_needed(ssp);
 }
 EXPORT_SYMBOL_GPL(call_srcu);
 

Reply via email to