• Ilpo Järvinen's avatar
    tty: Implement lookahead to process XON/XOFF timely · 6bb6fa69
    Ilpo Järvinen authored
    When tty is not read from, XON/XOFF may get stuck into an
    intermediate buffer. As those characters are there to do software
    flow-control, it is not very useful. In the case where neither end
    reads from ttys, the receiving ends might not be able receive the
    XOFF characters and just keep sending more data to the opposite
    direction. This problem is almost guaranteed to occur with DMA
    which sends data in large chunks.
    
    If TTY is slow to process characters, that is, eats less than given
    amount in receive_buf, invoke lookahead for the rest of the chars
    to process potential XON/XOFF characters.
    
    We need to keep track of how many characters have been processed by the
    lookahead to avoid processing the flow control char again on the normal
    path. Bookkeeping occurs parallel on two layers (tty_buffer and n_tty)
    to avoid passing the lookahead_count through the whole call chain.
    
    When a flow-control char is processed, two things must occur:
      a) it must not be treated as normal char
      b) if not yet processed, flow-control actions need to be taken
    The return value of n_tty_receive_char_flow_ctrl() tells caller a), and
    b) is kept internal to n_tty_receive_char_flow_ctrl().
    
    If characters were previous looked ahead, __receive_buf() makes two
    calls to the appropriate n_tty_receive_buf_* function. First call is
    made with lookahead_done=true for the characters that were subject to
    lookahead earlier and then with lookahead=false for the new characters.
    Either of the calls might be skipped when it has no characters to
    handle.
    Reported-by: default avatarGilles Buloz <gilles.buloz@kontron.com>
    Reviewed-by: default avatarAndy Shevchenko <andy.shevchenko@gmail.com>
    Signed-off-by: default avatarIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
    Link: https://lore.kernel.org/r/20220606153652.63554-2-ilpo.jarvinen@linux.intel.comSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    6bb6fa69
tty_buffer.c 17.2 KB