24 Feb, 2014

18 commits

  • Although most torture tests will have some cleanup hook, it is possible
    that one might not. This commit therefore enables graceful handling of
    a NULL cleanup hook during torture-test shutdown.

    Signed-off-by: Paul E. McKenney
    Reviewed-by: Josh Triplett

    Paul E. McKenney
     
  • The specific torture modules (like rcutorture) need to call
    torture_cleanup() in any case, so this commit makes torture_cleanup()
    deal with torture_shutdown_cleanup() and torture_stutter_cleanup() so
    that the specific modules don't have to deal with these details.

    Signed-off-by: Paul E. McKenney
    Reviewed-by: Josh Triplett

    Paul E. McKenney
     
  • Stopping of kthreads is not RCU-specific, so this commit abstracts
    out torture_stop_kthread(), saving a few lines of code in the process.

    Signed-off-by: Paul E. McKenney
    Reviewed-by: Josh Triplett

    Paul E. McKenney
     
  • Creation of kthreads is not RCU-specific, so this commit abstracts
    out torture_create_kthread(), saving a few tens of lines of code in
    the process.

    This change requires modifying VERBOSE_TOROUT_ERRSTRING() to take a
    non-const string, so that _torture_create_kthread() can avoid an
    open-coded substitute.

    Signed-off-by: Paul E. McKenney
    Reviewed-by: Josh Triplett

    Paul E. McKenney
     
  • Not all of the rcutorture kthreads waited for kthread_should_stop()
    before returning from their top-level functions, and none of them
    used torture_shutdown_absorb() properly. These problems can result in
    segfaults and hangs at shutdown time, and some recent changes perturbed
    timing sufficiently to make them much more probable. This commit
    therefore creates a torture_kthread_stopping() function that does the
    proper kthread shutdown dance in one centralized location.

    Accommodate this grouping by making VERBOSE_TOROUT_STRING() capable of
    taking a non-const string as its argument, which allows the new
    torture_kthread_stopping() to pass its "title" argument directly to
    the updated version of VERBOSE_TOROUT_STRING().

    Signed-off-by: Paul E. McKenney

    Paul E. McKenney
     
  • A few "stealth-start rcutorture kthreads" have accumulated over the years,
    so this commit adds console-log announcements (but only if the torture
    tests are running verbose).

    Signed-off-by: Paul E. McKenney
    Reviewed-by: Josh Triplett

    Paul E. McKenney
     
  • Because auto-shutdown of torture testing is not specific to RCU,
    this commit moves the auto-shutdown function to kernel/torture.c.

    Signed-off-by: Paul E. McKenney
    Reviewed-by: Josh Triplett

    Paul E. McKenney
     
  • Because the fullstop variable can be accessed while it is being updated,
    this commit avoids any resulting compiler mischief through use of
    ACCESS_ONCE() for non-initialization accesses to this shared variable.

    Signed-off-by: Paul E. McKenney
    Reviewed-by: Josh Triplett

    Paul E. McKenney
     
  • Because stuttering the test load (stopping and restarting it) is useful
    for non-RCU testing, this commit moves the load-stuttering functionality
    to kernel/torture.c.

    Signed-off-by: Paul E. McKenney
    Reviewed-by: Josh Triplett

    Paul E. McKenney
     
  • Currently, rcutorture can terminate via rmmod, via self-shutdown,
    via something else shutting the system down, or of course the usual
    catastrophic termination. The first two get flagged, so this commit adds
    a message for the third. For the fourth, your warranty is void as always.

    Signed-off-by: Paul E. McKenney
    Reviewed-by: Josh Triplett

    Paul E. McKenney
     
  • This commit introduces the torture_must_stop() function in order to
    keep use of the fullstop variable local to kernel/torture.c. There
    is also a torture_must_stop_irq() counterpart for use from RCU callbacks,
    timeout handlers, and the like.

    Signed-off-by: Paul E. McKenney
    Reviewed-by: Josh Triplett

    Paul E. McKenney
     
  • Because handling the race between rmmod and system shutdown is not
    specific to RCU, this commit abstracts torture_shutdown_notify(),
    placing this code into kernel/torture.c. This change also allows
    fullstop_mutex to be private to kernel/torture.c.

    Signed-off-by: Paul E. McKenney
    Reviewed-by: Josh Triplett

    Paul E. McKenney
     
  • This commit creates a torture_cleanup() that handles the generic
    cleanup actions local to kernel/torture.c.

    Signed-off-by: Paul E. McKenney
    Reviewed-by: Josh Triplett

    Paul E. McKenney
     
  • This commit creates torture_init_begin() and torture_init_end() functions
    to abstract locking and allow the torture_type and verbose variables
    in kernel/torture.o to become static. With a bit more abstraction,
    fullstop_mutex will also become static.

    Signed-off-by: Paul E. McKenney
    Reviewed-by: Josh Triplett

    Paul E. McKenney
     
  • Because online/offline torturing is not specific to RCU, this commit
    abstracts it into the kernel/torture.c module to allow other torture
    tests to use it.

    Signed-off-by: Paul E. McKenney
    Reviewed-by: Josh Triplett

    Paul E. McKenney
     
  • The torture_shuffle() function forces each CPU in turn to go idle
    periodically in order to check for problems interacting with per-CPU
    variables and with dyntick-idle mode. Because this sort of debugging
    is not specific to RCU, this commit abstracts that functionality.
    This in turn requires abstracting some additional infrastructure.

    Signed-off-by: Paul E. McKenney
    Reviewed-by: Josh Triplett

    Paul E. McKenney
     
  • Because handling races between rmmod and normal shutdown is not specific
    to rcutorture, this commit renames rcutorture_shutdown_absorb() to
    torture_shutdown_absorb() and pulls it out into then kernel/torture.c
    module. This implies pulling the fullstop mechanism into kernel/torture.c
    as well.

    The exporting of fullstop and fullstop_mutex is ugly and must die.
    And it does in fact die in later commits that introduce higher-level
    APIs that encapsulate both of these variables.

    Signed-off-by: Paul E. McKenney
    Reviewed-by: Josh Triplett `

    Paul E. McKenney
     
  • Because rcu_torture_random() will be used by the locking equivalent to
    rcutorture, pull it out into its own module. This new module cannot
    be separately configured, instead, use the Kconfig "select" statement
    from the Kconfig options of tests depending on it.

    Suggested-by: Rusty Russell
    Signed-off-by: Paul E. McKenney

    Paul E. McKenney