Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 817d6d3b authored by Paul Fulghum's avatar Paul Fulghum Committed by Linus Torvalds
Browse files

[PATCH] remove TTY_DONT_FLIP



Remove TTY_DONT_FLIP tty flag.  This flag was introduced in 2.1.X kernels
to prevent the N_TTY line discipline functions read_chan() and
n_tty_receive_buf() from running at the same time.  2.2.15 introduced
tty->read_lock to protect access to the N_TTY read buffer, which is the
only state requiring protection between these two functions.

The current TTY_DONT_FLIP implementation is broken for SMP, and is not
universally honored by drivers that send data directly to the line
discipline receive_buf function.

Because TTY_DONT_FLIP is not necessary, is broken in implementation, and is
not universally honored, it is removed.

Signed-off-by: default avatarPaul Fulghum <paulkf@microgate.com>
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
Cc: Theodore Ts'o <tytso@mit.edu>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent e0ac4761
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -996,7 +996,6 @@ static int mxser_open(struct tty_struct *tty, struct file *filp)

	info->session = current->signal->session;
	info->pgrp = process_group(current);
	clear_bit(TTY_DONT_FLIP, &tty->flags);

	/*
	status = mxser_get_msr(info->base, 0, info->port);
+1 −5
Original line number Diff line number Diff line
@@ -1132,7 +1132,7 @@ static inline int input_available_p(struct tty_struct *tty, int amt)
 *	buffer, and once to drain the space from the (physical) beginning of
 *	the buffer to head pointer.
 *
 *	Called under the tty->atomic_read_lock sem and with TTY_DONT_FLIP set
 *	Called under the tty->atomic_read_lock sem
 *
 */
 
@@ -1271,7 +1271,6 @@ static ssize_t read_chan(struct tty_struct *tty, struct file *file,
	}

	add_wait_queue(&tty->read_wait, &wait);
	set_bit(TTY_DONT_FLIP, &tty->flags);
	while (nr) {
		/* First test for status change. */
		if (tty->packet && tty->link->ctrl_status) {
@@ -1315,9 +1314,7 @@ static ssize_t read_chan(struct tty_struct *tty, struct file *file,
				break;
			}
			n_tty_set_room(tty);
			clear_bit(TTY_DONT_FLIP, &tty->flags);
			timeout = schedule_timeout(timeout);
			set_bit(TTY_DONT_FLIP, &tty->flags);
			continue;
		}
		__set_current_state(TASK_RUNNING);
@@ -1394,7 +1391,6 @@ static ssize_t read_chan(struct tty_struct *tty, struct file *file,
		if (time)
			timeout = time;
	}
	clear_bit(TTY_DONT_FLIP, &tty->flags);
	mutex_unlock(&tty->atomic_read_lock);
	remove_wait_queue(&tty->read_wait, &wait);

+1 −1
Original line number Diff line number Diff line
@@ -101,7 +101,7 @@ static void pty_unthrottle(struct tty_struct * tty)
 *
 * FIXME: Our pty_write method is called with our ldisc lock held but
 * not our partners. We can't just take the other one blindly without
 * risking deadlocks.  There is also the small matter of TTY_DONT_FLIP
 * risking deadlocks.
 */
static int pty_write(struct tty_struct * tty, const unsigned char *buf, int count)
{
+2 −13
Original line number Diff line number Diff line
@@ -784,11 +784,8 @@ static int tty_set_ldisc(struct tty_struct *tty, int ldisc)
	}

	clear_bit(TTY_LDISC, &tty->flags);
	clear_bit(TTY_DONT_FLIP, &tty->flags);
	if (o_tty) {
	if (o_tty)
		clear_bit(TTY_LDISC, &o_tty->flags);
		clear_bit(TTY_DONT_FLIP, &o_tty->flags);
	}
	spin_unlock_irqrestore(&tty_ldisc_lock, flags);

	/*
@@ -1955,7 +1952,6 @@ static void release_dev(struct file * filp)
	 * race with the set_ldisc code path.
	 */
	clear_bit(TTY_LDISC, &tty->flags);
	clear_bit(TTY_DONT_FLIP, &tty->flags);
	cancel_delayed_work(&tty->buf.work);

	/*
@@ -2784,13 +2780,6 @@ static void flush_to_ldisc(void *private_)
	if (disc == NULL)	/*  !TTY_LDISC */
		return;

	if (test_bit(TTY_DONT_FLIP, &tty->flags)) {
		/*
		 * Do it after the next timer tick:
		 */
		schedule_delayed_work(&tty->buf.work, 1);
		goto out;
	}
	spin_lock_irqsave(&tty->buf.lock, flags);
	while((tbuf = tty->buf.head) != NULL) {
		while ((count = tbuf->commit - tbuf->read) != 0) {
@@ -2809,7 +2798,7 @@ static void flush_to_ldisc(void *private_)
		tty_buffer_free(tty, tbuf);
	}
	spin_unlock_irqrestore(&tty->buf.lock, flags);
out:

	tty_ldisc_deref(disc);
}

+0 −6
Original line number Diff line number Diff line
@@ -2573,12 +2573,6 @@ static void flush_to_flip_buffer(struct e100_serial *info)

	DFLIP(
	  if (1) {

		  if (test_bit(TTY_DONT_FLIP, &tty->flags)) {
			  DEBUG_LOG(info->line, "*** TTY_DONT_FLIP set flip.count %i ***\n", tty->flip.count);
			  DEBUG_LOG(info->line, "*** recv_cnt %i\n", info->recv_cnt);
		  } else {
		  }
		  DEBUG_LOG(info->line, "*** rxtot %i\n", info->icount.rx);
		  DEBUG_LOG(info->line, "ldisc %lu\n", tty->ldisc.chars_in_buffer(tty));
		  DEBUG_LOG(info->line, "room  %lu\n", tty->ldisc.receive_room(tty));
Loading