linux/drivers/tty/serial
Wander Lairson Costa 5021d709b3 tty: serial: Use fifo in 8250 console driver
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 <wander@redhat.com>
Link: https://lore.kernel.org/r/20211222112831.1968392-2-wander@redhat.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2021-12-30 13:19:49 +01:00
..
8250 tty: serial: Use fifo in 8250 console driver 2021-12-30 13:19:49 +01:00
cpm_uart serial: cpm_uart: Protect udbg definitions by CONFIG_SERIAL_CPM_CONSOLE 2021-10-30 11:01:48 +02:00
jsm tty: serial: jsm: hold port lock when reporting modem line changes 2021-07-21 12:36:48 +02:00
21285.c tty: serial: 21285: fix lockup on open 2020-10-28 13:39:14 +01:00
altera_jtaguart.c serial: altera_jtaguart: drop low-latency workaround 2021-04-22 12:09:24 +02:00
altera_uart.c serial: altera_uart: drop low-latency workaround 2021-04-22 12:09:24 +02:00
amba-pl010.c serial: amba-pl010: drop low-latency workaround 2021-04-22 12:09:24 +02:00
amba-pl011.c Merge 5.16-rc4 into tty-next 2021-12-06 09:32:47 +01:00
amba-pl011.h
apbuart.c serial: apbuart: drop low-latency workaround 2021-04-22 12:09:25 +02:00
apbuart.h
ar933x_uart.c serial: ar933x: drop low-latency workaround 2021-04-22 12:09:25 +02:00
arc_uart.c tty: cumulate and document tty_struct::flow* members 2021-05-13 16:57:16 +02:00
atmel_serial.c serial: atmel: Use platform_get_irq() to get the interrupt 2021-12-17 17:57:37 +01:00
atmel_serial.h tty: serial: Use the correct style for SPDX License Identifier 2020-03-07 09:52:01 +01:00
bcm63xx_uart.c serial: bcm63xx: drop low-latency workaround 2021-04-22 12:09:25 +02:00
clps711x.c
digicolor-usart.c
dz.c tty: serial: dz: include <linux/io.h> instead of <asm/io.h> 2021-05-13 18:29:11 +02:00
dz.h
earlycon-arm-semihost.c
earlycon-riscv-sbi.c
earlycon.c earlycon: simplify earlycon-table implementation 2020-12-04 15:49:48 +01:00
fsl_linflexuart.c tty: serial: linflexuart: Remove redundant check to simplify the code 2021-08-26 14:51:04 +02:00
fsl_lpuart.c tty: serial: fsl_lpuart: Add i.MXRT1050 support 2021-12-17 18:00:21 +01:00
icom.c tty: serial: icom: include <linux/io.h> instead of <asm/io.h> 2021-05-13 18:29:11 +02:00
icom.h tty: serial: Use the correct style for SPDX License Identifier 2020-03-07 09:52:01 +01:00
imx_earlycon.c tty: serial: imx: add imx earlycon driver 2020-07-29 17:11:02 +02:00
imx.c tty: serial: imx: disable UCR4_OREN in .stop_rx() instead of .shutdown() 2021-11-25 18:38:21 +01:00
ip22zilog.c tty: serial: ip22zilog: include <linux/io.h> instead of <asm/io.h> 2021-05-13 18:29:12 +02:00
ip22zilog.h
Kconfig tty: serial: samsung: Enable console as module 2021-12-20 16:54:10 +01:00
kgdb_nmi.c tty: drop put_tty_driver 2021-07-27 12:17:21 +02:00
kgdboc.c Linux 5.8-rc6 2020-07-20 09:39:11 +02:00
lantiq.c serial: lantiq: Use platform_get_irq() to get the interrupt 2021-12-17 17:56:34 +01:00
liteuart.c serial: liteuart: fix minor-number leak on probe errors 2021-11-25 18:25:49 +01:00
lpc32xx_hs.c tty: drivers/tty/, stop using tty_schedule_flip() 2021-11-25 18:35:23 +01:00
Makefile Revert "tty: serial: Add UART driver for Cortina-Access platform" 2021-06-24 14:46:32 +02:00
max310x.c serial: max310x: Make max310x_remove() return void 2021-10-13 14:33:59 +02:00
max3100.c tty_port: drop last traces of low_latency 2021-01-07 16:17:32 +01:00
mcf.c serial: mcf: drop low-latency workaround 2021-04-22 12:09:25 +02:00
men_z135_uart.c tty: serial, fix kernel-doc 2020-08-18 13:51:18 +02:00
meson_uart.c tty: serial: meson: retrieve port FIFO size from DT 2021-05-20 16:11:20 +02:00
milbeaut_usio.c
mpc52xx_uart.c serial: mpc52xx_uart: drop low-latency workaround 2021-04-22 12:09:25 +02:00
mps2-uart.c
msm_serial.c tty: serial: msm_serial: Deactivate RX DMA for polling support 2021-11-25 18:23:34 +01:00
mux.c parisc: Make struct parisc_driver::remove() return void 2021-08-30 10:18:25 +02:00
mvebu-uart.c serial: mvebu-uart: fix driver's tx_empty callback 2021-09-14 10:07:10 +02:00
mxs-auart.c tty: make use of tty_get_{char,frame}_size 2021-06-15 14:03:27 +02:00
omap-serial.c serial: omap: Disable PM runtime autoidle to remove pm_runtime_irq_safe() 2021-07-29 17:03:04 +02:00
owl-uart.c serial: owl: drop low-latency workaround 2021-04-22 12:09:25 +02:00
pch_uart.c serial: pch_uart: fix build error with !CONFIG_DEBUG_FS 2021-03-23 10:31:09 +01:00
pic32_uart.c serial: pic32_uart: Use uart_console() helper 2020-03-12 10:00:22 +01:00
pic32_uart.h tty: serial: Use the correct style for SPDX License Identifier 2020-03-07 09:52:01 +01:00
pmac_zilog.c tty: serial: pmac_zilog: include <linux/io.h> insteiad of <asm/io.h> 2021-05-13 18:29:12 +02:00
pmac_zilog.h tty: serial: pmac_zilog: Remove unused disposable variable 'garbage' 2020-11-13 15:28:27 +01:00
pxa.c
qcom_geni_serial.c serial: qcom_geni_serial: use DT aliases according to DT bindings 2021-06-24 14:51:28 +02:00
rda-uart.c serial: rda: drop low-latency workaround 2021-04-22 12:09:26 +02:00
rp2.c serial: rp2: use 'request_firmware' instead of 'request_firmware_nowait' 2021-05-21 20:34:02 +02:00
sa1100.c serial: sa1100: drop low-latency workaround 2021-04-22 12:09:26 +02:00
samsung_tty.c tty: serial: samsung: Fix console registration from module 2021-12-20 16:54:37 +01:00
sb1250-duart.c tty: serial: sb1250-duart: include <linux/io.h> instead of <asm/io.h> 2021-05-13 18:29:12 +02:00
sc16is7xx.c serial: sc16is7xx: Make sc16is7xx_remove() return void 2021-10-13 14:34:07 +02:00
sccnxp.c
serial_core.c Merge 5.16-rc4 into tty-next 2021-12-06 09:32:47 +01:00
serial_mctrl_gpio.c serial: mctrl_gpio: Fix passing zero to 'ERR_PTR' warning 2020-11-06 17:12:05 +01:00
serial_mctrl_gpio.h tty: serial: Use the correct style for SPDX License Identifier 2020-03-07 09:52:01 +01:00
serial_txx9.c tty: serial: txx9: include <linux/io.h> instead of <asm/io.h> 2021-05-13 18:29:12 +02:00
serial-tegra.c serial: tegra: Change lower tolerance baud rate limit for tegra20 and tegra30 2021-11-25 18:26:32 +01:00
sh-sci.c serial: sh-sci: Remove BREAK/FRAME/PARITY/OVERRUN printouts 2021-12-20 16:55:56 +01:00
sh-sci.h serial: sh-sci: Add support for RZ/G2L SoC 2021-06-04 15:12:40 +02:00
sifive.c serial: sifive: set pointer to NULL rather than 0. 2021-10-05 14:54:21 +02:00
sprd_serial.c serial: sprd: remove redundant sprd_port cleanup 2020-03-18 12:20:04 +01:00
st-asc.c tty: serial: st-asc: Demote a kernel-doc formatting abuse 2021-05-20 17:06:17 +02:00
stm32-usart.c serial: stm32: push DMA RX data before suspending 2021-10-26 19:18:47 +02:00
stm32-usart.h serial: stm32: update throttle and unthrottle ops for dma mode 2021-10-21 10:36:29 +02:00
suncore.c
sunhv.c Revert "serial: sunhv: Initialize lock for non-registered console" 2020-07-21 18:21:49 +02:00
sunsab.c tty: serial: sunsab: include <linux/io.h> instead of <asm/io.h> 2021-05-13 18:29:12 +02:00
sunsab.h
sunsu.c tty: serial: sunsu: include <linux/io.h> instead of <asm/io.h> 2021-05-13 18:29:12 +02:00
sunzilog.c serial: sunzilog: Mark sunzilog_putchar() __maybe_unused 2021-10-26 19:15:04 +02:00
sunzilog.h
tegra-tcu.c serial: tegra-tcu: Reorder channel initialization 2021-06-15 14:02:06 +02:00
timbuart.c serial: timbuart: drop low-latency workaround 2021-04-22 12:09:26 +02:00
timbuart.h tty: serial: Use the correct style for SPDX License Identifier 2020-03-07 09:52:01 +01:00
uartlite.c tty: serial: uartlite: allow 64 bit address 2021-12-03 14:12:56 +01:00
ucc_uart.c firmware: replace HOTPLUG with UEVENT in FW_ACTION defines 2021-05-13 16:14:45 +02:00
vr41xx_siu.c tty: serial: vr41xx_siu: include <linux/io.h> instead of <asm/io.h> 2021-05-13 18:29:12 +02:00
vt8500_serial.c serial: vt8500: Use of_device_get_match_data 2021-08-26 14:51:10 +02:00
xilinx_uartps.c serial: xilinx_uartps: Fix race condition causing stuck TX 2021-10-26 19:17:05 +02:00
zs.c
zs.h