From: Paul Fulghum <paulkf@microgate.com>
To: Andrew Morton <akpm@osdl.org>
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>,
Linux Kernel Mailing List <linux-kernel@vger.kernel.org>
Subject: [PATCH] remove TTY_DONT_FLIP
Date: Fri, 23 Jun 2006 09:51:30 -0500 [thread overview]
Message-ID: <1151074290.3650.16.camel@amdx2.microgate.com> (raw)
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: Paul Fulghum <paulkf@microgate.com>
--- a/include/linux/tty.h 2006-06-22 10:56:12.000000000 -0500
+++ b/include/linux/tty.h 2006-06-22 12:10:10.000000000 -0500
@@ -260,7 +260,6 @@ struct tty_struct {
#define TTY_DO_WRITE_WAKEUP 5 /* Call write_wakeup after queuing new */
#define TTY_PUSH 6 /* n_tty private */
#define TTY_CLOSING 7 /* ->close() in progress */
-#define TTY_DONT_FLIP 8 /* Defer buffer flip */
#define TTY_LDISC 9 /* Line discipline attached */
#define TTY_HW_COOK_OUT 14 /* Hardware can do output cooking */
#define TTY_HW_COOK_IN 15 /* Hardware can do input cooking */
--- a/drivers/char/n_tty.c 2006-06-17 20:49:35.000000000 -0500
+++ b/drivers/char/n_tty.c 2006-06-22 12:06:02.000000000 -0500
@@ -1132,7 +1132,7 @@ static inline int input_available_p(stru
* 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 @@ do_it_again:
}
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 @@ do_it_again:
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 @@ do_it_again:
if (time)
timeout = time;
}
- clear_bit(TTY_DONT_FLIP, &tty->flags);
mutex_unlock(&tty->atomic_read_lock);
remove_wait_queue(&tty->read_wait, &wait);
--- a/drivers/char/tty_io.c 2006-06-22 10:56:12.000000000 -0500
+++ b/drivers/char/tty_io.c 2006-06-22 12:13:14.000000000 -0500
@@ -784,11 +784,8 @@ restart:
}
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 * fi
* 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);
/*
@@ -2785,13 +2781,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) {
@@ -2810,7 +2799,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);
}
--- a/drivers/char/pty.c 2006-06-17 20:49:35.000000000 -0500
+++ b/drivers/char/pty.c 2006-06-22 12:14:10.000000000 -0500
@@ -101,7 +101,7 @@ static void pty_unthrottle(struct tty_st
*
* 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)
{
--- a/drivers/char/mxser.c 2006-06-17 20:49:35.000000000 -0500
+++ b/drivers/char/mxser.c 2006-06-22 12:15:06.000000000 -0500
@@ -953,7 +953,6 @@ static int mxser_open(struct tty_struct
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);
//mxser_check_modem_status(info, status);
--- a/drivers/serial/crisv10.c 2006-06-17 20:49:35.000000000 -0500
+++ b/drivers/serial/crisv10.c 2006-06-22 12:17:12.000000000 -0500
@@ -2573,12 +2573,6 @@ static void flush_to_flip_buffer(struct
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));
--- a/drivers/serial/jsm/jsm_tty.c 2006-06-17 20:49:35.000000000 -0500
+++ b/drivers/serial/jsm/jsm_tty.c 2006-06-22 12:19:14.000000000 -0500
@@ -589,13 +589,6 @@ void jsm_input(struct jsm_channel *ch)
ld = tty_ldisc_ref(tp);
/*
- * If the DONT_FLIP flag is on, don't flush our buffer, and act
- * like the ld doesn't have any space to put the data right now.
- */
- if (test_bit(TTY_DONT_FLIP, &tp->flags))
- len = 0;
-
- /*
* If we were unable to get a reference to the ld,
* don't flush our buffer, and act like the ld doesn't
* have any space to put the data right now.
--- a/drivers/usb/serial/ir-usb.c 2006-06-17 20:49:35.000000000 -0500
+++ b/drivers/usb/serial/ir-usb.c 2006-06-22 12:20:51.000000000 -0500
@@ -453,8 +453,7 @@ static void ir_read_bulk_callback (struc
tty = port->tty;
/*
- * FIXME: must not do this in IRQ context,
- * must honour TTY_DONT_FLIP
+ * FIXME: must not do this in IRQ context
*/
tty->ldisc.receive_buf(
tty,
--- a/net/bluetooth/rfcomm/tty.c 2006-06-17 20:49:35.000000000 -0500
+++ b/net/bluetooth/rfcomm/tty.c 2006-06-22 12:24:30.000000000 -0500
@@ -480,12 +480,8 @@ static void rfcomm_dev_data_ready(struct
BT_DBG("dlc %p tty %p len %d", dlc, tty, skb->len);
- if (test_bit(TTY_DONT_FLIP, &tty->flags)) {
- tty_buffer_request_room(tty, skb->len);
- tty_insert_flip_string(tty, skb->data, skb->len);
- tty_flip_buffer_push(tty);
- } else
- tty->ldisc.receive_buf(tty, skb->data, NULL, skb->len);
+ tty_insert_flip_string(tty, skb->data, skb->len);
+ tty_flip_buffer_push(tty);
kfree_skb(skb);
}
reply other threads:[~2006-06-23 14:51 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1151074290.3650.16.camel@amdx2.microgate.com \
--to=paulkf@microgate.com \
--cc=akpm@osdl.org \
--cc=alan@lxorguk.ukuu.org.uk \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.