syscons - Add need_unlock arg to sc_clean_up and sc_wait_scrn_saver_stop.
authorImre Vadász <imre@vdsz.com>
Tue, 29 Nov 2016 22:04:46 +0000 (23:04 +0100)
committerImre Vadász <imre@vdsz.com>
Thu, 1 Dec 2016 22:58:07 +0000 (23:58 +0100)
* This should fix issues with VT switching when the screen is blanked.

sys/dev/misc/syscons/scvidctl.c
sys/dev/misc/syscons/syscons.c
sys/dev/misc/syscons/syscons.h

index b0214cc..9038a40 100644 (file)
@@ -106,7 +106,7 @@ sc_set_text_mode(scr_stat *scp, struct tty *tp, int mode, int xsize, int ysize,
 
     /* stop screen saver, etc */
     crit_enter();
-    if ((error = sc_clean_up(scp))) {
+    if ((error = sc_clean_up(scp, FALSE))) {
        crit_exit();
        return error;
     }
@@ -196,7 +196,7 @@ sc_set_graphics_mode(scr_stat *scp, struct tty *tp, int mode)
 
     /* stop screen saver, etc */
     crit_enter();
-    if ((error = sc_clean_up(scp))) {
+    if ((error = sc_clean_up(scp, FALSE))) {
        crit_exit();
        return error;
     }
@@ -345,7 +345,7 @@ sc_set_pixel_mode(scr_stat *scp, struct tty *tp, int xsize, int ysize,
 
     /* stop screen saver, etc */
     crit_enter();
-    if ((error = sc_clean_up(scp))) {
+    if ((error = sc_clean_up(scp, FALSE))) {
        crit_exit();
        return error;
     }
@@ -662,7 +662,7 @@ sc_vid_ioctl(struct tty *tp, u_long cmd, caddr_t data, int flag)
                return EINVAL;
            }
            crit_enter();
-           if ((error = sc_clean_up(scp))) {
+           if ((error = sc_clean_up(scp, FALSE))) {
                crit_exit();
                lwkt_reltoken(&tty_token);
                return error;
@@ -693,7 +693,7 @@ sc_vid_ioctl(struct tty *tp, u_long cmd, caddr_t data, int flag)
                                         scp->font_height);
            }
            crit_enter();
-           if ((error = sc_clean_up(scp))) {
+           if ((error = sc_clean_up(scp, FALSE))) {
                crit_exit();
                lwkt_reltoken(&tty_token);
                return error;
@@ -714,7 +714,7 @@ sc_vid_ioctl(struct tty *tp, u_long cmd, caddr_t data, int flag)
 
        case KD_GRAPHICS:       /* switch to GRAPHICS (unknown) mode */
            crit_enter();
-           if ((error = sc_clean_up(scp))) {
+           if ((error = sc_clean_up(scp, FALSE))) {
                crit_exit();
                lwkt_reltoken(&tty_token);
                return error;
@@ -864,7 +864,7 @@ sc_update_render(scr_stat *scp)
 
        scp->rndr = rndr;
        /* Mostly copied from sc_set_text_mode */
-       if ((error = sc_clean_up(scp))) {
+       if ((error = sc_clean_up(scp, FALSE))) {
                crit_exit();
                return;
        }
index 236e824..af4ea13 100644 (file)
@@ -197,7 +197,7 @@ static int remove_scrn_saver(void (*this_saver)(sc_softc_t *, int));
 static int set_scrn_saver_mode(scr_stat *scp, int mode, u_char *pal, int border);
 static int restore_scrn_saver_mode(scr_stat *scp, int changemode);
 static void stop_scrn_saver(sc_softc_t *sc, void (*saver)(sc_softc_t *, int));
-static int wait_scrn_saver_stop(sc_softc_t *sc);
+static int wait_scrn_saver_stop(sc_softc_t *sc, int need_unlock);
 #define scsplash_stick(stick)          (sticky_splash = (stick))
 #else /* !NSPLASH */
 #define scsplash_stick(stick)
@@ -1082,7 +1082,7 @@ scioctl(struct dev_ioctl_args *ap)
            scsplash_stick(FALSE);
            saver_mode = *(int *)data;
 #if NSPLASH > 0
-           if ((error = wait_scrn_saver_stop(NULL))) {
+           if ((error = wait_scrn_saver_stop(NULL, TRUE))) {
                syscons_unlock();
                lwkt_reltoken(&tty_token);
                return error;
@@ -1248,7 +1248,7 @@ scioctl(struct dev_ioctl_args *ap)
     case VT_ACTIVATE:          /* switch to screen *data */
        i = (*(int *)data == 0) ? scp->index : (*(int *)data - 1);
        syscons_lock();
-       sc_clean_up(sc->cur_scp);
+       sc_clean_up(sc->cur_scp, TRUE);
        error = sc_switch_scr(sc, i);
        syscons_unlock();
        lwkt_reltoken(&tty_token);
@@ -1261,7 +1261,7 @@ scioctl(struct dev_ioctl_args *ap)
            return EINVAL;
        }
        syscons_lock();
-       error = sc_clean_up(sc->cur_scp);
+       error = sc_clean_up(sc->cur_scp, TRUE);
        syscons_unlock();
        if (error) {
            lwkt_reltoken(&tty_token);
@@ -2482,7 +2482,7 @@ remove_scrn_saver(void (*this_saver)(sc_softc_t *, int))
         stop_scrn_saver(this_saver);
 #endif
     /* unblank all blanked screens */
-    wait_scrn_saver_stop(NULL);
+    wait_scrn_saver_stop(NULL, FALSE);
     if (scrn_blanked) {
        return EBUSY;
     }
@@ -2583,11 +2583,11 @@ stop_scrn_saver(sc_softc_t *sc, void (*saver)(sc_softc_t *, int))
     mark_all(sc->cur_scp);
     if (sc->delayed_next_scr)
        sc_switch_scr(sc, sc->delayed_next_scr - 1);
-    wakeup((caddr_t)&scrn_blanked);
+    wakeup(&scrn_blanked);
 }
 
 static int
-wait_scrn_saver_stop(sc_softc_t *sc)
+wait_scrn_saver_stop(sc_softc_t *sc, int need_unlock)
 {
     int error = 0;
 
@@ -2597,7 +2597,14 @@ wait_scrn_saver_stop(sc_softc_t *sc)
            error = 0;
            break;
        }
-       error = tsleep((caddr_t)&scrn_blanked, PCATCH, "scrsav", 0);
+       if (need_unlock) {
+           tsleep_interlock(&scrn_blanked, PCATCH);
+           syscons_unlock();
+           error = tsleep(&scrn_blanked, PCATCH | PINTERLOCKED, "scrsav", 0);
+           syscons_lock();
+       } else {
+           error = tsleep(&scrn_blanked, PCATCH, "scrsav", 0);
+       }
        /* May return ERESTART */
        if (error)
                break;
@@ -3374,7 +3381,7 @@ scshutdown(void *arg, int howto)
 }
 
 int
-sc_clean_up(scr_stat *scp)
+sc_clean_up(scr_stat *scp, int need_unlock)
 {
 #if NSPLASH > 0
     int error;
@@ -3384,7 +3391,7 @@ sc_clean_up(scr_stat *scp)
     if (scp->sc->flags & SC_SCRN_BLANKED) {
        sc_touch_scrn_saver();
 #if NSPLASH > 0
-       if ((error = wait_scrn_saver_stop(scp->sc))) {
+       if ((error = wait_scrn_saver_stop(scp->sc, need_unlock))) {
            lwkt_reltoken(&tty_token);
            return error;
        }
index 10a6152..fc4b4c8 100644 (file)
@@ -526,7 +526,7 @@ void                sc_touch_scrn_saver(void);
 void           sc_draw_cursor_image(scr_stat *scp);
 void           sc_remove_cursor_image(scr_stat *scp);
 void           sc_set_cursor_image(scr_stat *scp);
-int            sc_clean_up(scr_stat *scp);
+int            sc_clean_up(scr_stat *scp, int need_unlock);
 int            sc_switch_scr(sc_softc_t *sc, u_int next_scr);
 void           sc_alloc_scr_buffer(scr_stat *scp, int wait, int discard);
 int            sc_init_emulator(scr_stat *scp, char *name);