Skip to content
  • Sebastian Andrzej Siewior's avatar
    srcu: Remove srcu_queue_delayed_work_on() · 98a5d0ff
    Sebastian Andrzej Siewior authored
    
    
    srcu_queue_delayed_work_on() disables preemption (and therefore CPU
    hotplug in RCU's case) and then checks based on its own accounting if a
    CPU is online. If the CPU is online it uses queue_delayed_work_on()
    otherwise it fallbacks to queue_delayed_work().
    The problem here is that queue_work() on -RT does not work with disabled
    preemption.
    
    queue_work_on() works also on an offlined CPU. queue_delayed_work_on()
    has the problem that it is possible to program a timer on an offlined
    CPU. This timer will fire once the CPU is online again. But until then,
    the timer remains programmed and nothing will happen.
    
    Add a local timer which will fire (as requested per delay) on the local
    CPU and then enqueue the work on the specific CPU.
    
    RCUtorture testing with SRCU-P for 24h showed no problems.
    
    Signed-off-by: default avatarSebastian Andrzej Siewior <bigeasy@linutronix.de>
    Signed-off-by: default avatarPaul E. McKenney <paulmck@linux.ibm.com>
    98a5d0ff