[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