[lvc-project] [PATCH 6.1.y v2] serial: core: fix infinite loop in handle_tx() for PORT_UNKNOWN
Андрей Калачёв
kalachev at swemel.ru
Mon Aug 24 14:37:05 MSK 2026
Федор, пожалуйста, продублируйте свои замечания в трекере задачи:
<https://gitlab.linuxtesting.ru/lvc/kernel-bdu/-/issues/543>
Предлагаю продолжить обсуждение патчей там.
22.08.2026 13:11, Fedor Pchelkin пишет:
> 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
>>
>>
--
С уважением,
Калачев А.А.
АО "МВП "СВЕМЕЛ"
Тел.: +79161968804
kalachev at swemel.ru
More information about the lvc-project
mailing list