HomeFreeBSD

teken, vt(4): New callbacks to lock the terminal once

Description

teken, vt(4): New callbacks to lock the terminal once

... to process input, instead of inside each smaller operations such as
appending a character or moving the cursor forward.

In other words, before we were doing (oversimplified):

teken_input()
  <for each input character>
    vtterm_putchar()
      VTBUF_LOCK()
      VTBUF_UNLOCK()
    vtterm_cursor_position()
      VTBUF_LOCK()
      VTBUF_UNLOCK()

Now, we are doing:

vtterm_pre_input()
  VTBUF_LOCK()
teken_input()
  <for each input character>
    vtterm_putchar()
    vtterm_cursor_position()
vtterm_post_input()
  VTBUF_UNLOCK()

The situation was even worse when the vtterm_copy() and vtterm_fill()
callbacks were involved.

The new callbacks are:

  • struct terminal_class->tc_pre_input()
  • struct terminal_class->tc_post_input()

They are called in teken_input(), surrounding the while() loop.

The goal is to improve input processing speed of vt(4). As a benchmark,
here is the time taken to write a text file of 360 000 lines (26 MiB) on
ttyv0:

  • vt(4), unmodified: 1500 ms
  • vt(4), with this patch: 1200 ms
  • syscons(4): 700 ms

This is on a Haswell laptop with a GENERIC-NODEBUG kernel.

At the same time, the locking is changed in the vt_flush() function
which is responsible to draw the text on screen. So instead of
(indirectly) using VTBUF_LOCK() just to read and reset the dirty area
of the internal buffer, the lock is held for about the entire function,
including the drawing part.

The change is mostly visible while content is scrolling fast: before,
lines could appear garbled while scrolling because the internal buffer
was accessed without locks (once the scrolling was finished, the output
was correct). Now, the scrolling appears correct.

In the end, the locking model is closer to what syscons(4) does.

Differential Revision: https://reviews.freebsd.org/D15302

Details

Provenance
dumbbellAuthored on
Differential Revision
D15302: vt: Improve input performances + various small fixes
Parents
rS333668: Vendor import two upstream commits:
Branches
Unknown
Tags
Unknown