lkml.org 
[lkml]   [2022]   [Jun]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH rcu 07/12] rcutorture: Verify that polled GP API sees synchronous grace periods
    Date
    This commit causes rcu_torture_writer() to use WARN_ON_ONCE() to check
    that the cookie returned by the current RCU flavor's ->get_gp_state()
    function (get_state_synchronize_rcu() for vanilla RCU) causes that
    flavor's ->poll_gp_state function (poll_state_synchronize_rcu() for
    vanilla RCU) to unconditionally return true.

    Note that a pair calls to synchronous grace-period-wait functions are
    used. This is necessary to account for partially overlapping normal and
    expedited grace periods aligning in just the wrong way with polled API
    invocations, which can cause those polled API invocations to ignore one or
    the other of those partially overlapping grace periods. It is unlikely
    that this sort of ignored grace period will be a problem in production,
    but rcutorture can make it happen quite within a few tens of seconds.

    This commit is in preparation for polled expedited grace periods.

    [ paulmck: Apply feedback from Frederic Weisbecker. ]

    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 | 10 ++++++++++
    1 file changed, 10 insertions(+)

    diff --git a/kernel/rcu/rcutorture.c b/kernel/rcu/rcutorture.c
    index 4ceec9f4169c7..d2edc763bb92a 100644
    --- a/kernel/rcu/rcutorture.c
    +++ b/kernel/rcu/rcutorture.c
    @@ -1269,7 +1269,12 @@ rcu_torture_writer(void *arg)
    break;
    case RTWS_EXP_SYNC:
    rcu_torture_writer_state = RTWS_EXP_SYNC;
    + if (cur_ops->get_gp_state && cur_ops->poll_gp_state)
    + cookie = cur_ops->get_gp_state();
    cur_ops->exp_sync();
    + cur_ops->exp_sync();
    + if (cur_ops->get_gp_state && cur_ops->poll_gp_state)
    + WARN_ON_ONCE(!cur_ops->poll_gp_state(cookie));
    rcu_torture_pipe_update(old_rp);
    break;
    case RTWS_COND_GET:
    @@ -1291,7 +1296,12 @@ rcu_torture_writer(void *arg)
    break;
    case RTWS_SYNC:
    rcu_torture_writer_state = RTWS_SYNC;
    + if (cur_ops->get_gp_state && cur_ops->poll_gp_state)
    + cookie = cur_ops->get_gp_state();
    cur_ops->sync();
    + cur_ops->sync();
    + if (cur_ops->get_gp_state && cur_ops->poll_gp_state)
    + WARN_ON_ONCE(!cur_ops->poll_gp_state(cookie));
    rcu_torture_pipe_update(old_rp);
    break;
    default:
    --
    2.31.1.189.g2e36527f23
    \
     
     \ /
      Last update: 2022-06-21 00:54    [W:2.573 / U:0.136 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site