• Peter Hurley's avatar
    tty: Remove extra wakeup from pty write() path · 5ede5253
    Peter Hurley authored
    Acquiring the write_wait queue spin lock now accounts for the largest
    slice of cpu time on the tty write path. Two factors contribute to
    this situation; a overly-pessimistic line discipline write loop which
    _always_ sets up a wait loop even if i/o will immediately succeed, and
    on ptys, a wakeup storm from reads and writes.
    
    Writer wakeup does not need to be performed by the pty driver.
    Firstly, since the actual i/o is performed within the write, the
    line discipline write loop will continue while space remains in
    the flip buffers. Secondly, when space becomes avail in the
    line discipline receive buffer (and thus also in the flip buffers),
    the pty unthrottle re-wakes the writer (non-flow-controlled line
    disciplines unconditionally unthrottle the driver when data is
    received). Thus, existing in-kernel i/o is guaranteed to advance.
    Finally, writer wakeup occurs at the conclusion of the line discipline
    write (in tty_write_unlock()). This guarantees that any user-space write
    waiters are woken to continue additional i/o.
    Signed-off-by: default avatarPeter Hurley <peter@hurleysoftware.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    5ede5253
pty.c 20.6 KB