Skip to contentSkip to conversation

revision: POLL_OUT for ttys, serial drivers

PATCH New Sapan J . Bhatia 1 participant 1 message Apr 6, 2002 Kbuild

lore
Share & tools
lore
#0 lore raw

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 */
 };