• Daniel Starke's avatar
    tty: n_gsm: fix wrong queuing behavior in gsm_dlci_data_output() · 556fc8ac
    Daniel Starke authored
    1) The function drains the fifo for the given user tty/DLCI without
    considering 'TX_THRESH_HI' and different to gsm_dlci_data_output_framed(),
    which moves only one packet from the user side to the internal transmission
    queue. We can only handle one packet at a time here if we want to allow
    DLCI priority handling in gsm_dlci_data_sweep() to avoid link starvation.
    2) Furthermore, the additional header octet from convergence layer type 2
    is not counted against MTU. It is part of the UI/UIH frame message which
    needs to be limited to MTU. Hence, it is wrong not to consider this octet.
    3) Finally, the waiting user tty is not informed about freed space in its
    send queue.
    
    Take at most one packet worth of data out of the DLCI fifo to fix 1).
    Limit the max user data size per packet to MTU - 1 in case of convergence
    layer type 2 to leave space for the control signal octet which is added in
    the later part of the function. This fixes 2).
    Add tty_port_tty_wakeup() to wake up the user tty if new write space has
    been made available to fix 3).
    
    Fixes: 268e526b ("tty/n_gsm: avoid fifo overflow in gsm_dlci_data_output")
    Signed-off-by: default avatarDaniel Starke <daniel.starke@siemens.com>
    Link: https://lore.kernel.org/r/20220701061652.39604-3-daniel.starke@siemens.comSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    556fc8ac
n_gsm.c 85.7 KB