Skip to content
  • Paul E. McKenney's avatar
    srcu: Expedite first synchronize_srcu() when idle · 2da4b2a7
    Paul E. McKenney authored
    
    
    Classic SRCU in effect expedites the first synchronize_srcu() when SRCU
    is idle, and Mike Galbraith demonstrated that some use cases do in fact
    rely on this behavior.  In particular, Mike showed that Steven Rostedt's
    hotplug stress script takes 55 seconds with Classic SRCU and more than
    16 -minutes- when running Tree SRCU.  Assuming that each Tree SRCU's call
    to synchronize_srcu() takes four milliseconds, this implies that Steven's
    test invokes synchronize_srcu() in isolation, but more than once per
    200 microseconds.  Mike used ftrace to demonstrate that the time between
    successive calls to synchronize_srcu() ranged from 118 to 342 microseconds,
    with one outlier at 80 milliseconds.  This data clearly indicates that
    Tree SRCU needs to expedite the first invocation of synchronize_srcu()
    during an SRCU idle period.
    
    This commit therefor introduces a srcu_might_be_idle() function that
    probabilistically checks whether or not SRCU is idle.  This function is
    used by synchronize_rcu() as an additional criterion in deciding whether
    or not to expedite.
    
    (Hat trick to Peter Zijlstra for his earlier suggestion that this might
    in fact be a problem.  Which for all I know might have motivated Mike to
    look into it.)
    
    Reported-by: default avatarMike Galbraith <efault@gmx.de>
    Signed-off-by: default avatarPaul E. McKenney <paulmck@linux.vnet.ibm.com>
    Tested-by: default avatarMike Galbraith <efault@gmx.de>
    2da4b2a7