speakup crashes with kernel 5.4.69

John Covici covici at ccs.covici.com
Sun Nov 8 06:15:46 EST 2020


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 at vger.kernel.org
> Signed-off-by: Samuel Thibault <samuel.thibault at ens-lyon.org>
> Reported-by: John Covici <covici at ccs.covici.com>
> TODO Tested-by: John Covici <covici at ccs.covici.com>
> 
> ---
>  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 at ccs.covici.com


More information about the Speakup mailing list