Commit ff8cb0fd6f195389aefe55d5dac9927d09a9de54
Committed by
Linus Torvalds
1 parent
eff6937a46
tty: N_TTY SIGIO only works for read
The N_TTY ldisc layer does not send SIGIO POLL_OUTs correctly when output is possible due to flawed handling of the TTY_DO_WRITE_WAKEUP bit. It will either send no SIGIOs at all or on every tty wakeup. The fix is to set the bit when the tty driver write would block and test and clear it on write wakeup. [Merged with existing N_TTY patches and a small buglet fixed -- Alan] Signed-off-by: Thomas Pfaff <tpfaff@pcs.com> Signed-off-by: Alan Cox <alan@redhat.com> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Showing 1 changed file with 3 additions and 3 deletions Side-by-side Diff
drivers/char/n_tty.c
... | ... | @@ -1352,10 +1352,8 @@ |
1352 | 1352 | /* Write out any echoed characters that are still pending */ |
1353 | 1353 | process_echoes(tty); |
1354 | 1354 | |
1355 | - if (tty->fasync) { | |
1356 | - set_bit(TTY_DO_WRITE_WAKEUP, &tty->flags); | |
1355 | + if (tty->fasync && test_and_clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags)) | |
1357 | 1356 | kill_fasync(&tty->fasync, SIGIO, POLL_OUT); |
1358 | - } | |
1359 | 1357 | } |
1360 | 1358 | |
1361 | 1359 | /** |
... | ... | @@ -2014,6 +2012,8 @@ |
2014 | 2012 | break_out: |
2015 | 2013 | __set_current_state(TASK_RUNNING); |
2016 | 2014 | remove_wait_queue(&tty->write_wait, &wait); |
2015 | + if (b - buf != nr && tty->fasync) | |
2016 | + set_bit(TTY_DO_WRITE_WAKEUP, &tty->flags); | |
2017 | 2017 | return (b - buf) ? b - buf : retval; |
2018 | 2018 | } |
2019 | 2019 |