• S
    sched: add cond_resched_rcu() helper · f6f3c437
    Simon Horman 提交于
    This is intended for use in loops which read data protected by RCU and may
    have a large number of iterations.  Such an example is dumping the list of
    connections known to IPVS: ip_vs_conn_array() and ip_vs_conn_seq_next().
    
    The benefits are for CONFIG_PREEMPT_RCU=y where we save CPU cycles
    by moving rcu_read_lock and rcu_read_unlock out of large loops
    but still allowing the current task to be preempted after every
    loop iteration for the CONFIG_PREEMPT_RCU=n case.
    
    The call to cond_resched() is not needed when CONFIG_PREEMPT_RCU=y.
    Thanks to Paul E. McKenney for explaining this and for the
    final version that checks the context with CONFIG_DEBUG_ATOMIC_SLEEP=y
    for all possible configurations.
    
    The function can be empty in the CONFIG_PREEMPT_RCU case,
    rcu_read_lock and rcu_read_unlock are not needed in this case
    because the task can be preempted on indication from scheduler.
    Thanks to Peter Zijlstra for catching this and for his help
    in trying a solution that changes __might_sleep.
    
    Initial cond_resched_rcu_lock() function suggested by Eric Dumazet.
    Tested-by: NJulian Anastasov <ja@ssi.bg>
    Signed-off-by: NJulian Anastasov <ja@ssi.bg>
    Signed-off-by: NSimon Horman <horms@verge.net.au>
    Acked-by: NPeter Zijlstra <peterz@infradead.org>
    Signed-off-by: NPablo Neira Ayuso <pablo@netfilter.org>
    f6f3c437
sched.h 75.6 KB