|
@@ -507,16 +507,25 @@ kist_scheduler_schedule(void)
|
|
|
{
|
|
|
struct monotime_t now;
|
|
|
struct timeval next_run;
|
|
|
- int32_t diff;
|
|
|
+ int64_t diff;
|
|
|
|
|
|
if (!have_work()) {
|
|
|
return;
|
|
|
}
|
|
|
monotime_get(&now);
|
|
|
- diff = (int32_t) monotime_diff_msec(&scheduler_last_run, &now);
|
|
|
+
|
|
|
+ /* If time is really monotonic, we can never have now being smaller than the
|
|
|
+ * last scheduler run. The scheduler_last_run at first is set to 0. */
|
|
|
+ diff = monotime_diff_msec(&scheduler_last_run, &now);
|
|
|
+ IF_BUG_ONCE(diff < 0) {
|
|
|
+ diff = 0;
|
|
|
+ }
|
|
|
if (diff < sched_run_interval) {
|
|
|
next_run.tv_sec = 0;
|
|
|
- /* 1000 for ms -> us */
|
|
|
+ /* Takes 1000 ms -> us. This will always be valid because diff can NOT be
|
|
|
+ * negative and can NOT be smaller than sched_run_interval so values can
|
|
|
+ * only go from 1000 usec (diff set to interval - 1) to 100000 usec (diff
|
|
|
+ * set to 0) for the maximum allowed run interval (100ms). */
|
|
|
next_run.tv_usec = (sched_run_interval - diff) * 1000;
|
|
|
/* Readding an event reschedules it. It does not duplicate it. */
|
|
|
scheduler_ev_add(&next_run);
|