The patch titled add receive_room flow control to flush_to_ldisc has been added to the -mm tree. Its filename is add-receive_room-flow-control-to-flush_to_ldisc.patch See http://www.zip.com.au/~akpm/linux/patches/stuff/added-to-mm.txt to find out what to do about this ------------------------------------------------------ Subject: add receive_room flow control to flush_to_ldisc From: Paul Fulghum <paulkf@xxxxxxxxxxxxx> Flush data serially to line discipline in blocks no larger than tty->receive_room to avoid losing data if line discipline is busy (such as N_TTY operating at high speed on heavily loaded system) or does not accept data in large blocks (such as N_MOUSE). Signed-off-by: Paul Fulghum <paulkf@xxxxxxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxx> --- drivers/char/tty_io.c | 36 ++++++++++++++++++++++++------------ 1 file changed, 24 insertions(+), 12 deletions(-) diff -puN drivers/char/tty_io.c~add-receive_room-flow-control-to-flush_to_ldisc drivers/char/tty_io.c --- a/drivers/char/tty_io.c~add-receive_room-flow-control-to-flush_to_ldisc +++ a/drivers/char/tty_io.c @@ -2772,7 +2772,7 @@ static void flush_to_ldisc(void *private struct tty_struct *tty = (struct tty_struct *) private_; unsigned long flags; struct tty_ldisc *disc; - struct tty_buffer *tbuf; + struct tty_buffer *tbuf, *head; int count; char *char_buf; unsigned char *flag_buf; @@ -2782,21 +2782,33 @@ static void flush_to_ldisc(void *private return; spin_lock_irqsave(&tty->buf.lock, flags); - while((tbuf = tty->buf.head) != NULL) { - while ((count = tbuf->commit - tbuf->read) != 0) { - char_buf = tbuf->char_buf_ptr + tbuf->read; - flag_buf = tbuf->flag_buf_ptr + tbuf->read; - tbuf->read += count; + head = tty->buf.head; + if (head != NULL) { + tty->buf.head = NULL; + for (;;) { + count = head->commit - head->read; + if (!count) { + if (head->next == NULL) + break; + tbuf = head; + head = head->next; + tty_buffer_free(tty, tbuf); + continue; + } + if (!tty->receive_room) { + schedule_delayed_work(&tty->buf.work, 1); + break; + } + if (count > tty->receive_room) + count = tty->receive_room; + char_buf = head->char_buf_ptr + head->read; + flag_buf = head->flag_buf_ptr + head->read; + head->read += count; spin_unlock_irqrestore(&tty->buf.lock, flags); disc->receive_buf(tty, char_buf, flag_buf, count); spin_lock_irqsave(&tty->buf.lock, flags); } - if (tbuf->active) - break; - tty->buf.head = tbuf->next; - if (tty->buf.head == NULL) - tty->buf.tail = NULL; - tty_buffer_free(tty, tbuf); + tty->buf.head = head; } spin_unlock_irqrestore(&tty->buf.lock, flags); _ Patches currently in -mm which might be from paulkf@xxxxxxxxxxxxx are origin.patch remove-dead-entry-in-net-wan-kconfig.patch more-tty-cleanups-in-drivers-char.patch fix-memory-leak-in-rocketport-rp_do_receive.patch add-synclink_gt-custom-hdlc-idle.patch add-synclink_gt-crc-return-feature.patch fix-synclink_gt-diagnostics-error-reporting.patch synclink_gt-add-gt2-adapter-support.patch remove-tty_dont_flip.patch add-receive_room-flow-control-to-flush_to_ldisc.patch revert-tty-buffering-comment-out-debug-code.patch - To unsubscribe from this list: send the line "unsubscribe mm-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html