Messages in this thread Patch in this message | | | Date | Mon, 3 Mar 2003 16:51:42 -0500 (EST) | From | Nicolas Pitre <> | Subject | Re: [patch] small tty irq race fix |
| |
On Mon, 3 Mar 2003, Linus Torvalds wrote:
> > On Mon, 3 Mar 2003, Nicolas Pitre wrote: > > > > What about this one? It just happens that tty->read_lock is actually used > > deeper in the same call instance (in n_tty.c) so this looks to be the best > > lock to use. > > Looks ok. I would suggest moving the "spin_lock_irqsave()" to outside the > 'if'-statement, though, since that should make the code a lot more > readable, and if the lock is supposed to protect tty->flip.buf_num, then > let's do it right and protect the read as well, no?
Oh sure.
--- linux-2.5.63/drivers/char/tty_io.c.orig Mon Feb 24 14:05:34 2003 +++ linux-2.5.63/drivers/char/tty_io.c Mon Mar 3 16:49:44 2003 @@ -1944,27 +1944,25 @@ schedule_delayed_work(&tty->flip.work, 1); return; } + + spin_lock_irqsave(&tty->read_lock, flags); if (tty->flip.buf_num) { cp = tty->flip.char_buf + TTY_FLIPBUF_SIZE; fp = tty->flip.flag_buf + TTY_FLIPBUF_SIZE; tty->flip.buf_num = 0; - - local_irq_save(flags); // FIXME: is this safe? tty->flip.char_buf_ptr = tty->flip.char_buf; tty->flip.flag_buf_ptr = tty->flip.flag_buf; } else { cp = tty->flip.char_buf; fp = tty->flip.flag_buf; tty->flip.buf_num = 1; - - local_irq_save(flags); // FIXME: is this safe? tty->flip.char_buf_ptr = tty->flip.char_buf + TTY_FLIPBUF_SIZE; tty->flip.flag_buf_ptr = tty->flip.flag_buf + TTY_FLIPBUF_SIZE; } count = tty->flip.count; tty->flip.count = 0; - local_irq_restore(flags); // FIXME: is this safe? - + spin_unlock_irqrestore(&tty->read_lock, flags); + tty->ldisc.receive_buf(tty, cp, fp, count); }
Nicolas
- 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/
| |