POLL_OUT in ttys, misc bug fix
PATCH 1/1 POLL_OUT in ttys, misc bug fix
Hello,
While fixing a flow control bug that truncated output to a terminal in User Mode Linux, I noticed that the tty drivers only send POLL_IN on new data being available but not POLL_OUT when the device is ready for new data.
This patch fixes the bug in the line discipline and the pty driver.
Also, there's another minor bug in n_tty.c where write_chan returns on a (retvalue < 0) unconditionally. This is a problem, since the type of IO (BLOCKING / NON_BLOCKING) is stored in the tty, and if the console driver returns a -EAGAIN (eg. in UML on getting an EAGAIN from the host kernel), write_chan returns even in the case of a blocking write, which is wrong since the process doesn't expect it.
Regards,
Sapan
usr/src/linux-2.4.18/drivers/char/pty.c renamed from tmp/work/linux/drivers/char/pty.c +6 -0
@@ -5,6 +5,10 @@* * Added support for a Unix98-style ptmx device. * -- C. Scott Ananian <[email protected]>, 14-Jan-1998 +* Added TTY_DO_WRITE_WAKEUP to enable n_tty to send POLL_OUT to +* waiting writers -- Sapan Bhatia <[email protected]> +* +* */ #include <linux/config.h>
@@ -331,6 +335,8 @@clear_bit (TTY_OTHER_CLOSED , &tty->link->flags);wake_up_interruptible (&pty->open_wait);set_bit (TTY_THROTTLED , &tty->flags); +set_bit (TTY_DO_WRITE_WAKEUP , &tty->flags); +/* Register a slave for the master */ if (tty->driver.major ==PTY_MASTER_MAJOR ) tty_register_devfs(&tty->link->driver,
usr/src/linux-2.4.18/drivers/char/n_tty.c renamed from tmp/work/linux/drivers/char/n_tty.c +25 -2
@@ -23,6 +23,13 @@* 2000/01/20 Fixed SMP locking on put_tty_queue using bits of * the patch by Andrew J. Kroll <[email protected]> * who actually finally proved there really was a race. +* +* 2002/03/18 Implemented n_tty_wakeup to send SIGIO POLL_OUTs to +* waiting writing processes-Sapan Bhatia <[email protected]> +* +* 2002/03/19 Fixed write_chan to stay put if console driver returns +* EAGAIN and not return since it returns an EAGAIN in a +* non-blocking operation-Sapan Bhatia <[email protected]> */ #include <linux/types.h>
@@ -711,6 +718,22 @@return 0 ; } +/* +* Required for the ptys, serial driver etc. since processes +* that attach themselves to the master and rely on ASYNC +* IO must be woken up +*/ + +static void n_tty_write_wakeup (struct tty_struct *tty) +{ +if (tty->fasync) + { +set_bit (TTY_DO_WRITE_WAKEUP , &tty->flags); +kill_fasync (&tty->fasync,SIGIO ,POLL_OUT ); + } +return ; +} +static void n_tty_receive_buf (struct tty_struct *tty,const unsigned char *cp,char *fp,int count) {
@@ -1156,7 +1179,7 @@if (O_OPOST (tty) && !(test_bit (TTY_HW_COOK_OUT , &tty->flags))) {while (nr >0 ) {ssize_t num =opost_block (tty, b, nr); -if (num <0 ) { +if (num <0 && num != -EAGAIN ) { retval = num; goto break_out; }
@@ -1236,6 +1259,6 @@ normal_poll,/* poll */ n_tty_receive_buf,/* receive_buf */ n_tty_receive_room,/* receive_room */ - 0 /* write_wakeup */ + n_tty_write_wakeup /* write_wakeup */ };
Sapan,
Have you actually tested the SIGIO POLL_OUT changes with an userspace app?
Thanks
Quoted 20 lines · Sapan J . Bhatia
Hello,
While fixing a flow control bug that truncated output to a terminal in User Mode Linux, I noticed that the tty drivers only send
POLL_INon new data being available but notPOLL_OUTwhen the device is ready for new data.This patch fixes the bug in the line discipline and the pty driver.
Also, there's another minor bug in
n_tty.cwherewrite_chanreturns on a (retvalue < 0) unconditionally. This is a problem, since the type of IO (BLOCKING /NON_BLOCKING) is stored in the tty, and if the console driver returns a-EAGAIN(eg. in UML on getting an EAGAIN from the host kernel),write_chanreturns even in the case of a blocking write, which is wrong since the process doesn't expect it.Regards,
Sapan