• Sebastian Andrzej Siewior's avatar
    smp: Make softirq handling RT safe in flush_smp_call_function_queue() · 1a90bfd2
    Sebastian Andrzej Siewior authored
    flush_smp_call_function_queue() invokes do_softirq() which is not available
    on PREEMPT_RT. flush_smp_call_function_queue() is invoked from the idle
    task and the migration task with preemption or interrupts disabled.
    
    So RT kernels cannot process soft interrupts in that context as that has to
    acquire 'sleeping spinlocks' which is not possible with preemption or
    interrupts disabled and forbidden from the idle task anyway.
    
    The currently known SMP function call which raises a soft interrupt is in
    the block layer, but this functionality is not enabled on RT kernels due to
    latency and performance reasons.
    
    RT could wake up ksoftirqd unconditionally, but this wants to be avoided if
    there were soft interrupts pending already when this is invoked in the
    context of the migration task. The migration task might have preempted a
    threaded interrupt handler which raised a soft interrupt, but did not reach
    the local_bh_enable() to process it. The "running" ksoftirqd might prevent
    the handling in the interrupt thread context which is causing latency
    issues.
    
    Add a new function which handles this case explicitely for RT and falls
    back to do_softirq() on !RT kernels. In the RT case this warns when one of
    the flushed SMP function calls raised a soft interrupt so this can be
    investigated.
    
    [ tglx: Moved the RT part out of SMP code ]
    Signed-off-by: default avatarSebastian Andrzej Siewior <bigeasy@linutronix.de>
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Acked-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Link: https://lore.kernel.org/r/YgKgL6aPj8aBES6G@linutronix.de
    Link: https://lore.kernel.org/r/20220413133024.356509586@linutronix.de
    1a90bfd2
softirq.c 24.1 KB