03 Jan, 2009

6 commits

  • The N_TTY ldisc layer does not send SIGIO POLL_OUTs correctly when output is
    possible due to flawed handling of the TTY_DO_WRITE_WAKEUP bit. It will
    either send no SIGIOs at all or on every tty wakeup.

    The fix is to set the bit when the tty driver write would block and test
    and clear it on write wakeup.

    [Merged with existing N_TTY patches and a small buglet fixed -- Alan]

    Signed-off-by: Thomas Pfaff
    Signed-off-by: Alan Cox
    Signed-off-by: Linus Torvalds

    Thomas Pfaff
     
  • This patch causes "bell" (^G) characters (invoked when the input buffer
    is full) to be immediately output rather than filling the echo buffer.

    This is especially a problem when the tty is stopped and buffers fill, since
    the bells do not serve their purpose of immediate notification that the
    buffer cannot take further input, and they will flush all at once when the
    tty is restarted.

    Signed-off-by: Joe Peterson
    Signed-off-by: Alan Cox
    Signed-off-by: Linus Torvalds

    Joe Peterson
     
  • Fix the handling of input characters when the tty buffer is full or nearly
    full. This includes tests that are done in n_tty_receive_char() and handling
    of PARMRK.

    Problems with the buffer-full tests done in receive_char() caused characters to
    be lost at times when the buffer(s) filled. Also, these full conditions
    would often only be detected with echo on, and PARMRK was not accounted for
    properly in all cases. One symptom of these problems, in addition to lost
    characters, was early termination from unix commands like tr and cat when
    ^Q was used to break from a stopped tty with full buffers (note that breaking
    out was often previously not possible, due to the pty getting in "gridlock",
    which will be addressed in another patch). Note space is always reserved
    at the end of the buffer for a newline (or EOF/EOL) in canonical mode.

    Signed-off-by: Joe Peterson
    Signed-off-by: Alan Cox
    Signed-off-by: Linus Torvalds

    Joe Peterson
     
  • Fix process_output_block to detect continuation characters correctly
    and to handle control characters even when O_OLCUC is enabled. Make
    similar change to do_output_char().

    Signed-off-by: Joe Peterson
    Signed-off-by: Alan Cox
    Signed-off-by: Linus Torvalds

    Joe Peterson
     
  • Now the main work is done its polishing time

    Signed-off-by: Alan Cox
    Signed-off-by: Linus Torvalds

    Alan Cox
     
  • Fixes the loss of echoed (and other ldisc-generated characters) when
    the tty is stopped or when the driver output buffer is full (happens
    frequently for input during continuous program output, such as ^C)
    and removes the Big Kernel Lock from the N_TTY line discipline.

    Adds an "echo buffer" to the N_TTY line discipline that handles all
    ldisc-generated output (including echoed characters). Along with the
    loss of characters, this also fixes the associated loss of sync between
    tty output and the ldisc state when characters cannot be immediately
    written to the tty driver.

    The echo buffer stores (in addition to characters) state operations that need
    to be done at the time of character output (like management of the column
    position). This allows echo to cooperate correctly with program output,
    since the ldisc state remains consistent with actual characters written.

    Since the echo buffer code now isolates the tty column state code
    to the process_out* and process_echoes functions, we can remove the
    Big Kernel Lock (BKL) and replace it with mutex locks.

    Highlights are:

    * Handles echo (and other ldisc output) when tty driver buffer is full
    - continuous program output can block echo
    * Saves echo when tty is in stopped state (e.g. ^S)
    - (e.g.: ^Q will correctly cause held characters to be released for output)
    * Control character pairs (e.g. "^C") are treated atomically and not
    split up by interleaved program output
    * Line discipline state is kept consistent with characters sent to
    the tty driver
    * Remove the big kernel lock (BKL) from N_TTY line discipline

    Signed-off-by: Joe Peterson
    Signed-off-by: Alan Cox
    Signed-off-by: Linus Torvalds

    Joe Peterson
     

14 Oct, 2008

3 commits


21 Jul, 2008

1 commit

  • Move the line disciplines towards a conventional ->ops arrangement. For
    the moment the actual 'tty_ldisc' struct in the tty is kept as part of
    the tty struct but this can then be changed if it turns out that when it
    all settles down we want to refcount ldiscs separately to the tty.

    Pull the ldisc code out of /proc and put it with our ldisc code.

    Signed-off-by: Alan Cox
    Signed-off-by: Linus Torvalds

    Alan Cox
     

16 May, 2008

1 commit

  • Enabling the BKL to be lockdep tracked uncovered the following
    upstream kernel bug in the tty code, which caused a BKL
    reference leak:

    ================================================
    [ BUG: lock held when returning to user space! ]
    ------------------------------------------------
    dmesg/3121 is leaving the kernel with locks still held!
    1 lock held by dmesg/3121:
    #0: (kernel_mutex){--..}, at: [] opost+0x24/0x194

    this might explain some of the atomicity warnings and crashes
    that -tip tree testing has been experiencing since the BKL
    was converted back to a spinlock.

    Signed-off-by: Ingo Molnar
    Signed-off-by: Linus Torvalds

    Ingo Molnar
     

30 Apr, 2008

4 commits

  • Something Arjan suggested which allows us to clean up the code nicely

    Signed-off-by: Alan Cox
    Cc: Arjan van de Ven
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Alan Cox
     
  • - Operations are now a shared const function block as with most other Linux
    objects

    - Introduce wrappers for some optional functions to get consistent behaviour

    - Wrap put_char which used to be patched by the tty layer

    - Document which functions are needed/optional

    - Make put_char report success/fail

    - Cache the driver->ops pointer in the tty as tty->ops

    - Remove various surplus lock calls we no longer need

    - Remove proc_write method as noted by Alexey Dobriyan

    - Introduce some missing sanity checks where certain driver/ldisc
    combinations would oops as they didn't check needed methods were present

    [akpm@linux-foundation.org: fix fs/compat_ioctl.c build]
    [akpm@linux-foundation.org: fix isicom]
    [akpm@linux-foundation.org: fix arch/ia64/hp/sim/simserial.c build]
    [akpm@linux-foundation.org: fix kgdb]
    Signed-off-by: Alan Cox
    Acked-by: Greg Kroah-Hartman
    Cc: Jason Wessel
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Alan Cox
     
  • Refine these behaviors in the N_TTY line discipline:

    1) Handle the signal characters consistently when received in a stopped TTY
    so that SUSP (typically ctrl-Z) behaves like INTR and QUIT in resuming a
    stopped TTY.

    2) Adjust the order in which the IGNCR/ICRNL/INLCR processing is applied to
    be more logical and consistent with the behavior of other Unix systems.

    Signed-off-by: Joe Peterson
    Cc: Alan Cox
    Cc: Oleg Nesterov
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Joe Peterson
     
  • - Push the BKL down into the line disciplines
    - Switch the tty layer to unlocked_ioctl
    - Introduce a new ctrl_lock spin lock for the control bits
    - Eliminate much of the lock_kernel use in n_tty
    - Prepare to (but don't yet) call the drivers with the lock dropped
    on the paths that historically held the lock

    BKL now primarily protects open/close/ldisc change in the tty layer

    [jirislaby@gmail.com: a couple of fixes]
    Signed-off-by: Alan Cox
    Signed-off-by: Jiri Slaby
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Alan Cox
     

31 Mar, 2008

1 commit


09 Feb, 2008

1 commit


07 Feb, 2008

2 commits

  • Fix two N_TTY line discipline issues related to resuming a stopped TTY
    (typically done with ctrl-S):

    1) Fix handling of character that resumes a stopped TTY (with IXANY)

    With "stty ixany", the TTY line discipline would lose the first character
    after the stop, so typing, for example, "hi^Sthere" resulted in "hihere"
    (the 't' would cause the resume after ^S, but it would then be thrown away
    rather than processed as an input character). This was inconsistent with
    the behavior of other Unix systems.

    2) Fix interrupt signal (e.g. ctrl-C) behavior in stopped TTYs

    With "stty -ixany" (often the default), interrupt signals were ignored
    in a stopped TTY until the TTY was resumed with the start char (typically
    ctrl-Q), which was inconsistent with the behavior of other Unix systems.

    Signed-off-by: Joe Peterson
    Cc: Alan Cox
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Joe Peterson
     
  • Turn on INTR/QUIT/SUSP echoing in the N_TTY line discipline (e.g. ctrl-C
    will appear as "^C" if stty echoctl is set and ctrl-C is set as INTR).

    Linux seems to be the only unix-like OS (recently I've verified this on
    Solaris, BSD, and Mac OS X) that does *not* behave this way, and I really
    miss this as a good visual confirmation of the interrupt of a program in
    the console or xterm. I remember this fondly from many Unixs I've used
    over the years as well. Bringing this to Linux also seems like a good way
    to make it yet more compliant with standard unix-like behavior.

    [akpm@linux-foundation.org: coding-style fixes]
    Cc: Alan Cox
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Joe Peterson
     

20 Oct, 2007

1 commit


17 Jul, 2007

2 commits

  • Add TTY input auditing, used to audit system administrator's actions. This is
    required by various security standards such as DCID 6/3 and PCI to provide
    non-repudiation of administrator's actions and to allow a review of past
    actions if the administrator seems to overstep their duties or if the system
    becomes misconfigured for unknown reasons. These requirements do not make it
    necessary to audit TTY output as well.

    Compared to an user-space keylogger, this approach records TTY input using the
    audit subsystem, correlated with other audit events, and it is completely
    transparent to the user-space application (e.g. the console ioctls still
    work).

    TTY input auditing works on a higher level than auditing all system calls
    within the session, which would produce an overwhelming amount of mostly
    useless audit events.

    Add an "audit_tty" attribute, inherited across fork (). Data read from TTYs
    by process with the attribute is sent to the audit subsystem by the kernel.
    The audit netlink interface is extended to allow modifying the audit_tty
    attribute, and to allow sending explanatory audit events from user-space (for
    example, a shell might send an event containing the final command, after the
    interactive command-line editing and history expansion is performed, which
    might be difficult to decipher from the TTY input alone).

    Because the "audit_tty" attribute is inherited across fork (), it would be set
    e.g. for sshd restarted within an audited session. To prevent this, the
    audit_tty attribute is cleared when a process with no open TTY file
    descriptors (e.g. after daemon startup) opens a TTY.

    See https://www.redhat.com/archives/linux-audit/2007-June/msg00000.html for a
    more detailed rationale document for an older version of this patch.

    [akpm@linux-foundation.org: build fix]
    Signed-off-by: Miloslav Trmac
    Cc: Al Viro
    Cc: Alan Cox
    Cc: Paul Fulghum
    Cc: Casey Schaufler
    Cc: Steve Grubb
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Miloslav Trmac
     
  • Without this a tty write could block if a previous blocking tty write was
    in progress on the same tty and blocked by a line discipline or hardware
    event. Originally found and reported by Dave Johnson.

    Signed-off-by: Alan Cox
    Acked-by: Dave Johnson
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Alan Cox
     

01 Jun, 2007

1 commit

  • Spotted by Satoru Takeuchi.

    kill_pgrp(task_pgrp(current)) sends the signal to the current's thread
    group, but can choose any sub-thread as a target for signal_wake_up().
    This means that job_control() and tty_check_change() may return
    -ERESTARTSYS without signal_pending().

    Signed-off-by: Oleg Nesterov
    Cc: Satoru Takeuchi
    Cc: Roland McGrath
    Cc: Alan Cox
    Cc:
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Oleg Nesterov
     

11 May, 2007

1 commit

  • Add compat_ioctl method for tty code to allow processing of 32 bit ioctl
    calls on 64 bit systems by tty core, tty drivers, and line disciplines.

    Based on patch by Arnd Bergmann:
    http://www.uwsg.iu.edu/hypermail/linux/kernel/0511.0/1732.html

    [akpm@linux-foundation.org: make things static]
    Signed-off-by: Paul Fulghum
    Acked-by: Arnd Bergmann
    Cc: Alan Cox
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Paul Fulghum
     

13 Feb, 2007

2 commits

  • Of kernel subsystems that work with pids the tty layer is probably the largest
    consumer. But it has the nice virtue that the assiation with a session only
    lasts until the session leader exits. Which means that no reference counting
    is required. So using struct pid winds up being a simple optimization to
    avoid hash table lookups.

    In the long term the use of pid_nr also ensures that when we have multiple pid
    spaces mixed everything will work correctly.

    Signed-off-by: Eric W. Biederman
    Cc: Alan Cox
    Cc: Oleg Nesterov
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Eric W. Biederman
     
  • Every call to is_orphaned_pgrp passed in process_group(current) which is racy
    with respect to another thread changing our process group. It didn't bite us
    because we were dealing with integers and the worse we would get would be a
    stale answer.

    In switching the checks to use struct pid to be a little more efficient and
    prepare the way for pid namespaces this race became apparent.

    So I simplified the calls to the more specialized is_current_pgrp_orphaned so
    I didn't have to worry about making logic changes to avoid the race.

    Signed-off-by: Eric W. Biederman
    Cc: Alan Cox
    Cc: Oleg Nesterov
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Eric W. Biederman
     

14 Dec, 2006

1 commit


09 Dec, 2006

1 commit

  • This is the grungy swap all the occurrences in the right places patch that
    goes with the updates. At this point we have the same functionality as
    before (except that sgttyb() returns speeds not zero) and are ready to
    begin turning new stuff on providing nobody reports lots of bugs

    If you are a tty driver author converting an out of tree driver the only
    impact should be termios->ktermios name changes for the speed/property
    setting functions from your upper layers.

    If you are implementing your own TCGETS function before then your driver
    was broken already and its about to get a whole lot more painful for you so
    please fix it 8)

    Also fill in c_ispeed/ospeed on init for most devices, although the current
    code will do this for you anyway but I'd like eventually to lose that extra
    paranoia

    [akpm@osdl.org: bluetooth fix]
    [mp3@de.ibm.com: sclp fix]
    [mp3@de.ibm.com: warning fix for tty3270]
    [hugh@veritas.com: fix tty_ioctl powerpc build]
    [jdike@addtoit.com: uml: fix ->set_termios declaration]
    Signed-off-by: Alan Cox
    Signed-off-by: Martin Peschke
    Acked-by: Peter Oberparleiter
    Cc: Cornelia Huck
    Signed-off-by: Hugh Dickins
    Signed-off-by: Jeff Dike
    Cc: Paolo 'Blaisorblade' Giarrusso
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Alan Cox
     

29 Jun, 2006

1 commit

  • Remove TTY_DONT_FLIP tty flag. This flag was introduced in 2.1.X kernels
    to prevent the N_TTY line discipline functions read_chan() and
    n_tty_receive_buf() from running at the same time. 2.2.15 introduced
    tty->read_lock to protect access to the N_TTY read buffer, which is the
    only state requiring protection between these two functions.

    The current TTY_DONT_FLIP implementation is broken for SMP, and is not
    universally honored by drivers that send data directly to the line
    discipline receive_buf function.

    Because TTY_DONT_FLIP is not necessary, is broken in implementation, and is
    not universally honored, it is removed.

    Signed-off-by: Paul Fulghum
    Cc: Alan Cox
    Cc: Theodore Ts'o
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Paul Fulghum
     

12 Jun, 2006

1 commit

  • People have been reporting that PPP connections over ptys, such as
    used with PPTP, will hang randomly when transferring large amounts of
    data, for instance in http://bugzilla.kernel.org/show_bug.cgi?id=6530.
    I have managed to reproduce the problem, and the patch below fixes the
    actual cause.

    The problem is not in fact in ppp_async.c but in n_tty.c. What
    happens is that when pptp reads from the pty, we call read_chan() in
    drivers/char/n_tty.c on the master side of the pty. That copies all
    the characters out of its buffer to userspace and then calls
    check_unthrottle(), which calls the pty unthrottle routine, which
    calls tty_wakeup on the slave side, which calls ppp_asynctty_wakeup,
    which calls tasklet_schedule. So far so good. Since we are in
    process context, the tasklet runs immediately and calls
    ppp_async_process(), which calls ppp_async_push, which calls the
    tty->driver->write function to send some more output.

    However, tty->driver->write() returns zero, because the master
    tty->receive_room is still zero. We haven't returned from
    check_unthrottle() yet, and read_chan() only updates tty->receive_room
    _after_ calling check_unthrottle. That means that the driver->write
    call in ppp_async_process() returns 0. That would be fine if we were
    going to get a subsequent wakeup call, but we aren't (we just had it,
    and the buffer is now empty).

    The solution is for n_tty.c to update tty->receive_room _before_
    calling the driver unthrottle routine. The patch below does this.
    With this patch I was able to transfer a 900MB file over a PPTP
    connection (taking about 25 minutes), whereas without the patch the
    connection would always stall in under a minute.

    Signed-off-by: Paul Mackerras
    Signed-off-by: Linus Torvalds

    Paul Mackerras
     

23 Mar, 2006

1 commit

  • Semaphore to mutex conversion.

    The conversion was generated via scripts, and the result was validated
    automatically via a script as well.

    Signed-off-by: Ingo Molnar
    Cc: Alan Cox
    Cc: Russell King
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Ingo Molnar
     

11 Jan, 2006

1 commit

  • The API and code have been through various bits of initial review by
    serial driver people but they definitely need to live somewhere for a
    while so the unconverted drivers can get knocked into shape, existing
    drivers that have been updated can be better tuned and bugs whacked out.

    This replaces the tty flip buffers with kmalloc objects in rings. In the
    normal situation for an IRQ driven serial port at typical speeds the
    behaviour is pretty much the same, two buffers end up allocated and the
    kernel cycles between them as before.

    When there are delays or at high speed we now behave far better as the
    buffer pool can grow a bit rather than lose characters. This also means
    that we can operate at higher speeds reliably.

    For drivers that receive characters in blocks (DMA based, USB and
    especially virtualisation) the layer allows a lot of driver specific
    code that works around the tty layer with private secondary queues to be
    removed. The IBM folks need this sort of layer, the smart serial port
    people do, the virtualisers do (because a virtualised tty typically
    operates at infinite speed rather than emulating 9600 baud).

    Finally many drivers had invalid and unsafe attempts to avoid buffer
    overflows by directly invoking tty methods extracted out of the innards
    of work queue structs. These are no longer needed and all go away. That
    fixes various random hangs with serial ports on overflow.

    The other change in here is to optimise the receive_room path that is
    used by some callers. It turns out that only one ldisc uses receive room
    except asa constant and it updates it far far less than the value is
    read. We thus make it a variable not a function call.

    I expect the code to contain bugs due to the size alone but I'll be
    watching and squashing them and feeding out new patches as it goes.

    Because the buffers now dynamically expand you should only run out of
    buffering when the kernel runs out of memory for real. That means a lot of
    the horrible hacks high performance drivers used to do just aren't needed any
    more.

    Description:

    tty_insert_flip_char is an old API and continues to work as before, as does
    tty_flip_buffer_push() [this is why many drivers dont need modification]. It
    does now also return the number of chars inserted

    There are also

    tty_buffer_request_room(tty, len)

    which asks for a buffer block of the length requested and returns the space
    found. This improves efficiency with hardware that knows how much to
    transfer.

    and tty_insert_flip_string_flags(tty, str, flags, len)

    to insert a string of characters and flags

    For a smart interface the usual code is

    len = tty_request_buffer_room(tty, amount_hardware_says);
    tty_insert_flip_string(tty, buffer_from_card, len);

    More description!

    At the moment tty buffers are attached directly to the tty. This is causing a
    lot of the problems related to tty layer locking, also problems at high speed
    and also with bursty data (such as occurs in virtualised environments)

    I'm working on ripping out the flip buffers and replacing them with a pool of
    dynamically allocated buffers. This allows both for old style "byte I/O"
    devices and also helps virtualisation and smart devices where large blocks of
    data suddenely materialise and need storing.

    So far so good. Lots of drivers reference tty->flip.*. Several of them also
    call directly and unsafely into function pointers it provides. This will all
    break. Most drivers can use tty_insert_flip_char which can be kept as an API
    but others need more.

    At the moment I've added the following interfaces, if people think more will
    be needed now is a good time to say

    int tty_buffer_request_room(tty, size)

    Try and ensure at least size bytes are available, returns actual room (may be
    zero). At the moment it just uses the flipbuf space but that will change.
    Repeated calls without characters being added are not cumulative. (ie if you
    call it with 1, 1, 1, and then 4 you'll have four characters of space. The
    other functions will also try and grow buffers in future but this will be a
    more efficient way when you know block sizes.

    int tty_insert_flip_char(tty, ch, flag)

    As before insert a character if there is room. Now returns 1 for success, 0
    for failure.

    int tty_insert_flip_string(tty, str, len)

    Insert a block of non error characters. Returns the number inserted.

    int tty_prepare_flip_string(tty, strptr, len)

    Adjust the buffer to allow len characters to be added. Returns a buffer
    pointer in strptr and the length available. This allows for hardware that
    needs to use functions like insl or mencpy_fromio.

    Signed-off-by: Alan Cox
    Cc: Paul Fulghum
    Signed-off-by: Hirokazu Takata
    Signed-off-by: Serge Hallyn
    Signed-off-by: Jeff Dike
    Signed-off-by: John Hawkes
    Signed-off-by: Martin Schwidefsky
    Signed-off-by: Adrian Bunk
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Alan Cox
     

28 Oct, 2005

1 commit


11 Sep, 2005

1 commit


08 Jul, 2005

1 commit

  • The patch fixes a few corner cases around tty line editing with
    very long input lines:

    - n_tty_receive_char(): don't simply drop eol characters,
    otherwise canon_data isn't increased and the reader isn't woken
    up.

    - n_tty_receive_room(): If there is no newline pending and the
    edit buffer is full, allow only a single character to be written
    (until eol is found and the line is flushed), so characters from
    the next line aren't dropped.

    - write_chan(): if an incomplete line was written, continue
    writing until write() returns 0, otherwise it might not write
    the eol character to flush the line and the writer goes to sleep
    without ever being woken up.

    BTW the core problem is that part of this should be handled in the
    receive_buf path, but for this it has to return the number of
    written characters, as the amount of written characters may not be
    the same as the amount of characters going into the write buffer,
    so the receive_room() usage in pty_write() is not really reliable.

    Alan said:

    The problem looks valid. The behaviour of 'traditional unix' appears to
    be the following

    If you exceed the line limit then beep and drop the character
    Always allow EOL to complete a canonical line input
    Always do signal/control processing if enabled

    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Roman Zippel
     

17 Apr, 2005

1 commit

  • Initial git repository build. I'm not bothering with the full history,
    even though we have it. We can create a separate "historical" git
    archive of that later if we want to, and in the meantime it's about
    3.2GB when imported into git - space that would just make the early
    git days unnecessarily complicated, when we don't have a lot of good
    infrastructure for it.

    Let it rip!

    Linus Torvalds