From: Peter Hurley <peter@hurleysoftware.com>
To: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
linux-serial@vger.kernel.org, linux-kernel@vger.kernel.org
Cc: Jiri Slaby <jslaby@suse.cz>, Peter Hurley <peter@hurleysoftware.com>
Subject: [PATCH v3 03/24] tty: Make ldisc input flow control concurrency-friendly
Date: Mon, 15 Apr 2013 11:19:07 -0400 [thread overview]
Message-ID: <1366039168-8510-4-git-send-email-peter@hurleysoftware.com> (raw)
In-Reply-To: <1366039168-8510-1-git-send-email-peter@hurleysoftware.com>
Although line discipline receiving is single-producer/single-consumer,
using tty->receive_room to manage flow control creates unnecessary
critical regions requiring additional lock use.
Instead, introduce the optional .receive_buf2() ldisc method which
returns the # of bytes actually received. Serialization is guaranteed
by the caller.
In turn, the line discipline should schedule the buffer work item
whenever space becomes available; ie., when there is room to receive
data and receive_room() previously returned 0 (the buffer work
item stops processing if receive_buf2() returns 0). Note the
'no room' state need not be atomic despite concurrent use by two
threads because only the buffer work thread can set the state and
only the read() thread can clear the state.
Add n_tty_receive_buf2() as the receive_buf2() method for N_TTY.
Provide a public helper function, tty_ldisc_receive_buf(), to use
when directly accessing the receive_buf() methods.
Line disciplines not using input flow control can continue to set
tty->receive_room to a fixed value and only provide the receive_buf()
method.
Signed-off-by: Peter Hurley <peter@hurleysoftware.com>
---
drivers/tty/n_tty.c | 72 +++++++++++++++++++++++++++++-----------------
drivers/tty/tty_buffer.c | 13 ++++++---
drivers/tty/vt/selection.c | 4 +--
include/linux/tty.h | 13 +++++++++
include/linux/tty_ldisc.h | 13 +++++++++
5 files changed, 82 insertions(+), 33 deletions(-)
diff --git a/drivers/tty/n_tty.c b/drivers/tty/n_tty.c
index 9b7f571..009518b 100644
--- a/drivers/tty/n_tty.c
+++ b/drivers/tty/n_tty.c
@@ -79,6 +79,9 @@ struct n_tty_data {
unsigned long overrun_time;
int num_overrun;
+ /* non-atomic */
+ bool no_room;
+
unsigned char lnext:1, erasing:1, raw:1, real_raw:1, icanon:1;
unsigned char echo_overrun:1;
@@ -114,25 +117,10 @@ static inline int tty_put_user(struct tty_struct *tty, unsigned char x,
return put_user(x, ptr);
}
-/**
- * n_tty_set_room - receive space
- * @tty: terminal
- *
- * Updates tty->receive_room to reflect the currently available space
- * in the input buffer, and re-schedules the flip buffer work if space
- * just became available.
- *
- * Locks: Concurrent update is protected with read_lock
- */
-
-static int set_room(struct tty_struct *tty)
+static int receive_room(struct tty_struct *tty)
{
struct n_tty_data *ldata = tty->disc_data;
int left;
- int old_left;
- unsigned long flags;
-
- raw_spin_lock_irqsave(&ldata->read_lock, flags);
if (I_PARMRK(tty)) {
/* Multiply read_cnt by 3, since each byte might take up to
@@ -150,18 +138,27 @@ static int set_room(struct tty_struct *tty)
*/
if (left <= 0)
left = ldata->icanon && !ldata->canon_data;
- old_left = tty->receive_room;
- tty->receive_room = left;
- raw_spin_unlock_irqrestore(&ldata->read_lock, flags);
-
- return left && !old_left;
+ return left;
}
+/**
+ * n_tty_set_room - receive space
+ * @tty: terminal
+ *
+ * Re-schedules the flip buffer work if space just became available.
+ *
+ * Locks: Concurrent update is protected with read_lock
+ */
+
static void n_tty_set_room(struct tty_struct *tty)
{
+ struct n_tty_data *ldata = tty->disc_data;
+
/* Did this open up the receive buffer? We may need to flip */
- if (set_room(tty)) {
+ if (unlikely(ldata->no_room) && receive_room(tty)) {
+ ldata->no_room = 0;
+
WARN_RATELIMIT(tty->port->itty == NULL,
"scheduling with invalid itty\n");
/* see if ldisc has been killed - if so, this means that
@@ -1409,8 +1406,8 @@ static void n_tty_write_wakeup(struct tty_struct *tty)
* calls one at a time and in order (or using flush_to_ldisc)
*/
-static void n_tty_receive_buf(struct tty_struct *tty, const unsigned char *cp,
- char *fp, int count)
+static void __receive_buf(struct tty_struct *tty, const unsigned char *cp,
+ char *fp, int count)
{
struct n_tty_data *ldata = tty->disc_data;
const unsigned char *p;
@@ -1465,8 +1462,6 @@ static void n_tty_receive_buf(struct tty_struct *tty, const unsigned char *cp,
tty->ops->flush_chars(tty);
}
- set_room(tty);
-
if ((!ldata->icanon && (ldata->read_cnt >= ldata->minimum_to_wake)) ||
L_EXTPROC(tty)) {
kill_fasync(&tty->fasync, SIGIO, POLL_IN);
@@ -1481,7 +1476,7 @@ static void n_tty_receive_buf(struct tty_struct *tty, const unsigned char *cp,
*/
while (1) {
tty_set_flow_change(tty, TTY_THROTTLE_SAFE);
- if (tty->receive_room >= TTY_THRESHOLD_THROTTLE)
+ if (receive_room(tty) >= TTY_THRESHOLD_THROTTLE)
break;
if (!tty_throttle_safe(tty))
break;
@@ -1489,6 +1484,28 @@ static void n_tty_receive_buf(struct tty_struct *tty, const unsigned char *cp,
__tty_set_flow_change(tty, 0);
}
+static void n_tty_receive_buf(struct tty_struct *tty, const unsigned char *cp,
+ char *fp, int count)
+{
+ __receive_buf(tty, cp, fp, count);
+}
+
+static int n_tty_receive_buf2(struct tty_struct *tty, const unsigned char *cp,
+ char *fp, int count)
+{
+ struct n_tty_data *ldata = tty->disc_data;
+ int room;
+
+ tty->receive_room = room = receive_room(tty);
+ if (!room)
+ ldata->no_room = 1;
+ count = min(count, room);
+ if (count)
+ __receive_buf(tty, cp, fp, count);
+
+ return count;
+}
+
int is_ignored(int sig)
{
return (sigismember(¤t->blocked, sig) ||
@@ -2201,6 +2218,7 @@ struct tty_ldisc_ops tty_ldisc_N_TTY = {
.receive_buf = n_tty_receive_buf,
.write_wakeup = n_tty_write_wakeup,
.fasync = n_tty_fasync,
+ .receive_buf2 = n_tty_receive_buf2,
};
/**
diff --git a/drivers/tty/tty_buffer.c b/drivers/tty/tty_buffer.c
index 6c7a1d0..ff1b2e3 100644
--- a/drivers/tty/tty_buffer.c
+++ b/drivers/tty/tty_buffer.c
@@ -407,11 +407,16 @@ static int
receive_buf(struct tty_struct *tty, struct tty_buffer *head, int count)
{
struct tty_ldisc *disc = tty->ldisc;
+ char *p = head->char_buf_ptr + head->read;
+ unsigned char *f = head->flag_buf_ptr + head->read;
- count = min_t(int, count, tty->receive_room);
- if (count)
- disc->ops->receive_buf(tty, head->char_buf_ptr + head->read,
- head->flag_buf_ptr + head->read, count);
+ if (disc->ops->receive_buf2)
+ count = disc->ops->receive_buf2(tty, p, f, count);
+ else {
+ count = min_t(int, count, tty->receive_room);
+ if (count)
+ disc->ops->receive_buf(tty, p, f, count);
+ }
head->read += count;
return count;
}
diff --git a/drivers/tty/vt/selection.c b/drivers/tty/vt/selection.c
index 60b7b69..2ca8d6b 100644
--- a/drivers/tty/vt/selection.c
+++ b/drivers/tty/vt/selection.c
@@ -356,8 +356,8 @@ int paste_selection(struct tty_struct *tty)
continue;
}
count = sel_buffer_lth - pasted;
- count = min(count, tty->receive_room);
- ld->ops->receive_buf(tty, sel_buffer + pasted, NULL, count);
+ count = tty_ldisc_receive_buf(ld, sel_buffer + pasted, NULL,
+ count);
pasted += count;
}
remove_wait_queue(&vc->paste_wait, &wait);
diff --git a/include/linux/tty.h b/include/linux/tty.h
index b05fa7f..7860e52 100644
--- a/include/linux/tty.h
+++ b/include/linux/tty.h
@@ -543,6 +543,19 @@ extern void tty_ldisc_init(struct tty_struct *tty);
extern void tty_ldisc_deinit(struct tty_struct *tty);
extern void tty_ldisc_begin(void);
+static inline int tty_ldisc_receive_buf(struct tty_ldisc *ld, unsigned char *p,
+ char *f, int count)
+{
+ if (ld->ops->receive_buf2)
+ count = ld->ops->receive_buf2(ld->tty, p, f, count);
+ else {
+ count = min_t(int, count, ld->tty->receive_room);
+ if (count)
+ ld->ops->receive_buf(ld->tty, p, f, count);
+ }
+ return count;
+}
+
/* n_tty.c */
extern struct tty_ldisc_ops tty_ldisc_N_TTY;
diff --git a/include/linux/tty_ldisc.h b/include/linux/tty_ldisc.h
index 23bdd9d..f15c898 100644
--- a/include/linux/tty_ldisc.h
+++ b/include/linux/tty_ldisc.h
@@ -109,6 +109,17 @@
*
* Tells the discipline that the DCD pin has changed its status.
* Used exclusively by the N_PPS (Pulse-Per-Second) line discipline.
+ *
+ * int (*receive_buf2)(struct tty_struct *, const unsigned char *cp,
+ * char *fp, int count);
+ *
+ * This function is called by the low-level tty driver to send
+ * characters received by the hardware to the line discpline for
+ * processing. <cp> is a pointer to the buffer of input
+ * character received by the device. <fp> is a pointer to a
+ * pointer of flag bytes which indicate whether a character was
+ * received with a parity error, etc.
+ * If assigned, prefer this function for automatic flow control.
*/
#include <linux/fs.h>
@@ -195,6 +206,8 @@ struct tty_ldisc_ops {
void (*write_wakeup)(struct tty_struct *);
void (*dcd_change)(struct tty_struct *, unsigned int);
void (*fasync)(struct tty_struct *tty, int on);
+ int (*receive_buf2)(struct tty_struct *, const unsigned char *cp,
+ char *fp, int count);
struct module *owner;
--
1.8.1.2
next prev parent reply other threads:[~2013-04-15 15:20 UTC|newest]
Thread overview: 237+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-03-19 20:21 [PATCH 00/18] lockless n_tty receive path Peter Hurley
2013-03-19 20:21 ` [PATCH 01/18] tty: Don't change receive_room for ioctl(TIOCSETD) Peter Hurley
2013-03-19 20:21 ` [PATCH 02/18] tty: Make ldisc input flow control concurrency-friendly Peter Hurley
2013-03-19 20:21 ` [PATCH 03/18] tty: Simplify tty buffer/ldisc interface with helper function Peter Hurley
2013-03-19 22:42 ` Ilya Zykov
2013-03-19 23:50 ` Peter Hurley
2013-03-20 12:47 ` Ilya Zykov
2013-03-20 17:20 ` [PATCH] tty: Fix race condition if flushing tty flip buffers Peter Hurley
2013-03-20 17:56 ` Ilya Zykov
2013-04-08 18:48 ` Greg Kroah-Hartman
2013-04-08 20:03 ` Peter Hurley
2013-03-20 17:49 ` [PATCH 03/18] tty: Simplify tty buffer/ldisc interface with helper function Peter Hurley
2013-03-20 19:25 ` Ilya Zykov
2013-03-19 20:21 ` [PATCH 04/18] n_tty: Factor canonical mode copy from n_tty_read() Peter Hurley
2013-03-19 20:21 ` [PATCH 05/18] n_tty: Line copy to user buffer in canonical mode Peter Hurley
2013-03-19 20:21 ` [PATCH 06/18] n_tty: Split n_tty_chars_in_buffer() for reader-only interface Peter Hurley
2013-03-19 20:21 ` [PATCH 07/18] tty: Deprecate ldisc .chars_in_buffer() method Peter Hurley
2013-03-19 20:21 ` [PATCH 08/18] n_tty: Get read_cnt through accessor Peter Hurley
2013-03-19 20:21 ` [PATCH 09/18] n_tty: Don't wrap input buffer indices at buffer size Peter Hurley
2013-03-19 20:21 ` [PATCH 10/18] n_tty: Remove read_cnt Peter Hurley
2013-03-19 20:21 ` [PATCH 11/18] tty: Convert termios_mutex to termios_rwsem Peter Hurley
2013-03-19 20:21 ` [PATCH 12/18] n_tty: Access termios values safely Peter Hurley
2013-03-19 20:21 ` [PATCH 13/18] n_tty: Replace canon_data with index comparison Peter Hurley
2013-03-19 20:21 ` [PATCH 14/18] n_tty: Make N_TTY ldisc receive path lockless Peter Hurley
2013-03-19 20:21 ` [PATCH 15/18] n_tty: Reset lnext if canonical mode changes Peter Hurley
2013-03-19 20:21 ` [PATCH 16/18] n_tty: Fix type mismatches in receive_buf raw copy Peter Hurley
2013-03-19 20:21 ` [PATCH 17/18] n_tty: Don't wait for buffer work in read() loop Peter Hurley
2013-03-19 20:21 ` [PATCH 18/18] n_tty: Separate buffer indices to prevent cache-line sharing Peter Hurley
2013-03-27 11:43 ` [PATCH v2 00/18] lockless n_tty receive path Peter Hurley
2013-03-27 11:43 ` [PATCH v2 01/18] tty: Don't change receive_room for ioctl(TIOCSETD) Peter Hurley
2013-03-27 11:43 ` [PATCH v2 02/18] tty: Make ldisc input flow control concurrency-friendly Peter Hurley
2013-03-27 11:43 ` [PATCH v2 03/18] tty: Simplify tty buffer/ldisc interface with helper function Peter Hurley
2013-03-27 11:43 ` [PATCH v2 04/18] n_tty: Factor canonical mode copy from n_tty_read() Peter Hurley
2013-03-27 11:43 ` [PATCH v2 05/18] n_tty: Line copy to user buffer in canonical mode Peter Hurley
2013-03-27 11:43 ` [PATCH v2 06/18] n_tty: Split n_tty_chars_in_buffer() for reader-only interface Peter Hurley
2013-03-27 11:43 ` [PATCH v2 07/18] tty: Deprecate ldisc .chars_in_buffer() method Peter Hurley
2013-03-27 11:43 ` [PATCH v2 08/18] n_tty: Get read_cnt through accessor Peter Hurley
2013-03-27 11:43 ` [PATCH v2 09/18] n_tty: Don't wrap input buffer indices at buffer size Peter Hurley
2013-03-27 11:44 ` [PATCH v2 10/18] n_tty: Remove read_cnt Peter Hurley
2013-03-27 11:44 ` [PATCH v2 11/18] tty: Convert termios_mutex to termios_rwsem Peter Hurley
2013-03-27 11:44 ` [PATCH v2 12/18] n_tty: Access termios values safely Peter Hurley
2013-03-27 11:44 ` [PATCH v2 13/18] n_tty: Replace canon_data with index comparison Peter Hurley
2013-03-27 11:44 ` [PATCH v2 14/18] n_tty: Make N_TTY ldisc receive path lockless Peter Hurley
2013-03-27 11:44 ` [PATCH v2 15/18] n_tty: Reset lnext if canonical mode changes Peter Hurley
2013-03-27 11:44 ` [PATCH v2 16/18] n_tty: Fix type mismatches in receive_buf raw copy Peter Hurley
2013-03-27 11:44 ` [PATCH v2 17/18] n_tty: Don't wait for buffer work in read() loop Peter Hurley
2013-03-27 11:44 ` [PATCH v2 18/18] n_tty: Separate buffer indices to prevent cache-line sharing Peter Hurley
2013-03-27 11:46 ` [PATCH v2 00/18] lockless n_tty receive path Peter Hurley
2013-04-15 15:19 ` [PATCH v3 00/24] " Peter Hurley
2013-04-15 15:19 ` [PATCH v3 01/24] tty: Don't change receive_room for ioctl(TIOCSETD) Peter Hurley
2013-04-15 15:19 ` [PATCH v3 02/24] tty: Simplify tty buffer/ldisc interface with helper function Peter Hurley
2013-04-15 15:19 ` Peter Hurley [this message]
2013-04-15 15:19 ` [PATCH v3 04/24] n_tty: Factor canonical mode copy from n_tty_read() Peter Hurley
2013-04-15 15:19 ` [PATCH v3 05/24] n_tty: Line copy to user buffer in canonical mode Peter Hurley
2013-04-15 15:19 ` [PATCH v3 06/24] n_tty: Split n_tty_chars_in_buffer() for reader-only interface Peter Hurley
2013-04-15 15:19 ` [PATCH v3 07/24] tty: Deprecate ldisc .chars_in_buffer() method Peter Hurley
2013-04-15 15:19 ` [PATCH v3 08/24] n_tty: Get read_cnt through accessor Peter Hurley
2013-04-15 15:19 ` [PATCH v3 09/24] n_tty: Don't wrap input buffer indices at buffer size Peter Hurley
2013-04-15 15:19 ` [PATCH v3 10/24] n_tty: Remove read_cnt Peter Hurley
2013-04-15 15:19 ` [PATCH v3 11/24] tty: Convert termios_mutex to termios_rwsem Peter Hurley
2013-04-15 15:19 ` [PATCH v3 12/24] n_tty: Access termios values safely Peter Hurley
2013-04-15 15:19 ` [PATCH v3 13/24] n_tty: Replace canon_data with index comparison Peter Hurley
2013-04-15 15:19 ` [PATCH v3 14/24] n_tty: Make N_TTY ldisc receive path lockless Peter Hurley
2013-04-15 15:19 ` [PATCH v3 15/24] n_tty: Reset lnext if canonical mode changes Peter Hurley
2013-04-15 15:19 ` [PATCH v3 16/24] n_tty: Fix type mismatches in receive_buf raw copy Peter Hurley
2013-04-15 15:19 ` [PATCH v3 17/24] n_tty: Don't wait for buffer work in read() loop Peter Hurley
2013-04-15 15:19 ` [PATCH v3 18/24] n_tty: Separate buffer indices to prevent cache-line sharing Peter Hurley
2013-04-15 15:19 ` [PATCH v3 19/24] tty: Only guarantee termios read safety for throttle/unthrottle Peter Hurley
2013-04-15 15:19 ` [PATCH v3 20/24] n_tty: Move chars_in_buffer() to factor throttle/unthrottle Peter Hurley
2013-04-15 15:19 ` [PATCH v3 21/24] n_tty: Factor throttle/unthrottle into helper functions Peter Hurley
2013-04-15 15:19 ` [PATCH v3 22/24] n_tty: Move n_tty_write_wakeup() to avoid forward declaration Peter Hurley
2013-04-15 15:19 ` [PATCH v3 23/24] n_tty: Special case pty flow control Peter Hurley
2013-04-15 15:19 ` [PATCH v3 24/24] n_tty: Queue buffer work on any available cpu Peter Hurley
2013-04-15 15:25 ` [PATCH 00/16] lockless tty flip buffers Peter Hurley
2013-04-15 15:25 ` [PATCH 01/16] tty: Compute flip buffer ptrs Peter Hurley
2013-04-15 15:25 ` [PATCH 02/16] tty: Fix flip buffer free list Peter Hurley
2013-04-15 15:25 ` [PATCH 03/16] tty: Factor flip buffer initialization into helper function Peter Hurley
2013-04-15 15:25 ` [PATCH 04/16] tty: Merge tty_buffer_find() into tty_buffer_alloc() Peter Hurley
2013-04-15 15:25 ` [PATCH 05/16] tty: Use generic names for flip buffer list cursors Peter Hurley
2013-04-15 15:25 ` [PATCH 06/16] tty: Use lockless flip buffer free list Peter Hurley
2013-04-15 15:25 ` [PATCH 07/16] tty: Simplify flip buffer list with 0-sized sentinel Peter Hurley
2013-04-15 15:25 ` [PATCH 08/16] tty: Track flip buffer memory limit atomically Peter Hurley
2013-04-15 15:26 ` [PATCH 09/16] tty: Make driver-side flip buffers lockless Peter Hurley
2013-04-15 15:26 ` [PATCH 10/16] tty: Ensure single-threaded flip buffer consumer with mutex Peter Hurley
2013-04-15 15:26 ` [PATCH 11/16] tty: Only perform flip buffer flush from tty_buffer_flush() Peter Hurley
2013-04-15 15:26 ` [PATCH 12/16] tty: Avoid false-sharing flip buffer ptrs Peter Hurley
2013-04-15 15:26 ` [PATCH 13/16] tty: Use non-atomic state to signal flip buffer flush pending Peter Hurley
2013-04-15 15:26 ` [PATCH 14/16] tty: Merge __tty_flush_buffer() into lone call site Peter Hurley
2013-04-15 15:26 ` [PATCH 15/16] tty: Fix unsafe vt paste_selection() Peter Hurley
2013-04-15 15:26 ` [PATCH 16/16] tty: Remove private constant from global namespace Peter Hurley
2013-04-15 15:29 ` [PATCH 0/9] mostly lockless tty echo Peter Hurley
2013-04-15 15:29 ` [PATCH 1/9] n_tty: Remove unused echo_overrun field Peter Hurley
2013-04-15 15:29 ` [PATCH 2/9] n_tty: Use separate head and tail indices for echo_buf Peter Hurley
2013-04-15 15:29 ` [PATCH 3/9] n_tty: Replace echo_cnt with computed value Peter Hurley
2013-04-15 15:29 ` [PATCH 4/9] n_tty: Remove echo_lock Peter Hurley
2013-04-15 15:29 ` [PATCH 5/9] n_tty: Eliminate echo_commit memory barrier Peter Hurley
2013-04-15 15:29 ` [PATCH 6/9] n_tty: Process echoes in blocks Peter Hurley
2013-04-15 15:29 ` [PATCH 7/9] n_tty: Only flush echo output if actually output Peter Hurley
2013-04-15 15:29 ` [PATCH 8/9] n_tty: Eliminate counter in __process_echoes Peter Hurley
2013-04-15 15:29 ` [PATCH 9/9] n_tty: Avoid false-sharing echo buffer indices Peter Hurley
2013-04-15 15:32 ` [PATCH 00/20] streamline per-char receiving Peter Hurley
2013-04-15 15:32 ` [PATCH 01/20] n_tty: Fix EOF push handling Peter Hurley
2013-04-15 15:32 ` [PATCH 02/20] n_tty: Remove alias ptrs in __receive_buf() Peter Hurley
2013-04-15 15:32 ` [PATCH 03/20] n_tty: Move buffers into n_tty_data Peter Hurley
2013-04-15 15:32 ` [PATCH 04/20] n_tty: Rename process_char_map to char_map Peter Hurley
2013-04-15 15:32 ` [PATCH 05/20] n_tty: Simplify __receive_buf loop count Peter Hurley
2013-04-15 15:32 ` [PATCH 06/20] n_tty: Factor 'real raw' receive_buf into standalone fn Peter Hurley
2013-04-15 15:32 ` [PATCH 07/20] n_tty: Factor signal char handling into separate fn Peter Hurley
2013-04-15 15:32 ` [PATCH 08/20] n_tty: Factor flagged " Peter Hurley
2013-04-15 15:32 ` [PATCH 09/20] n_tty: Factor raw mode receive_buf() " Peter Hurley
2013-04-15 15:32 ` [PATCH 10/20] n_tty: Special case EXTPROC receive_buf() as raw mode Peter Hurley
2013-04-15 15:32 ` [PATCH 11/20] n_tty: Factor tty->closing receive_buf() into separate fn Peter Hurley
2013-04-15 15:32 ` [PATCH 12/20] n_tty: Factor standard per-char i/o " Peter Hurley
2013-04-15 15:32 ` [PATCH 13/20] n_tty: Eliminate char tests from IXANY restart test Peter Hurley
2013-04-15 15:32 ` [PATCH 14/20] n_tty: Split n_tty_receive_char() Peter Hurley
2013-04-15 15:32 ` [PATCH 15/20] n_tty: Factor ISTRIP and IUCLC receive_buf into separate fn Peter Hurley
2013-04-15 15:32 ` [PATCH 16/20] n_tty: Factor PARMRK from normal per-char i/o Peter Hurley
2013-04-15 15:32 ` [PATCH 17/20] n_tty: Remove overflow tests from receive_buf() path Peter Hurley
2013-04-15 15:32 ` [PATCH 18/20] n_tty: Un-inline single-use functions Peter Hurley
2013-04-15 15:32 ` [PATCH 19/20] n_tty: Factor LNEXT processing from per-char i/o path Peter Hurley
2013-04-15 15:32 ` [PATCH 20/20] tty: Remove extra wakeup from pty write() path Peter Hurley
2013-04-15 20:14 ` [PATCH v3 00/24] lockless n_tty receive path Greg Kroah-Hartman
2013-04-16 10:15 ` [PATCH 1/7] tty: Add timed, writer-prioritized rw semaphore Peter Hurley
2013-04-16 10:15 ` [PATCH 2/7] tty: Add lock/unlock ldisc pair functions Peter Hurley
2013-05-20 19:34 ` Greg Kroah-Hartman
2013-05-20 21:44 ` Peter Hurley
2013-05-20 23:06 ` Greg Kroah-Hartman
2013-05-20 23:38 ` Peter Hurley
2013-06-03 19:24 ` Greg Kroah-Hartman
2013-06-15 11:04 ` [PATCH 0/6] ldsem patchset, reordered and rebased Peter Hurley
2013-06-15 11:04 ` [PATCH 1/6] tty: Fix tty_ldisc_lock name collision Peter Hurley
2013-06-15 11:04 ` [PATCH 2/6] tty: Add lock/unlock ldisc pair functions Peter Hurley
2013-06-15 11:04 ` [PATCH 3/6] tty: Replace ldisc locking with ldisc_sem Peter Hurley
2013-06-15 11:04 ` [PATCH 4/6] tty: Clarify ldisc variable Peter Hurley
2013-06-15 11:04 ` [PATCH 5/6] tty: Fix hangup race with TIOCSETD ioctl Peter Hurley
2013-06-15 11:04 ` [PATCH 6/6] tty: Clarify multiple-references comment in " Peter Hurley
2013-07-23 23:44 ` [PATCH 0/6] ldsem patchset, reordered and rebased Greg Kroah-Hartman
2013-04-16 10:15 ` [PATCH 3/7] tty: Replace ldisc locking with ldisc_sem Peter Hurley
2013-04-16 10:15 ` [PATCH 4/7] tty: Clarify ldisc variable Peter Hurley
2013-04-16 10:15 ` [PATCH 5/7] tty: Fix hangup race with TIOCSETD ioctl Peter Hurley
2013-04-16 10:15 ` [PATCH 6/7] tty: Clarify multiple-references comment in " Peter Hurley
2013-04-16 10:15 ` [PATCH 7/7] tty: Fix tty_ldisc_lock name collision Peter Hurley
2013-06-15 13:14 ` [PATCH v4 00/24] lockless n_tty receive path Peter Hurley
2013-06-15 13:14 ` [PATCH v4 01/24] tty: Don't change receive_room for ioctl(TIOCSETD) Peter Hurley
2013-06-15 13:14 ` [PATCH v4 02/24] tty: Simplify tty buffer/ldisc interface with helper function Peter Hurley
2013-06-15 13:14 ` [PATCH v4 03/24] tty: Make ldisc input flow control concurrency-friendly Peter Hurley
2013-06-15 13:14 ` [PATCH v4 04/24] n_tty: Factor canonical mode copy from n_tty_read() Peter Hurley
2013-06-15 13:14 ` [PATCH v4 05/24] n_tty: Line copy to user buffer in canonical mode Peter Hurley
2013-06-15 13:14 ` [PATCH v4 06/24] n_tty: Split n_tty_chars_in_buffer() for reader-only interface Peter Hurley
2013-06-15 13:14 ` [PATCH v4 07/24] tty: Deprecate ldisc .chars_in_buffer() method Peter Hurley
2013-06-15 13:14 ` [PATCH v4 08/24] n_tty: Get read_cnt through accessor Peter Hurley
2013-06-15 13:14 ` [PATCH v4 09/24] n_tty: Don't wrap input buffer indices at buffer size Peter Hurley
2013-06-15 13:14 ` [PATCH v4 10/24] n_tty: Remove read_cnt Peter Hurley
2013-06-15 13:14 ` [PATCH v4 11/24] tty: Convert termios_mutex to termios_rwsem Peter Hurley
2013-06-15 13:14 ` [PATCH v4 12/24] n_tty: Access termios values safely Peter Hurley
2013-06-15 13:14 ` [PATCH v4 13/24] n_tty: Replace canon_data with index comparison Peter Hurley
2013-06-15 13:14 ` [PATCH v4 14/24] n_tty: Make N_TTY ldisc receive path lockless Peter Hurley
2013-06-15 13:14 ` [PATCH v4 15/24] n_tty: Reset lnext if canonical mode changes Peter Hurley
2013-06-15 13:14 ` [PATCH v4 16/24] n_tty: Fix type mismatches in receive_buf raw copy Peter Hurley
2013-06-15 13:14 ` [PATCH v4 17/24] n_tty: Don't wait for buffer work in read() loop Peter Hurley
2013-06-15 13:14 ` [PATCH v4 18/24] n_tty: Separate buffer indices to prevent cache-line sharing Peter Hurley
2013-06-15 13:14 ` [PATCH v4 19/24] tty: Only guarantee termios read safety for throttle/unthrottle Peter Hurley
2013-06-15 13:14 ` [PATCH v4 20/24] n_tty: Move chars_in_buffer() to factor throttle/unthrottle Peter Hurley
2013-06-15 13:14 ` [PATCH v4 21/24] n_tty: Factor throttle/unthrottle into helper functions Peter Hurley
2013-06-15 13:14 ` [PATCH v4 22/24] n_tty: Move n_tty_write_wakeup() to avoid forward declaration Peter Hurley
2013-06-15 13:14 ` [PATCH v4 23/24] n_tty: Special case pty flow control Peter Hurley
2013-07-23 12:47 ` [PATCH v5 " Peter Hurley
2013-06-15 13:14 ` [PATCH v4 24/24] n_tty: Queue buffer work on any available cpu Peter Hurley
2013-06-15 13:36 ` [PATCH v2 00/16] lockless tty flip buffers Peter Hurley
2013-06-15 13:36 ` [PATCH v2 01/16] tty: Compute flip buffer ptrs Peter Hurley
2013-06-15 13:36 ` [PATCH v2 02/16] tty: Fix flip buffer free list Peter Hurley
2013-06-15 13:36 ` [PATCH v2 03/16] tty: Factor flip buffer initialization into helper function Peter Hurley
2013-06-15 13:36 ` [PATCH v2 04/16] tty: Merge tty_buffer_find() into tty_buffer_alloc() Peter Hurley
2013-06-15 13:36 ` [PATCH v2 05/16] tty: Use generic names for flip buffer list cursors Peter Hurley
2013-06-15 13:36 ` [PATCH v2 06/16] tty: Use lockless flip buffer free list Peter Hurley
2013-06-15 13:36 ` [PATCH v2 07/16] tty: Simplify flip buffer list with 0-sized sentinel Peter Hurley
2013-06-15 13:36 ` [PATCH v2 08/16] tty: Track flip buffer memory limit atomically Peter Hurley
2013-06-15 13:36 ` [PATCH v2 09/16] tty: Make driver-side flip buffers lockless Peter Hurley
2013-06-15 13:36 ` [PATCH v2 10/16] tty: Ensure single-threaded flip buffer consumer with mutex Peter Hurley
2013-06-15 13:36 ` [PATCH v2 11/16] tty: Only perform flip buffer flush from tty_buffer_flush() Peter Hurley
2013-06-15 13:36 ` [PATCH v2 12/16] tty: Avoid false-sharing flip buffer ptrs Peter Hurley
2013-06-15 13:36 ` [PATCH v2 13/16] tty: Use non-atomic state to signal flip buffer flush pending Peter Hurley
2013-06-15 13:36 ` [PATCH v2 14/16] tty: Merge __tty_flush_buffer() into lone call site Peter Hurley
2013-06-15 13:36 ` [PATCH v2 15/16] tty: Fix unsafe vt paste_selection() Peter Hurley
2013-06-15 13:36 ` [PATCH v2 16/16] tty: Remove private constant from global namespace Peter Hurley
2013-06-15 14:04 ` [PATCH v2 0/9] mostly lockless tty echo Peter Hurley
2013-06-15 14:04 ` [PATCH v2 1/9] n_tty: Remove unused echo_overrun field Peter Hurley
2013-06-15 14:04 ` [PATCH v2 2/9] n_tty: Use separate head and tail indices for echo_buf Peter Hurley
2013-06-15 14:04 ` [PATCH v2 3/9] n_tty: Replace echo_cnt with computed value Peter Hurley
2013-06-15 14:04 ` [PATCH v2 4/9] n_tty: Remove echo_lock Peter Hurley
2013-06-15 14:04 ` [PATCH v2 5/9] n_tty: Eliminate echo_commit memory barrier Peter Hurley
2013-06-15 14:04 ` [PATCH v2 6/9] n_tty: Process echoes in blocks Peter Hurley
2013-07-23 23:53 ` Greg Kroah-Hartman
2013-07-25 1:33 ` Peter Hurley
2013-06-15 14:04 ` [PATCH v2 7/9] n_tty: Only flush echo output if actually output Peter Hurley
2013-06-15 14:04 ` [PATCH v2 8/9] n_tty: Eliminate counter in __process_echoes Peter Hurley
2013-06-15 14:04 ` [PATCH v2 9/9] n_tty: Avoid false-sharing echo buffer indices Peter Hurley
2013-06-15 14:21 ` [PATCH v2 00/20] tty: streamline per-char receiving Peter Hurley
2013-06-15 14:21 ` [PATCH v2 01/20] n_tty: Fix EOF push handling Peter Hurley
2013-06-15 14:21 ` [PATCH v2 02/20] n_tty: Remove alias ptrs in __receive_buf() Peter Hurley
2013-06-15 14:21 ` [PATCH v2 03/20] n_tty: Move buffers into n_tty_data Peter Hurley
2013-06-15 14:21 ` [PATCH v2 04/20] n_tty: Rename process_char_map to char_map Peter Hurley
2013-06-15 14:21 ` [PATCH v2 05/20] n_tty: Simplify __receive_buf loop count Peter Hurley
2013-06-15 14:21 ` [PATCH v2 06/20] n_tty: Factor 'real raw' receive_buf into standalone fn Peter Hurley
2013-06-15 14:21 ` [PATCH v2 07/20] n_tty: Factor signal char handling into separate fn Peter Hurley
2013-06-15 14:21 ` [PATCH v2 08/20] n_tty: Factor flagged " Peter Hurley
2013-06-15 14:21 ` [PATCH v2 09/20] n_tty: Factor raw mode receive_buf() " Peter Hurley
2013-06-15 14:21 ` [PATCH v2 10/20] n_tty: Special case EXTPROC receive_buf() as raw mode Peter Hurley
2013-06-15 14:21 ` [PATCH v2 11/20] n_tty: Factor tty->closing receive_buf() into separate fn Peter Hurley
2013-06-15 14:21 ` [PATCH v2 12/20] n_tty: Factor standard per-char i/o " Peter Hurley
2013-07-24 0:12 ` Greg Kroah-Hartman
2013-07-24 0:49 ` Peter Hurley
2013-07-24 12:29 ` [PATCH v3 1/9] " Peter Hurley
2013-07-24 12:29 ` [PATCH v3 2/9] n_tty: Eliminate char tests from IXANY restart test Peter Hurley
2013-07-24 12:29 ` [PATCH v3 3/9] n_tty: Split n_tty_receive_char() Peter Hurley
2013-07-24 12:29 ` [PATCH v3 4/9] n_tty: Factor ISTRIP and IUCLC receive_buf into separate fn Peter Hurley
2013-07-24 12:29 ` [PATCH v3 5/9] n_tty: Factor PARMRK from normal per-char i/o Peter Hurley
2013-07-24 12:29 ` [PATCH v3 6/9] n_tty: Remove overflow tests from receive_buf() path Peter Hurley
2013-07-24 12:29 ` [PATCH v3 7/9] n_tty: Un-inline single-use functions Peter Hurley
2013-07-24 12:29 ` [PATCH v3 8/9] n_tty: Factor LNEXT processing from per-char i/o path Peter Hurley
2013-07-24 12:29 ` [PATCH v3 9/9] tty: Remove extra wakeup from pty write() path Peter Hurley
2013-06-15 14:21 ` [PATCH v2 13/20] n_tty: Eliminate char tests from IXANY restart test Peter Hurley
2013-06-15 14:21 ` [PATCH v2 14/20] n_tty: Split n_tty_receive_char() Peter Hurley
2013-06-15 14:21 ` [PATCH v2 15/20] n_tty: Factor ISTRIP and IUCLC receive_buf into separate fn Peter Hurley
2013-06-15 14:21 ` [PATCH v2 16/20] n_tty: Factor PARMRK from normal per-char i/o Peter Hurley
2013-06-15 14:21 ` [PATCH v2 17/20] n_tty: Remove overflow tests from receive_buf() path Peter Hurley
2013-06-15 14:21 ` [PATCH v2 18/20] n_tty: Un-inline single-use functions Peter Hurley
2013-06-15 14:21 ` [PATCH v2 19/20] n_tty: Factor LNEXT processing from per-char i/o path Peter Hurley
2013-06-15 14:21 ` [PATCH v2 20/20] tty: Remove extra wakeup from pty write() path Peter Hurley
2013-07-20 17:00 ` Peter Hurley
2013-07-23 12:57 ` Peter Hurley
2013-07-23 15:02 ` Greg Kroah-Hartman
2013-07-24 0:04 ` [PATCH v2 0/9] mostly lockless tty echo Greg Kroah-Hartman
2013-07-23 23:53 ` [PATCH v2 00/16] lockless tty flip buffers Greg Kroah-Hartman
2013-06-17 20:01 ` [PATCH v4 00/24] lockless n_tty receive path Greg Kroah-Hartman
2013-06-17 20:32 ` Peter Hurley
2013-07-23 23:44 ` Greg Kroah-Hartman
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=1366039168-8510-4-git-send-email-peter@hurleysoftware.com \
--to=peter@hurleysoftware.com \
--cc=gregkh@linuxfoundation.org \
--cc=jslaby@suse.cz \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-serial@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).