The new patch seems to work fine, after limited testing. Thanks. On Tue, 03 Nov 2020 15:45:26 -0500, Samuel Thibault wrote: > > [1 <text/plain; us-ascii (7bit)>] > John Covici, le mar. 03 nov. 2020 14:21:10 -0500, a ecrit: > > I am sorry to report that your patch does not work, probably because > > it references drivers/accessibility rather than staging. If that is > > the case, I could change it and try again, or let me know. > > Ah, yes, sorry, that should rather be staging, here is a fixed patch. > > Samuel > [2 speakup_in_nowait <text/plain; us-ascii (7bit)>] > speakup ttyio: Do not schedule() in ttyio_in_nowait > > 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@xxxxxxxxxxxxxxx > Signed-off-by: Samuel Thibault <samuel.thibault@xxxxxxxxxxxx> > Reported-by: John Covici <covici@xxxxxxxxxxxxxx> > TODO Tested-by: John Covici <covici@xxxxxxxxxxxxxx> > > --- > drivers/staging/speakup/spk_ttyio.c | 10 ++++++---- > 1 file changed, 6 insertions(+), 4 deletions(-) > > --- a/drivers/staging/speakup/spk_ttyio.c > +++ b/drivers/staging/speakup/spk_ttyio.c > @@ -298,11 +298,13 @@ static unsigned char ttyio_in(int timeou > struct spk_ldisc_data *ldisc_data = speakup_tty->disc_data; > char rv; > > - if (wait_for_completion_timeout(&ldisc_data->completion, > + if (!timeout) { > + if (!try_wait_for_completion(&ldisc_data->completion)) > + return 0xff; > + } else if (wait_for_completion_timeout(&ldisc_data->completion, > usecs_to_jiffies(timeout)) == 0) { > - if (timeout) > - pr_warn("spk_ttyio: timeout (%d) while waiting for input\n", > - timeout); > + pr_warn("spk_ttyio: timeout (%d) while waiting for input\n", > + timeout); > return 0xff; > } > -- Your life is like a penny. You're going to lose it. The question is: How do you spend it? John Covici wb2una covici@xxxxxxxxxxxxxx _______________________________________________ Speakup mailing list Speakup@xxxxxxxxxxxxxxxxx http://linux-speakup.org/cgi-bin/mailman/listinfo/speakup