• Thomas Gleixner's avatar
    rcu: Yield simpler · 5d01bbd1
    Thomas Gleixner authored
    The rcu_yield() code is amazing. It's there to avoid starvation of the
    system when lots of (boosting) work is to be done.
    
    Now looking at the code it's functionality is:
    
     Make the thread SCHED_OTHER and very nice, i.e. get it out of the way
     Arm a timer with 2 ticks
     schedule()
    
    Now if the system goes idle the rcu task returns, regains SCHED_FIFO
    and plugs on. If the systems stays busy the timer fires and wakes a
    per node kthread which in turn makes the per cpu thread SCHED_FIFO and
    brings it back on the cpu. For the boosting thread the "make it FIFO"
    bit is missing and it just runs some magic boost checks. Now this is a
    lot of code with extra threads and complexity.
    
    It's way simpler to let the tasks when they detect overload schedule
    away for 2 ticks and defer the normal wakeup as long as they are in
    yielded state and the cpu is not idle.
    
    That solves the same problem and the only difference is that when the
    cpu goes idle it's not guaranteed that the thread returns right away,
    but it won't be longer out than two ticks, so no harm is done. If
    that's an issue than it is way simpler just to wake the task from
    idle as RCU has callbacks there anyway.
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Srivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com>
    Cc: Rusty Russell <rusty@rustcorp.com.au>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Reviewed-by: default avatarPaul E. McKenney <paulmck@linux.vnet.ibm.com>
    Link: http://lkml.kernel.org/r/20120716103948.131256723@linutronix.deSigned-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    5d01bbd1
rcutree.c 88.3 KB