Messages in this thread Patch in this message | | | Subject | [PATCH] Fix race condition in hvc console. | From | Michal Ostrowski <> | Date | Sat, 18 Feb 2006 09:29:59 -0500 |
| |
tty_schedule_flip() would schedule a thread that would call flush_to_ldisc(). If tty_buffer_request_room() gets called prior to that thread running -- which is likely in this loop in hvc_poll(), it would set the active flag in the tty buffer and consequently flush_to_ldisc() would ignore it.
The result is that input on the hvc console is not processed.
This fix calls tty_flip_buffer_push (and flags the tty as "low_latency"). The push to the ldisc thus happens synchronously.
Signed-off-by: Michal Ostrowski <mostrows@watson.ibm.com>
---
drivers/char/hvc_console.c | 9 ++++++--- 1 files changed, 6 insertions(+), 3 deletions(-)
1d719e2972f0c02d62a428aa84ca60793ad79666 diff --git a/drivers/char/hvc_console.c b/drivers/char/hvc_console.c index 1994a92..67f368f 100644 --- a/drivers/char/hvc_console.c +++ b/drivers/char/hvc_console.c @@ -335,6 +335,8 @@ static int hvc_open(struct tty_struct *t } /* else count == 0 */ tty->driver_data = hp; + tty->low_latency = 1; /* Makes flushes to ldisc synchronous. */ + hp->tty = tty; /* Save for request_irq outside of spin_lock. */ irq = hp->irq; @@ -633,9 +635,6 @@ static int hvc_poll(struct hvc_struct *h tty_insert_flip_char(tty, buf[i], 0); } - if (count) - tty_schedule_flip(tty); - /* * Account for the total amount read in one loop, and if above * 64 bytes, we do a quick schedule loop to let the tty grok @@ -656,6 +655,10 @@ static int hvc_poll(struct hvc_struct *h bail: spin_unlock_irqrestore(&hp->lock, flags); + if (read_total) { + tty_flip_buffer_push(tty); + } + return poll_mask; } -- 1.1.4.g0b63-dirty - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |