Commit ff8cb0fd6f195389aefe55d5dac9927d09a9de54

Authored by Thomas Pfaff
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