diff --git a/sys/dev/vt/vt_core.c b/sys/dev/vt/vt_core.c index eb2843e..4a08d11 100644 --- a/sys/dev/vt/vt_core.c +++ b/sys/dev/vt/vt_core.c @@ -799,13 +799,28 @@ static void vt_timer(void *arg) { struct vt_device *vd; + struct bintime start, end; + struct timeval diff; + int next; vd = arg; /* Update screen if required. */ + getbinuptime(&start); vt_flush(vd); + getbinuptime(&end); /* Schedule for next update. */ - callout_schedule(&vd->vd_timer, hz / VT_TIMERFREQ); + bintime_sub(&end, &start); + bintime2timeval(&end, &diff); + if (diff.tv_sec == 0 && diff.tv_usec != 0) { + next = max( + (1000 / VT_TIMERFREQ) - (diff.tv_usec / 1000), + 5 /* At least 5 ms */ + ); + } else { + next = 1000 / VT_TIMERFREQ; + } + callout_schedule(&vd->vd_timer, hz / (1000 / next)); } static void