• S
    speakup ttyio: Do not schedule() in ttyio_in_nowait · 3ed1cfb2
    Samuel Thibault 提交于
    With the ltlk and spkout drivers, the index read function, i.e.
    in_nowait, is getting called from the read_all_doc mechanism, from
    the timer softirq:
    
    Call Trace:
     <IRQ>
     dump_stack+0x71/0x98
     dequeue_task_idle+0x1f/0x28
     __schedule+0x167/0x5d6
     ? trace_hardirqs_on+0x2e/0x3a
     ? usleep_range+0x7f/0x7f
     schedule+0x8a/0xae
     schedule_timeout+0xb1/0xea
     ? del_timer_sync+0x31/0x31
     do_wait_for_common+0xba/0x12b
     ? wake_up_q+0x45/0x45
     wait_for_common+0x37/0x50
     ttyio_in+0x2a/0x6b
     spk_ttyio_in_nowait+0xc/0x13
     spk_get_index_count+0x20/0x93
     cursor_done+0x1c6/0x4c6
     ? read_all_doc+0xb1/0xb1
     call_timer_fn+0x89/0x140
     run_timer_softirq+0x164/0x1a5
     ? read_all_doc+0xb1/0xb1
     ? hrtimer_forward+0x7b/0x87
     ? timerqueue_add+0x62/0x68
     ? enqueue_hrtimer+0x95/0x9f
     __do_softirq+0x181/0x31f
     irq_exit+0x6a/0x86
    smp_apic_timer_interrupt+0x15e/0x183
     apic_timer_interrupt+0xf/0x20
     </IRQ>
    
    We thus should not schedule() at all, even with timeout == 0, this
    crashes the kernel.  We can however use try_wait_for_completion()
    instead of wait_for_completion_timeout(0).
    
    Cc: stable@vger.kernel.org
    Reported-by: NJohn Covici <covici@ccs.covici.com>
    Tested-by: NJohn Covici <covici@ccs.covici.com>
    Signed-off-by: NSamuel Thibault <samuel.thibault@ens-lyon.org>
    Link: https://lore.kernel.org/r/20201108131233.tadycr73sxlvodgo@functionSigned-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    3ed1cfb2
spk_ttyio.c 9.0 KB