]> Gentwo Git Trees - linux/.git/commitdiff
rcutorture: Test srcu_expedite_current()
authorPaul E. McKenney <paulmck@kernel.org>
Wed, 5 Nov 2025 20:32:03 +0000 (12:32 -0800)
committerFrederic Weisbecker <frederic@kernel.org>
Wed, 5 Nov 2025 22:58:16 +0000 (23:58 +0100)
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 <paulmck@kernel.org>
Cc: Andrii Nakryiko <andrii@kernel.org>
Cc: Alexei Starovoitov <ast@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: <bpf@vger.kernel.org>
Signed-off-by: Frederic Weisbecker <frederic@kernel.org>
kernel/rcu/rcutorture.c

index 29fe3c01312f60ebac23a99aaaf24d619d54b73b..aedbdad150b366f3ff93b21cbcd264d12cbeb55f 100644 (file)
@@ -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++)