[lvc-project] [PATCH 6.1.y v2] serial: core: fix infinite loop in handle_tx() for PORT_UNKNOWN
Fedor Pchelkin
pchelkin at ispras.ru
Sat Aug 22 13:11:36 MSK 2026
On Fri, 21. Aug 19:58, Andrey Kalachev wrote:
> @@ -611,7 +611,15 @@ static unsigned int uart_write_room(struct tty_struct *tty)
> unsigned int ret;
>
> port = uart_port_lock(state, flags);
> - ret = uart_circ_chars_free(&state->xmit);
> + if (!state->port.xmit_buf) {
В старых ветках 5.10/6.1 до коммита 1788cf6a91d9 ("tty: serial: switch
from circ_buf to kfifo") это поле state->port.xmit_buf по семантике имело
несколько другое значение.
Посмотрите, в 5.10/6.1 оно ненулевое только при использовании каких-то
специфических драйверов mxser.c / mips_ejtag_fdc.c / ipoctal.c, которые
инициализируют его с tty_port_alloc_xmit_buf(). В общих случаях оно
_всегда_ остаётся нулевым, отсюда видимо и проблемы с systemd и
отсутствием выдачи на консоль.
Скорее всего в старых ветках нужно проверять значение другого поля.
> + /* fix systemd hang, return buffer size if it is console */
Такой комментарий, если что, в любом случае был бы неуместен в коде
ядра, т.к. он всё равно не позволяет понять, что происходит, что за hang,
причём здесь systemd (как будто на нём свет клином сошёлся) и т.п.
> + if (port && uart_console(port))
> + ret = UART_XMIT_SIZE - 1;
> + else
> + ret = 0;
> + } else {
> + ret = uart_circ_chars_free(&state->xmit);
> + }
> uart_port_unlock(port, flags);
> return ret;
> }
> --
> 2.39.5
>
>
More information about the lvc-project
mailing list