On Mon, Jun 16, 2014 at 09:17:06AM -0400, Peter Hurley wrote: > Since at least before 2.6.30, it has not been possible to observe > a hung up file pointer in a tty driver's open() method unless/until > the driver open() releases the tty_lock() (eg., before blocking). > > This is because tty_open() adds the file pointer while holding > the tty_lock() _and_ doesn't release the lock until after calling > the tty driver's open() method. [ Before tty_lock(), this was > lock_kernel(). ] > > Since __tty_hangup() first waits on the tty_lock() before > enumerating and hanging up the open file pointers, either > __tty_hangup() will wait for the tty_lock() or tty_open() will > not yet have added the file pointer. For example, > > CPU 0 | CPU 1 > | > tty_open | __tty_hangup > .. | .. > tty_lock | .. > tty_reopen | tty_lock / blocks > .. | > tty_add_file(tty, filp) | > .. | > tty->ops->open(tty, filp) | > tty_port_open | > tty_port_block_til_ready | > .. | > while (1) | > .. | > tty_unlock | / unblocks > schedule | for each filp on tty->tty_files > | f_ops = tty_hung_up_fops; > | .. > | tty_unlock > tty_lock | > .. | > tty_unlock | > > Note that since tty_port_block_til_ready() and similar drop > the tty_lock while blocking, when woken, the file pointer > must then be tested for having been hung up. > > Also, fix bit-rotted drivers that used extra_count to track the > port->count bump. > > CC: Mikael Starvik <starvik@xxxxxxxx> For the CRIS part: Acked-by: Jesper Nilsson <jesper.nilsson@xxxxxxxx> > CC: Samuel Ortiz <samuel@xxxxxxxxxx> > CC: "David S. Miller" <davem@xxxxxxxxxxxxx> > Signed-off-by: Peter Hurley <peter@xxxxxxxxxxxxxxxxxx> /^JN - Jesper Nilsson -- Jesper Nilsson -- jesper.nilsson@xxxxxxxx -- To unsubscribe from this list: send the line "unsubscribe linux-serial" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html