25 Aug, 2020

15 commits

  • Although the test loop does randomly delay, which would provide quiescent
    states and so forth, it is possible for there to be a series of long
    smp_call_function*() handler runtimes with no delays, which results in
    softlockup and RCU CPU stall warning messages. This commit therefore
    inserts a cond_resched() into the main test loop.

    Signed-off-by: Paul E. McKenney

    Paul E. McKenney
     
  • On uniprocessor systems, smp_call_function() does nothing. This commit
    therefore avoids complaining about the lack of handler accesses in the
    single-CPU case where there is no handler.

    Signed-off-by: Paul E. McKenney

    Paul E. McKenney
     
  • Currently, CPU-hotplug operations might result in all but two
    of (say) 100 CPUs being offline, which in turn might result in
    false-positive diagnostics due to overload. This commit therefore
    causes scftorture_invoker() kthreads for offline CPUs to loop blocking
    for 200 milliseconds at a time, thus continuously adjusting the number
    of threads to match the number of online CPUs.

    Signed-off-by: Paul E. McKenney

    Paul E. McKenney
     
  • This commit adds a "default" case to the switch statement in
    scftorture_invoke_one() which contains a WARN_ON_ONCE() and an assignment
    to ->scfc_out to suppress knock-on warnings. These knock-on warnings
    could otherwise cause the user to think that there was a memory-ordering
    problem in smp_call_function() instead of a bug in scftorture.c itself.

    Signed-off-by: Paul E. McKenney

    Paul E. McKenney
     
  • The sparse tool complains as follows

    kernel/scftorture.c:124:1: warning:
    symbol '__pcpu_scope_scf_torture_rand' was not declared. Should it be static?

    And this per-CPU variable is not used outside of scftorture.c,
    so this commit marks it static.

    Reported-by: Hulk Robot
    Signed-off-by: Wei Yongjun
    Signed-off-by: Paul E. McKenney

    Wei Yongjun
     
  • Detecting smp_call_function() memory misordering requires close timing,
    so it is necessary to have the checks immediately before and after
    the call to the smp_call_function*() function under test. This commit
    therefore inserts barrier() calls to prevent the compiler from optimizing
    memory-misordering detection down into the zone of extreme improbability.

    Signed-off-by: Paul E. McKenney

    Paul E. McKenney
     
  • This commit prints error counts on the statistics line and also adds a
    "!!!" if any of the counters are non-zero. Allocation failures are
    (somewhat) forgiven, but all other errors result in a "FAILURE" print
    at the end of the test.

    Signed-off-by: Paul E. McKenney

    Paul E. McKenney
     
  • This commit hoists much of the initialization of the scf_check
    structure out of the switch statement, thus saving a few lines of code.
    The initialization of the ->scfc_in field remains in each leg of the
    switch statement in order to more heavily stress memory ordering.

    Signed-off-by: Paul E. McKenney

    Paul E. McKenney
     
  • This commit moves checking of the ->scfc_out field and the freeing of
    the scf_check structure down below the end of switch statement, thus
    saving a few lines of code.

    Signed-off-by: Paul E. McKenney

    Paul E. McKenney
     
  • This commit adds checks for memory misordering across calls to and
    returns from smp_call_function() in the case where the caller waits.
    Misordering results in a splat.

    Note that in contrast to smp_call_function_single(), this code does not
    test memory ordering into the handler in the no-wait case because none
    of the handlers would be able to free the scf_check structure without
    introducing heavy synchronization to work out which was last.

    [ paulmck: s/GFP_KERNEL/GFP_ATOMIC/ per kernel test robot feedback. ]
    Signed-off-by: Paul E. McKenney

    Paul E. McKenney
     
  • This commit adds checks for memory misordering across calls to and
    returns from smp_call_function_many() in the case where the caller waits.
    Misordering results in a splat.

    Note that in contrast to smp_call_function_single(), this code does not
    test memory ordering into the handler in the no-wait case because none
    of the handlers would be able to free the scf_check structure without
    introducing heavy synchronization to work out which was last.

    [ paulmck: s/GFP_KERNEL/GFP_ATOMIC/ per kernel test robot feedback. ]
    Signed-off-by: Paul E. McKenney

    Paul E. McKenney
     
  • This commit adds checks for memory misordering across calls to
    smp_call_function_single() and also across returns in the case where
    the caller waits. Misordering results in a splat.

    [ paulmck: s/GFP_KERNEL/GFP_ATOMIC/ per kernel test robot feedback. ]
    Signed-off-by: Paul E. McKenney

    Paul E. McKenney
     
  • This commit summarizes the per-thread statistics, providing counts of
    the number of single, many, and all calls, both no-wait and wait, and,
    for the single case, the number where the target CPU was offline.

    Signed-off-by: Paul E. McKenney

    Paul E. McKenney
     
  • This commit uses the scftorture.weight* kernel parameters to randomly
    chooses between smp_call_function_single(), smp_call_function_many(),
    and smp_call_function(). For each variant, it also randomly chooses
    whether to invoke it synchronously (wait=1) or asynchronously (wait=0).
    The percentage weighting for each option are dumped to the console log
    (search for "scf_sel_dump").

    This accumulates statistics, which a later commit will dump out at the
    end of the run.

    Signed-off-by: Paul E. McKenney

    Paul E. McKenney
     
  • This commit adds an smp_call_function() torture test that repeatedly
    invokes this function and complains if things go badly awry.

    Signed-off-by: Paul E. McKenney

    Paul E. McKenney