From nobody Mon Jun 22 21:33:50 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4B89CC433EF for ; Wed, 16 Mar 2022 14:37:39 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S245115AbiCPOiv (ORCPT ); Wed, 16 Mar 2022 10:38:51 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36474 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242336AbiCPOir (ORCPT ); Wed, 16 Mar 2022 10:38:47 -0400 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id B0A8352E2E for ; Wed, 16 Mar 2022 07:37:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1647441452; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=46hIDjyKphqtbInFWiNIIVInDMU/QR9kVXm66RmjIvo=; b=TDbaIDviHwFsBV/4Tp89tkhgq/8FDU0+fwGQOLZisVbwL+fSbRYv0MPE5gccuPdMsI5RYI 8Gm3AZZWszptifH3E0kVUNxVkH3n6Pwkv5UIwdTFHKoK0CUbr2PeaHcq4jM51D8IhQxEp+ dHkKwXz37Nc4vGpWs4NhAXS1zhPIofg= Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-286-rXzbfaPKNEqOafpE0uKuUw-1; Wed, 16 Mar 2022 10:37:30 -0400 X-MC-Unique: rXzbfaPKNEqOafpE0uKuUw-1 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.rdu2.redhat.com [10.11.54.1]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id B69F23C23FAA; Wed, 16 Mar 2022 14:37:29 +0000 (UTC) Received: from fedora.redhat.com (unknown [10.22.19.38]) by smtp.corp.redhat.com (Postfix) with ESMTP id 853F2404D8F1; Wed, 16 Mar 2022 14:37:26 +0000 (UTC) From: Wander Lairson Costa To: Greg Kroah-Hartman , Jiri Slaby , Wander Lairson Costa , Johan Hovold , "Maciej W. Rozycki" , Serge Semin , Lukas Wunner , =?UTF-8?q?Pali=20Roh=C3=A1r?= , linux-serial@vger.kernel.org (open list:SERIAL DRIVERS), linux-kernel@vger.kernel.org (open list) Cc: rostedt@goodmis.org, senozhatsky@chromium.org, andre.goddard@gmail.com, sudipm.mukherjee@gmail.com, andy.shevchenko@gmail.com, David.Laight@aculab.com, jonathanh@nvidia.com, phil@raspberrypi.com Subject: [PATCH v4 1/5] serial/8250: Use fifo in 8250 console driver Date: Wed, 16 Mar 2022 11:36:40 -0300 Message-Id: <20220316143646.13301-2-wander@redhat.com> In-Reply-To: <20220316143646.13301-1-wander@redhat.com> References: <20220316143646.13301-1-wander@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 2.84 on 10.11.54.1 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Note: I am using a small test app + driver located at [0] for the problem description. serco is a driver whose write function dispatches to the serial controller. sertest is a user-mode app that writes n bytes to the serial console using the serco driver. While investigating a bug in the RHEL kernel, I noticed that the serial console throughput is way below the configured speed of 115200 bps in a HP Proliant DL380 Gen9. I was expecting something above 10KB/s, but I got 2.5KB/s. $ time ./sertest -n 2500 /tmp/serco real 0m0.997s user 0m0.000s sys 0m0.997s With the help of the function tracer, I then noticed the serial controller was taking around 410us seconds to dispatch one single byte: $ trace-cmd record -p function_graph -g serial8250_console_write \ ./sertest -n 1 /tmp/serco $ trace-cmd report | serial8250_console_write() { 0.384 us | _raw_spin_lock_irqsave(); 1.836 us | io_serial_in(); 1.667 us | io_serial_out(); | uart_console_write() { | serial8250_console_putchar() { | wait_for_xmitr() { 1.870 us | io_serial_in(); 2.238 us | } 1.737 us | io_serial_out(); 4.318 us | } 4.675 us | } | wait_for_xmitr() { 1.635 us | io_serial_in(); | __const_udelay() { 1.125 us | delay_tsc(); 1.429 us | } ... ... ... 1.683 us | io_serial_in(); | __const_udelay() { 1.248 us | delay_tsc(); 1.486 us | } 1.671 us | io_serial_in(); 411.342 us | } In another machine, I measured a throughput of 11.5KB/s, with the serial controller taking between 80-90us to send each byte. That matches the expected throughput for a configuration of 115200 bps. This patch changes the serial8250_console_write to use the 16550 fifo if available. In my benchmarks I got around 25% improvement in the slow machine, and no performance penalty in the fast machine. Signed-off-by: Wander Lairson Costa Link: https://lore.kernel.org/r/20211222112831.1968392-2-wander@redhat.com Signed-off-by: Greg Kroah-Hartman --- drivers/tty/serial/8250/8250_port.c | 61 ++++++++++++++++++++++++++--- 1 file changed, 55 insertions(+), 6 deletions(-) diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/= 8250_port.c index 3b12bfc1ed67..2abb3de11a48 100644 --- a/drivers/tty/serial/8250/8250_port.c +++ b/drivers/tty/serial/8250/8250_port.c @@ -2056,10 +2056,7 @@ static void serial8250_break_ctl(struct uart_port *p= ort, int break_state) serial8250_rpm_put(up); } =20 -/* - * Wait for transmitter & holding register to empty - */ -static void wait_for_xmitr(struct uart_8250_port *up, int bits) +static void wait_for_lsr(struct uart_8250_port *up, int bits) { unsigned int status, tmout =3D 10000; =20 @@ -2076,6 +2073,16 @@ static void wait_for_xmitr(struct uart_8250_port *up= , int bits) udelay(1); touch_nmi_watchdog(); } +} + +/* + * Wait for transmitter & holding register to empty + */ +static void wait_for_xmitr(struct uart_8250_port *up, int bits) +{ + unsigned int tmout; + + wait_for_lsr(up, bits); =20 /* Wait up to 1s for flow control if necessary */ if (up->port.flags & UPF_CONS_FLOW) { @@ -3325,6 +3332,35 @@ static void serial8250_console_restore(struct uart_8= 250_port *up) serial8250_out_MCR(up, UART_MCR_DTR | UART_MCR_RTS); } =20 +/* + * Print a string to the serial port using the device FIFO + * + * It sends fifosize bytes and then waits for the fifo + * to get empty. + */ +static void serial8250_console_fifo_write(struct uart_8250_port *up, + const char *s, unsigned int count) +{ + int i; + const char *end =3D s + count; + unsigned int fifosize =3D up->port.fifosize; + bool cr_sent =3D false; + + while (s !=3D end) { + wait_for_lsr(up, UART_LSR_THRE); + + for (i =3D 0; i < fifosize && s !=3D end; ++i) { + if (*s =3D=3D '\n' && !cr_sent) { + serial_out(up, UART_TX, '\r'); + cr_sent =3D true; + } else { + serial_out(up, UART_TX, *s++); + cr_sent =3D false; + } + } + } +} + /* * Print a string to the serial port trying not to disturb * any possible real use of the port... @@ -3340,7 +3376,7 @@ void serial8250_console_write(struct uart_8250_port *= up, const char *s, struct uart_8250_em485 *em485 =3D up->em485; struct uart_port *port =3D &up->port; unsigned long flags; - unsigned int ier; + unsigned int ier, use_fifo; int locked =3D 1; =20 touch_nmi_watchdog(); @@ -3372,7 +3408,20 @@ void serial8250_console_write(struct uart_8250_port = *up, const char *s, mdelay(port->rs485.delay_rts_before_send); } =20 - uart_console_write(port, s, count, serial8250_console_putchar); + use_fifo =3D (up->capabilities & UART_CAP_FIFO) && + port->fifosize > 1 && + (serial_port_in(port, UART_FCR) & UART_FCR_ENABLE_FIFO) && + /* + * After we put a data in the fifo, the controller will send + * it regardless of the CTS state. Therefore, only use fifo + * if we don't use control flow. + */ + !(up->port.flags & UPF_CONS_FLOW); + + if (likely(use_fifo)) + serial8250_console_fifo_write(up, s, count); + else + uart_console_write(port, s, count, serial8250_console_putchar); =20 /* * Finally, wait for transmitter to become empty --=20 2.35.1 From nobody Mon Jun 22 21:33:50 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id EA6F9C433EF for ; Wed, 16 Mar 2022 14:37:51 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1348718AbiCPOjE (ORCPT ); Wed, 16 Mar 2022 10:39:04 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36606 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1344238AbiCPOiy (ORCPT ); Wed, 16 Mar 2022 10:38:54 -0400 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 287D153B42 for ; Wed, 16 Mar 2022 07:37:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1647441459; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=cQKY17K5M4BrRuM2rlw2MvxoRzLJI6+f/LllmsWpF+I=; b=ZEEHqOiqj0e5s5Lqwffy04kDtS0d+SZOoHPPeKD5jYQYz2B1KweiEaVSesKqLhMUGMYS56 QMh3gH8a32cOF8QxuzylVh2vodr+UT+dRh62UYODs2fnQsvpCXYAfDt509I03/6VEtmUik T4caCi6ErLa2VkW7MvQOamSZzZLa6MM= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-631-5OMsHSpZOEiI2NivE8y1Rg-1; Wed, 16 Mar 2022 10:37:36 -0400 X-MC-Unique: 5OMsHSpZOEiI2NivE8y1Rg-1 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.rdu2.redhat.com [10.11.54.1]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 277351066558; Wed, 16 Mar 2022 14:37:35 +0000 (UTC) Received: from fedora.redhat.com (unknown [10.22.19.38]) by smtp.corp.redhat.com (Postfix) with ESMTP id E6895400F73E; Wed, 16 Mar 2022 14:37:31 +0000 (UTC) From: Wander Lairson Costa To: Greg Kroah-Hartman , Jiri Slaby , Johan Hovold , Wander Lairson Costa , "Maciej W. Rozycki" , Serge Semin , Lukas Wunner , =?UTF-8?q?Pali=20Roh=C3=A1r?= , linux-serial@vger.kernel.org (open list:SERIAL DRIVERS), linux-kernel@vger.kernel.org (open list) Cc: rostedt@goodmis.org, senozhatsky@chromium.org, andre.goddard@gmail.com, sudipm.mukherjee@gmail.com, andy.shevchenko@gmail.com, David.Laight@aculab.com, jonathanh@nvidia.com, phil@raspberrypi.com Subject: [PATCH v4 2/5] serial/8250: Use the cache value of the FCR register Date: Wed, 16 Mar 2022 11:36:41 -0300 Message-Id: <20220316143646.13301-3-wander@redhat.com> In-Reply-To: <20220316143646.13301-1-wander@redhat.com> References: <20220316143646.13301-1-wander@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 2.84 on 10.11.54.1 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" commit 5021d709b31b ("tty: serial: Use fifo in 8250 console driver") erroneous tries to read the FCR register content, but this register is write-only. This patch fixes that by reading the content from the port struct fcr field. Thanks to Jon Hunter and Jiri Slaby. Suggested-by: Jiri Slaby Reported-by: Jon Hunter Signed-off-by: Wander Lairson Costa --- drivers/tty/serial/8250/8250_port.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/= 8250_port.c index 2abb3de11a48..9f3fa9fe2a4e 100644 --- a/drivers/tty/serial/8250/8250_port.c +++ b/drivers/tty/serial/8250/8250_port.c @@ -3410,7 +3410,7 @@ void serial8250_console_write(struct uart_8250_port *= up, const char *s, =20 use_fifo =3D (up->capabilities & UART_CAP_FIFO) && port->fifosize > 1 && - (serial_port_in(port, UART_FCR) & UART_FCR_ENABLE_FIFO) && + (up->fcr & UART_FCR_ENABLE_FIFO) && /* * After we put a data in the fifo, the controller will send * it regardless of the CTS state. Therefore, only use fifo --=20 2.35.1 From nobody Mon Jun 22 21:33:50 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 189B4C433F5 for ; Wed, 16 Mar 2022 14:38:00 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1345126AbiCPOjL (ORCPT ); Wed, 16 Mar 2022 10:39:11 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37010 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1348341AbiCPOjE (ORCPT ); Wed, 16 Mar 2022 10:39:04 -0400 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id CFE8E55209 for ; Wed, 16 Mar 2022 07:37:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1647441464; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=+puTaoBs7ERRB7dXkYfJVCLixA5oMPMatpnqwUqkD1c=; b=Kr3l8m6MTwAxIts58nvJHPKgKfNQm6Iu5EZRKbhqvcouYhBHE41wr+aPAtl7VmtfsoQZxU aORghj6upIFfw5/u+Jqv76CHeikpcW8sjh9xidf3G82A5HXMfWt4z9zg6iMc3PHGntsxnS K6eGReSj9gdLe0BuKuy7OfFqaUHrZXM= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-358-MY4Rzgv_OJayCNmBJHCkRg-1; Wed, 16 Mar 2022 10:37:41 -0400 X-MC-Unique: MY4Rzgv_OJayCNmBJHCkRg-1 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.rdu2.redhat.com [10.11.54.1]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 68FE8811E83; Wed, 16 Mar 2022 14:37:40 +0000 (UTC) Received: from fedora.redhat.com (unknown [10.22.19.38]) by smtp.corp.redhat.com (Postfix) with ESMTP id 5B97B400F73E; Wed, 16 Mar 2022 14:37:37 +0000 (UTC) From: Wander Lairson Costa To: Greg Kroah-Hartman , Jiri Slaby , Wander Lairson Costa , Johan Hovold , "Maciej W. Rozycki" , Lukas Wunner , =?UTF-8?q?Pali=20Roh=C3=A1r?= , linux-serial@vger.kernel.org (open list:SERIAL DRIVERS), linux-kernel@vger.kernel.org (open list) Cc: rostedt@goodmis.org, senozhatsky@chromium.org, andre.goddard@gmail.com, sudipm.mukherjee@gmail.com, andy.shevchenko@gmail.com, David.Laight@aculab.com, jonathanh@nvidia.com, phil@raspberrypi.com Subject: [PATCH v4 3/5] serial/8250: Use tx_loadsz as the transmitter fifo size Date: Wed, 16 Mar 2022 11:36:42 -0300 Message-Id: <20220316143646.13301-4-wander@redhat.com> In-Reply-To: <20220316143646.13301-1-wander@redhat.com> References: <20220316143646.13301-1-wander@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 2.84 on 10.11.54.1 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Using port_fifosize as the fifo size to transmit data to the serial console causes data loss in some controllers. Use the correct tx_loadsz field. Thanks to Jon Hunter for reporting the issue. Reported-by: Jon Hunter Tested-by: Jon Hunter Fixes: 5021d709b31b ("tty: serial: Use fifo in 8250 console driver") Signed-off-by: Wander Lairson Costa --- drivers/tty/serial/8250/8250_port.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/= 8250_port.c index 9f3fa9fe2a4e..d3a93e5d55f7 100644 --- a/drivers/tty/serial/8250/8250_port.c +++ b/drivers/tty/serial/8250/8250_port.c @@ -3343,7 +3343,7 @@ static void serial8250_console_fifo_write(struct uart= _8250_port *up, { int i; const char *end =3D s + count; - unsigned int fifosize =3D up->port.fifosize; + unsigned int fifosize =3D up->tx_loadsz; bool cr_sent =3D false; =20 while (s !=3D end) { @@ -3409,7 +3409,7 @@ void serial8250_console_write(struct uart_8250_port *= up, const char *s, } =20 use_fifo =3D (up->capabilities & UART_CAP_FIFO) && - port->fifosize > 1 && + up->tx_loadsz > 1 && (up->fcr & UART_FCR_ENABLE_FIFO) && /* * After we put a data in the fifo, the controller will send --=20 2.35.1 From nobody Mon Jun 22 21:33:50 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3C3F8C433EF for ; Wed, 16 Mar 2022 14:38:05 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1356549AbiCPOjR (ORCPT ); Wed, 16 Mar 2022 10:39:17 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37374 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1352078AbiCPOjI (ORCPT ); Wed, 16 Mar 2022 10:39:08 -0400 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 340CC1153 for ; Wed, 16 Mar 2022 07:37:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1647441470; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=AZaBOHHPLNjvfmElpKvHnRzsqHkOS0kCz5AlxDf27Y0=; b=AgUy5px7iuBosQ6mnMzRa3xE2wp/T9V/VtFqnpa/6fDXykEHjJ5gUFIWutmJap3ILSFgeF l680IHaiQBvma1X2c6Si0IODk0R1iUHwdYMEjBSjkqHVD8LUq2C0a+PuqZBHFAQ0teN5xQ Sf4NiIAPZySkj1e46wNNr1JQm1pS2wo= Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-83-6djy7wGgOFS_AAbKSifDNg-1; Wed, 16 Mar 2022 10:37:46 -0400 X-MC-Unique: 6djy7wGgOFS_AAbKSifDNg-1 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.rdu2.redhat.com [10.11.54.1]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id D3A2529DD9A7; Wed, 16 Mar 2022 14:37:45 +0000 (UTC) Received: from fedora.redhat.com (unknown [10.22.19.38]) by smtp.corp.redhat.com (Postfix) with ESMTP id A1BB6400F73E; Wed, 16 Mar 2022 14:37:42 +0000 (UTC) From: Wander Lairson Costa To: Greg Kroah-Hartman , Jiri Slaby , Wander Lairson Costa , Johan Hovold , "Maciej W. Rozycki" , Serge Semin , Lukas Wunner , =?UTF-8?q?Pali=20Roh=C3=A1r?= , linux-serial@vger.kernel.org (open list:SERIAL DRIVERS), linux-kernel@vger.kernel.org (open list) Cc: rostedt@goodmis.org, senozhatsky@chromium.org, andre.goddard@gmail.com, sudipm.mukherjee@gmail.com, andy.shevchenko@gmail.com, David.Laight@aculab.com, jonathanh@nvidia.com, phil@raspberrypi.com Subject: [PATCH v4 4/5] serial/8250: exclude BCM283x from console_fifo_write Date: Wed, 16 Mar 2022 11:36:43 -0300 Message-Id: <20220316143646.13301-5-wander@redhat.com> In-Reply-To: <20220316143646.13301-1-wander@redhat.com> References: <20220316143646.13301-1-wander@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 2.84 on 10.11.54.1 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From Phil's original patch: """ The mini-UART on BCM283x is doubly crippled - it has 8-byte FIFOs and the THRE bit indicates that the TX FIFO is not-full rather than empty. The optimisation to enable the use of the FIFO assumes that it is safe to write fifosize bytes whenever THRE is set, but the BCM283x quirk (indicated by the presence of UART_CAP_MINI) makes it necessary to check the FIFO state after each byte. See: https://github.com/raspberrypi/linux/issues/4849 """ Thanks to Phil Elwell for reporting the issue and providing the original patch. Reported-by: Phil Elwell Co-author: Phil Elwell Signed-off-by: Wander Lairson Costa --- drivers/tty/serial/8250/8250_port.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/= 8250_port.c index d3a93e5d55f7..4acf620be241 100644 --- a/drivers/tty/serial/8250/8250_port.c +++ b/drivers/tty/serial/8250/8250_port.c @@ -3409,6 +3409,11 @@ void serial8250_console_write(struct uart_8250_port = *up, const char *s, } =20 use_fifo =3D (up->capabilities & UART_CAP_FIFO) && + /* + * BCM283x requires to check the fifo + * after each byte. + */ + !(up->capabilities & UART_CAP_MINI) && up->tx_loadsz > 1 && (up->fcr & UART_FCR_ENABLE_FIFO) && /* --=20 2.35.1 From nobody Mon Jun 22 21:33:50 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id A1B60C433EF for ; Wed, 16 Mar 2022 14:38:12 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1356689AbiCPOjX (ORCPT ); Wed, 16 Mar 2022 10:39:23 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37566 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1350119AbiCPOjK (ORCPT ); Wed, 16 Mar 2022 10:39:10 -0400 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 10A8D614F for ; Wed, 16 Mar 2022 07:37:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1647441473; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=FdaRFj6Txp5dVh+5ToS7luAujkKT+3c923Qns25TpZk=; b=GjWrayXvHTOPiXT5oLEmbk3pJ47Lk5ACFAY5ZhcYnQHoNt72J60Ehs8xpUSuZBk4MTjMuF cUtBagfNoREKE3GtvMz4j3xVAQZSGzUGdvD5CrwsrB8agOn4mScunSqKQ7jKeMnwdEMB3F EdAW8LYjO0/6v/6MAky5Qk4IIs3nAxA= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-520-PX3TcyXXMn21kXKpX9Klgg-1; Wed, 16 Mar 2022 10:37:52 -0400 X-MC-Unique: PX3TcyXXMn21kXKpX9Klgg-1 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.rdu2.redhat.com [10.11.54.1]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 453D91801388; Wed, 16 Mar 2022 14:37:51 +0000 (UTC) Received: from fedora.redhat.com (unknown [10.22.19.38]) by smtp.corp.redhat.com (Postfix) with ESMTP id 132C1400F73E; Wed, 16 Mar 2022 14:37:47 +0000 (UTC) From: Wander Lairson Costa To: Greg Kroah-Hartman , Jiri Slaby , Johan Hovold , Wander Lairson Costa , "Maciej W. Rozycki" , Serge Semin , Lukas Wunner , =?UTF-8?q?Pali=20Roh=C3=A1r?= , linux-serial@vger.kernel.org (open list:SERIAL DRIVERS), linux-kernel@vger.kernel.org (open list) Cc: rostedt@goodmis.org, senozhatsky@chromium.org, andre.goddard@gmail.com, sudipm.mukherjee@gmail.com, andy.shevchenko@gmail.com, David.Laight@aculab.com, jonathanh@nvidia.com, phil@raspberrypi.com Subject: [PATCH v4 5/5] serial/8250: Only use fifo after the port is initialized in console_write Date: Wed, 16 Mar 2022 11:36:44 -0300 Message-Id: <20220316143646.13301-6-wander@redhat.com> In-Reply-To: <20220316143646.13301-1-wander@redhat.com> References: <20220316143646.13301-1-wander@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 2.84 on 10.11.54.1 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" The serial driver set the value of uart_8250_port.fcr in the function serial8250_config_port, but only writes the value to the controller register later in the initalization code. That opens a small window in which is not safe to use the fifo for console write. Make sure the port is initialized correctly before reading the FCR cached value. Unfortunately, I lost track of who originally reported the issue. If s/he is reading this, please speak up so I can give you the due credit. Signed-off-by: Wander Lairson Costa --- drivers/tty/serial/8250/8250_port.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/= 8250_port.c index 4acf620be241..7e2227161555 100644 --- a/drivers/tty/serial/8250/8250_port.c +++ b/drivers/tty/serial/8250/8250_port.c @@ -3416,6 +3416,7 @@ void serial8250_console_write(struct uart_8250_port *= up, const char *s, !(up->capabilities & UART_CAP_MINI) && up->tx_loadsz > 1 && (up->fcr & UART_FCR_ENABLE_FIFO) && + test_bit(TTY_PORT_INITIALIZED, &port->state->port.iflags) && /* * After we put a data in the fifo, the controller will send * it regardless of the CTS state. Therefore, only use fifo --=20 2.35.1