vt: Do not lock request comming from terminal

only those originated by mouse.  Because the terminal surrounds
requests to vt(4) with locking.

Reported by:	bz, adrian
Reviewed by:	adrian, glebius
Approved by:	glebius (mentor)
MFC after:	2 weeks
Differential Revision:	https://reviews.freebsd.org/D57442
This commit is contained in:
Aleksandr Rybalko
2026-06-11 16:33:49 +03:00
parent ee13bfb694
commit 1f68ca5802
+14 -3
View File
@@ -45,6 +45,7 @@ static MALLOC_DEFINE(M_VTBUF, "vtbuf", "vt buffer");
#define VTBUF_LOCK(vb) mtx_lock_spin(&(vb)->vb_lock)
#define VTBUF_UNLOCK(vb) mtx_unlock_spin(&(vb)->vb_lock)
#define VTBUF_LOCK_OWNED(vb) mtx_owned(&(vb)->vb_lock)
#define POS_INDEX(c, r) (((r) << 12) + (c))
#define POS_COPY(d, s) do { \
@@ -740,9 +741,19 @@ vtbuf_flush_mark(struct vt_buf *vb)
area.tr_end.tp_col = vb->vb_scr_size.tp_col;
area.tr_end.tp_row = MAX(s, e) + 1;
VTBUF_LOCK(vb);
vtbuf_dirty(vb, &area);
VTBUF_UNLOCK(vb);
/*
* If the request originates from a keyboard, the vtbuf is
* locked by teken for the entire duration of the request.
* For all other sources, we avoid holding the spinlock for
* extended periods.
*/
if (VTBUF_LOCK_OWNED(vb)) {
vtbuf_dirty(vb, &area);
} else {
VTBUF_LOCK(vb);
vtbuf_dirty(vb, &area);
VTBUF_UNLOCK(vb);
}
}
}