From 57d25beaae21721830fbb865cd8b169260c00ee1 Mon Sep 17 00:00:00 2001 From: Paul Fulghum Date: Wed, 28 Jun 2006 04:26:48 -0700 Subject: [PATCH] --- yaml --- r: 30963 b: refs/heads/master c: 2c3bb20f46709a0adfa7ea408013edbcab945d5a h: refs/heads/master i: 30961: 96c09b97dd53673fb9bdd526e156468479807bd3 30959: 91e71dc82456e94e0c14ab525974da38670c0c15 v: v3 --- [refs] | 2 +- trunk/drivers/char/tty_io.c | 37 ++++++++++++++++++++++++------------- 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/[refs] b/[refs] index b8cc6f747d90..9a37e4bff39e 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 817d6d3bceaf34c99f5343820f9b9e6021f0655c +refs/heads/master: 2c3bb20f46709a0adfa7ea408013edbcab945d5a diff --git a/trunk/drivers/char/tty_io.c b/trunk/drivers/char/tty_io.c index b846d87f2b56..1f03ebf165d9 100644 --- a/trunk/drivers/char/tty_io.c +++ b/trunk/drivers/char/tty_io.c @@ -2771,8 +2771,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; - int count; + struct tty_buffer *tbuf, *head; char *char_buf; unsigned char *flag_buf; @@ -2781,21 +2780,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 (;;) { + int 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);