revision: POLL_OUT for ttys, serial drivers
PATCH 1/1 revision: POLL_OUT for ttys, serial drivers
Hi!
This revised version of the patch includes a fix for serial.c as well, since it had the same problem, and a minor change in the second fix. Please use this version instead of the previous one.
Cheers,
Sapan
usr/src/linux-2.4.18/drivers/char/serial.c renamed from tmp/work/linux/drivers/char/serial.c +5 -0
@@ -57,6 +57,10 @@* 10/00: add in optional software flow control for serial console. * Kanoj Sarcar <[email protected]> (Modified by Theodore Ts'o) * +* 4/02: added TTY_DO_WRITE_WAKEUP to enable n_tty to send POLL_OUTS +* to waiting processes +* Sapan Bhatia <[email protected]> +* */ static char *serial_version ="5.05c" ;
@@ -3233,6 +3237,7 @@#ifdef SERIAL_DEBUG_OPEN printk ("rs_open ttys%d successful..." , info->line);#endif +set_bit (TTY_DO_WRITE_WAKEUP , &tty->flags);return 0 ; }
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 +24 -1
@@ -23,6 +23,11 @@* 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]>. +* Also fixed a bug in BLOCKING mode where write_chan returns +* EAGAIN */ #include <linux/types.h>
@@ -711,6 +716,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) {
@@ -1157,6 +1178,8 @@while (nr >0 ) {ssize_t num =opost_block (tty, b, nr);if (num <0 ) { +if (num == -EAGAIN ) +break ; 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 */ };