| 
					
				 | 
			
			
				@@ -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); 
			 |