rcutorture: Validate get_completed_synchronize_rcu()
authorPaul E. McKenney <paulmck@kernel.org>
Wed, 13 Apr 2022 23:14:02 +0000 (16:14 -0700)
committerPaul E. McKenney <paulmck@kernel.org>
Mon, 20 Jun 2022 16:21:51 +0000 (09:21 -0700)
This commit verifies that the RCU grace-period state cookie returned
from get_completed_synchronize_rcu() causes poll_state_synchronize_rcu()
to return true, as required.

This commit is in preparation for polled expedited grace periods.

Link: https://lore.kernel.org/all/20220121142454.1994916-1-bfoster@redhat.com/
Link: https://docs.google.com/document/d/1RNKWW9jQyfjxw2E8dsXVTdvZYh0HnYeSHDKog9jhdN8/edit?usp=sharing
Cc: Brian Foster <bfoster@redhat.com>
Cc: Dave Chinner <david@fromorbit.com>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: Ian Kent <raven@themaw.net>
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
kernel/rcu/rcutorture.c

index 7120165a93426c282c7d9f6d3a87a4738ac52905..4ceec9f4169c75495302940cbdd6ad4eaf913ad4 100644 (file)
@@ -338,6 +338,7 @@ struct rcu_torture_ops {
        void (*sync)(void);
        void (*exp_sync)(void);
        unsigned long (*get_gp_state)(void);
+       unsigned long (*get_gp_completed)(void);
        unsigned long (*start_gp_poll)(void);
        bool (*poll_gp_state)(unsigned long oldstate);
        void (*cond_sync)(unsigned long oldstate);
@@ -504,6 +505,7 @@ static struct rcu_torture_ops rcu_ops = {
        .sync                   = synchronize_rcu,
        .exp_sync               = synchronize_rcu_expedited,
        .get_gp_state           = get_state_synchronize_rcu,
+       .get_gp_completed       = get_completed_synchronize_rcu,
        .start_gp_poll          = start_poll_synchronize_rcu,
        .poll_gp_state          = poll_state_synchronize_rcu,
        .cond_sync              = cond_synchronize_rcu,
@@ -1254,6 +1256,10 @@ rcu_torture_writer(void *arg)
                                          rcu_torture_writer_state_getname(),
                                          rcu_torture_writer_state,
                                          cookie, cur_ops->get_gp_state());
+                               if (cur_ops->get_gp_completed) {
+                                       cookie = cur_ops->get_gp_completed();
+                                       WARN_ON_ONCE(!cur_ops->poll_gp_state(cookie));
+                               }
                                cur_ops->readunlock(idx);
                        }
                        switch (synctype[torture_random(&rand) % nsynctypes]) {