This commit adds a ->exp_current member to the rcu_torture_ops structure
to test the srcu_expedite_current() function.

Signed-off-by: Paul E. McKenney <[email protected]>
Cc: Andrii Nakryiko <[email protected]>
Cc: Alexei Starovoitov <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Cc: <[email protected]>
---
 kernel/rcu/rcutorture.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/kernel/rcu/rcutorture.c b/kernel/rcu/rcutorture.c
index 318bea62ed3e..ea8077c08fac 100644
--- a/kernel/rcu/rcutorture.c
+++ b/kernel/rcu/rcutorture.c
@@ -389,6 +389,7 @@ struct rcu_torture_ops {
        void (*deferred_free)(struct rcu_torture *p);
        void (*sync)(void);
        void (*exp_sync)(void);
+       void (*exp_current)(void);
        unsigned long (*get_gp_state_exp)(void);
        unsigned long (*start_gp_poll_exp)(void);
        void (*start_gp_poll_exp_full)(struct rcu_gp_oldstate *rgosp);
@@ -857,6 +858,11 @@ static void srcu_torture_synchronize_expedited(void)
        synchronize_srcu_expedited(srcu_ctlp);
 }
 
+static void srcu_torture_expedite_current(void)
+{
+       srcu_expedite_current(srcu_ctlp);
+}
+
 static struct rcu_torture_ops srcu_ops = {
        .ttype          = SRCU_FLAVOR,
        .init           = rcu_sync_torture_init,
@@ -871,6 +877,7 @@ static struct rcu_torture_ops srcu_ops = {
        .deferred_free  = srcu_torture_deferred_free,
        .sync           = srcu_torture_synchronize,
        .exp_sync       = srcu_torture_synchronize_expedited,
+       .exp_current    = srcu_torture_expedite_current,
        .same_gp_state  = same_state_synchronize_srcu,
        .get_comp_state = get_completed_synchronize_srcu,
        .get_gp_state   = srcu_torture_get_gp_state,
@@ -919,6 +926,7 @@ static struct rcu_torture_ops srcud_ops = {
        .deferred_free  = srcu_torture_deferred_free,
        .sync           = srcu_torture_synchronize,
        .exp_sync       = srcu_torture_synchronize_expedited,
+       .exp_current    = srcu_torture_expedite_current,
        .same_gp_state  = same_state_synchronize_srcu,
        .get_comp_state = get_completed_synchronize_srcu,
        .get_gp_state   = srcu_torture_get_gp_state,
@@ -1700,6 +1708,8 @@ rcu_torture_writer(void *arg)
                                        ulo[i] = cur_ops->get_comp_state();
                                gp_snap = cur_ops->start_gp_poll();
                                rcu_torture_writer_state = RTWS_POLL_WAIT;
+                               if (cur_ops->exp_current && 
!torture_random(&rand) % 0xff)
+                                       cur_ops->exp_current();
                                while (!cur_ops->poll_gp_state(gp_snap)) {
                                        gp_snap1 = cur_ops->get_gp_state();
                                        for (i = 0; i < ulo_size; i++)
@@ -1720,6 +1730,8 @@ rcu_torture_writer(void *arg)
                                        cur_ops->get_comp_state_full(&rgo[i]);
                                cur_ops->start_gp_poll_full(&gp_snap_full);
                                rcu_torture_writer_state = RTWS_POLL_WAIT_FULL;
+                               if (cur_ops->exp_current && 
!torture_random(&rand) % 0xff)
+                                       cur_ops->exp_current();
                                while 
(!cur_ops->poll_gp_state_full(&gp_snap_full)) {
                                        
cur_ops->get_gp_state_full(&gp_snap1_full);
                                        for (i = 0; i < rgo_size; i++)
-- 
2.40.1


Reply via email to