Date: Sun, 16 Dec 2012 19:51:35 +0000 (UTC) From: Alexander Motin <mav@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r244306 - projects/calloutng/sys/dev/syscons Message-ID: <201212161951.qBGJpZDM040598@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: mav Date: Sun Dec 16 19:51:34 2012 New Revision: 244306 URL: http://svnweb.freebsd.org/changeset/base/244306 Log: Reduce syscons "refresh" rate to 1-2Hz when console is in graphics mode and there is nothing to do except some polling for keyboard. Text mode refresh would also be nice to have adaptive, but this change at least should help laptop users who running X. Modified: projects/calloutng/sys/dev/syscons/syscons.c Modified: projects/calloutng/sys/dev/syscons/syscons.c ============================================================================== --- projects/calloutng/sys/dev/syscons/syscons.c Sun Dec 16 17:01:23 2012 (r244305) +++ projects/calloutng/sys/dev/syscons/syscons.c Sun Dec 16 19:51:34 2012 (r244306) @@ -1814,13 +1814,11 @@ static void scrn_timer(void *arg) { #ifndef PC98 - static int kbd_interval = 0; + static time_t kbd_time_stamp = 0; #endif - struct timeval tv; sc_softc_t *sc; scr_stat *scp; - int again; - int s; + int again, rate; again = (arg != NULL); if (arg != NULL) @@ -1831,18 +1829,14 @@ scrn_timer(void *arg) return; /* don't do anything when we are performing some I/O operations */ - if (suspend_in_progress || sc->font_loading_in_progress) { - if (again) - callout_reset_flags(&sc->ctimeout, hz / 15, scrn_timer, sc, - C_PRELSET(0)); - return; - } - s = spltty(); + if (suspend_in_progress || sc->font_loading_in_progress) + goto done; #ifndef PC98 if ((sc->kbd == NULL) && (sc->config & SC_AUTODETECT_KBD)) { /* try to allocate a keyboard automatically */ - if (++kbd_interval >= 25) { + if (kbd_time_stamp != time_uptime) { + kbd_time_stamp = time_uptime; sc->keyboard = sc_allocate_keyboard(sc, -1); if (sc->keyboard >= 0) { sc->kbd = kbd_get_keyboard(sc->keyboard); @@ -1851,7 +1845,6 @@ scrn_timer(void *arg) update_kbd_state(sc->cur_scp, sc->cur_scp->status, LOCK_MASK); } - kbd_interval = 0; } } #endif /* PC98 */ @@ -1860,16 +1853,15 @@ scrn_timer(void *arg) scp = sc->cur_scp; /* should we stop the screen saver? */ - getmicrouptime(&tv); if (debugger > 0 || panicstr || shutdown_in_progress) sc_touch_scrn_saver(); if (run_scrn_saver) { - if (tv.tv_sec > sc->scrn_time_stamp + scrn_blank_time) + if (time_uptime > sc->scrn_time_stamp + scrn_blank_time) sc->flags |= SC_SCRN_IDLE; else sc->flags &= ~SC_SCRN_IDLE; } else { - sc->scrn_time_stamp = tv.tv_sec; + sc->scrn_time_stamp = time_uptime; sc->flags &= ~SC_SCRN_IDLE; if (scrn_blank_time > 0) run_scrn_saver = TRUE; @@ -1882,13 +1874,8 @@ scrn_timer(void *arg) /* should we just return ? */ if (sc->blink_in_progress || sc->switch_in_progress - || sc->write_in_progress) { - if (again) - callout_reset_flags(&sc->ctimeout, hz / 15, scrn_timer, sc, - C_PRELSET(0)); - splx(s); - return; - } + || sc->write_in_progress) + goto done; /* Update the screen */ scp = sc->cur_scp; /* cur_scp may have changed... */ @@ -1902,10 +1889,19 @@ scrn_timer(void *arg) (*current_saver)(sc, TRUE); #endif - if (again) - callout_reset_flags(&sc->ctimeout, hz / 30, scrn_timer, sc, +done: + if (again) { + /* + * Use reduced "refresh" rate if we are in graphics and that is not a + * graphical screen saver. In such case we just have nothing to do. + */ + if (ISGRAPHSC(scp) && !(sc->flags & SC_SCRN_BLANKED)) + rate = 2; + else + rate = 30; + callout_reset_flags(&sc->ctimeout, hz / rate, scrn_timer, sc, C_PRELSET(1)); - splx(s); + } } static int
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201212161951.qBGJpZDM040598>