30 lines
1.1 KiB
Diff
30 lines
1.1 KiB
Diff
|
# Commit 054b6dfb61eab00d86ddd5d0ac508f5302da0d52
|
||
|
# Date 2014-05-28 10:07:50 +0200
|
||
|
# Author Ross Lagerwall <ross.lagerwall@citrix.com>
|
||
|
# Committer Jan Beulich <jbeulich@suse.com>
|
||
|
timers: set the deadline more accurately
|
||
|
|
||
|
Program the timer to the deadline of the closest timer if it is further
|
||
|
than 50us ahead, otherwise set it 50us ahead. This way a single event
|
||
|
fires on time rather than 50us late (as it would have previously) while
|
||
|
still preventing too many timer wakeups in the case of having many
|
||
|
timers scheduled close together.
|
||
|
|
||
|
(where 50us is the timer_slop)
|
||
|
|
||
|
Signed-off-by: Ross Lagerwall <ross.lagerwall@citrix.com>
|
||
|
|
||
|
--- a/xen/common/timer.c
|
||
|
+++ b/xen/common/timer.c
|
||
|
@@ -492,8 +492,9 @@ static void timer_softirq_action(void)
|
||
|
deadline = heap[1]->expires;
|
||
|
if ( (ts->list != NULL) && (ts->list->expires < deadline) )
|
||
|
deadline = ts->list->expires;
|
||
|
+ now = NOW();
|
||
|
this_cpu(timer_deadline) =
|
||
|
- (deadline == STIME_MAX) ? 0 : deadline + timer_slop;
|
||
|
+ (deadline == STIME_MAX) ? 0 : MAX(deadline, now + timer_slop);
|
||
|
|
||
|
if ( !reprogram_timer(this_cpu(timer_deadline)) )
|
||
|
raise_softirq(TIMER_SOFTIRQ);
|