aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/dev/syscons/syscons.c22
-rw-r--r--sys/dev/syscons/syscons.h10
-rw-r--r--sys/kern/subr_witness.c3
3 files changed, 13 insertions, 22 deletions
diff --git a/sys/dev/syscons/syscons.c b/sys/dev/syscons/syscons.c
index 7a02990b443b..695ff33a0659 100644
--- a/sys/dev/syscons/syscons.c
+++ b/sys/dev/syscons/syscons.c
@@ -343,7 +343,9 @@ sctty_outwakeup(struct tty *tp)
len = ttydisc_getc(tp, buf, sizeof buf);
if (len == 0)
break;
+ SC_VIDEO_LOCK(scp->sc);
sc_puts(scp, buf, len, 0);
+ SC_VIDEO_UNLOCK(scp->sc);
}
}
@@ -1760,6 +1762,8 @@ sc_cnputc(struct consdev *cd, int c)
/* assert(sc_console != NULL) */
+ SC_VIDEO_LOCK(scp->sc);
+
#ifndef SC_NO_HISTORY
if (scp == scp->sc->cur_scp && scp->status & SLKED) {
scp->status &= ~SLKED;
@@ -1793,6 +1797,7 @@ sc_cnputc(struct consdev *cd, int c)
s = spltty(); /* block sckbdevent and scrn_timer */
sccnupdate(scp);
splx(s);
+ SC_VIDEO_UNLOCK(scp->sc);
}
static int
@@ -2726,24 +2731,14 @@ exchange_scr(sc_softc_t *sc)
static void
sc_puts(scr_stat *scp, u_char *buf, int len, int kernel)
{
- int need_unlock = 0;
-
#ifdef DEV_SPLASH
/* make screensaver happy */
if (!sticky_splash && scp == scp->sc->cur_scp && !sc_saver_keyb_only)
run_scrn_saver = FALSE;
#endif
- if (scp->tsw) {
- if (!kdb_active && !mtx_owned(&scp->sc->scr_lock)) {
- need_unlock = 1;
- mtx_lock_spin(&scp->sc->scr_lock);
- }
+ if (scp->tsw)
(*scp->tsw->te_puts)(scp, buf, len, kernel);
- if (need_unlock)
- mtx_unlock_spin(&scp->sc->scr_lock);
- }
-
if (scp->sc->delayed_next_scr)
sc_switch_scr(scp->sc, scp->sc->delayed_next_scr - 1);
}
@@ -2906,10 +2901,8 @@ scinit(int unit, int flags)
* disappeared...
*/
sc = sc_get_softc(unit, flags & SC_KERNEL_CONSOLE);
- if ((sc->flags & SC_INIT_DONE) == 0) {
- mtx_init(&sc->scr_lock, "scrlock", NULL, MTX_SPIN);
+ if ((sc->flags & SC_INIT_DONE) == 0)
SC_VIDEO_LOCKINIT(sc);
- }
adp = NULL;
if (sc->adapter >= 0) {
@@ -3126,7 +3119,6 @@ scterm(int unit, int flags)
(*scp->tsw->te_term)(scp, &scp->ts);
if (scp->ts != NULL)
free(scp->ts, M_DEVBUF);
- mtx_destroy(&sc->scr_lock);
mtx_destroy(&sc->video_mtx);
/* clear the structure */
diff --git a/sys/dev/syscons/syscons.h b/sys/dev/syscons/syscons.h
index 6521a2726001..f507be549210 100644
--- a/sys/dev/syscons/syscons.h
+++ b/sys/dev/syscons/syscons.h
@@ -34,8 +34,9 @@
#ifndef _DEV_SYSCONS_SYSCONS_H_
#define _DEV_SYSCONS_SYSCONS_H_
-#include <sys/lock.h>
-#include <sys/mutex.h>
+#include <sys/kdb.h> /* XXX */
+#include <sys/_lock.h>
+#include <sys/_mutex.h>
/* machine-dependent part of the header */
@@ -239,7 +240,6 @@ typedef struct sc_softc {
/* 2 is just enough for kdb to grab for stepping normal grabbing: */
struct sc_cnstate grab_state[2];
int kbd_open_level;
- struct mtx scr_lock; /* mutex for sc_puts() */
struct mtx video_mtx;
long scrn_time_stamp;
@@ -547,12 +547,12 @@ typedef struct {
MTX_SPIN | MTX_RECURSE);
#define SC_VIDEO_LOCK(sc) \
do { \
- if (!cold) \
+ if (!kdb_active) \
mtx_lock_spin(&(sc)->video_mtx); \
} while(0)
#define SC_VIDEO_UNLOCK(sc) \
do { \
- if (!cold) \
+ if (!kdb_active) \
mtx_unlock_spin(&(sc)->video_mtx); \
} while(0)
diff --git a/sys/kern/subr_witness.c b/sys/kern/subr_witness.c
index 17d1f2109c37..be3ca31df356 100644
--- a/sys/kern/subr_witness.c
+++ b/sys/kern/subr_witness.c
@@ -645,7 +645,6 @@ static struct witness_order_list_entry order_lists[] = {
#endif
{ "rm.mutex_mtx", &lock_class_mtx_spin },
{ "sio", &lock_class_mtx_spin },
- { "scrlock", &lock_class_mtx_spin },
#ifdef __i386__
{ "cy", &lock_class_mtx_spin },
#endif
@@ -661,6 +660,7 @@ static struct witness_order_list_entry order_lists[] = {
{ "pmc-per-proc", &lock_class_mtx_spin },
#endif
{ "process slock", &lock_class_mtx_spin },
+ { "syscons video lock", &lock_class_mtx_spin },
{ "sleepq chain", &lock_class_mtx_spin },
{ "rm_spinlock", &lock_class_mtx_spin },
{ "turnstile chain", &lock_class_mtx_spin },
@@ -669,7 +669,6 @@ static struct witness_order_list_entry order_lists[] = {
{ "td_contested", &lock_class_mtx_spin },
{ "callout", &lock_class_mtx_spin },
{ "entropy harvest mutex", &lock_class_mtx_spin },
- { "syscons video lock", &lock_class_mtx_spin },
#ifdef SMP
{ "smp rendezvous", &lock_class_mtx_spin },
#endif