[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