lkml.org 
[lkml]   [2018]   [Aug]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH tip/core/rcu 16/17] rcutorture: Check GP completion at stutter end
    Date
    The rcu_torture_writer() function invokes stutter_wait() at the end of
    each writer pass, which occasionally blocks for an extended time period
    in order to ensure that RCU can handle intermittent loads. But part of
    handling a busy period is invoking all the callbacks before the end of
    the idle period induced by stutter_wait().

    This commit therefore adds a return value to stutter_wait() indicating
    whether stutter_wait() actually waited. In addition, this commit causes
    rcu_torture_writer() to test this value and if set, checks that all the
    elements of the rcu_tortures[] array have been freed up.

    Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
    ---
    include/linux/torture.h | 2 +-
    kernel/rcu/rcutorture.c | 5 ++++-
    kernel/torture.c | 3 ++-
    3 files changed, 7 insertions(+), 3 deletions(-)

    diff --git a/include/linux/torture.h b/include/linux/torture.h
    index 61dfd93b6ee4..48fad21109fc 100644
    --- a/include/linux/torture.h
    +++ b/include/linux/torture.h
    @@ -77,7 +77,7 @@ void torture_shutdown_absorb(const char *title);
    int torture_shutdown_init(int ssecs, void (*cleanup)(void));

    /* Task stuttering, which forces load/no-load transitions. */
    -void stutter_wait(const char *title);
    +bool stutter_wait(const char *title);
    int torture_stutter_init(int s);

    /* Initialization and cleanup. */
    diff --git a/kernel/rcu/rcutorture.c b/kernel/rcu/rcutorture.c
    index 7df8142a6a22..ae10ad531993 100644
    --- a/kernel/rcu/rcutorture.c
    +++ b/kernel/rcu/rcutorture.c
    @@ -1144,7 +1144,10 @@ rcu_torture_writer(void *arg)
    !rcu_gp_is_normal();
    }
    rcu_torture_writer_state = RTWS_STUTTER;
    - stutter_wait("rcu_torture_writer");
    + if (stutter_wait("rcu_torture_writer"))
    + for (i = 0; i < ARRAY_SIZE(rcu_tortures); i++)
    + if (list_empty(&rcu_tortures[i].rtort_free))
    + WARN_ON_ONCE(1);
    } while (!torture_must_stop());
    /* Reset expediting back to unexpedited. */
    if (expediting > 0)
    diff --git a/kernel/torture.c b/kernel/torture.c
    index 1ac24a826589..17d91f5fba2a 100644
    --- a/kernel/torture.c
    +++ b/kernel/torture.c
    @@ -573,7 +573,7 @@ static int stutter;
    * Block until the stutter interval ends. This must be called periodically
    * by all running kthreads that need to be subject to stuttering.
    */
    -void stutter_wait(const char *title)
    +bool stutter_wait(const char *title)
    {
    int spt;

    @@ -590,6 +590,7 @@ void stutter_wait(const char *title)
    }
    torture_shutdown_absorb(title);
    }
    + return !!spt;
    }
    EXPORT_SYMBOL_GPL(stutter_wait);

    --
    2.17.1
    \
     
     \ /
      Last update: 2018-08-29 23:50    [W:2.540 / U:0.040 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site