diff options
| author | Roman Zippel <zippel@linux-m68k.org> | 2006-03-26 01:38:06 -0800 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-03-26 08:57:02 -0800 | 
| commit | 44f21475511bbc0135b52c66ad74dcc6a9026da3 (patch) | |
| tree | 5cbd605c9d074f40b52a877859957432311b2399 /kernel/posix-timers.c | |
| parent | 92127c7a45d4d167d9b015a5f9de6b41ed66f1d0 (diff) | |
| download | olio-linux-3.10-44f21475511bbc0135b52c66ad74dcc6a9026da3.tar.xz olio-linux-3.10-44f21475511bbc0135b52c66ad74dcc6a9026da3.zip  | |
[PATCH] hrtimers: pass current time to hrtimer_forward()
Pass current time to hrtimer_forward().  This allows to use the softirq time
in the timer base when the forward function is called from the timer callback.
 Other places pass current time with a call to timer->base->get_time().
Signed-off-by: Roman Zippel <zippel@linux-m68k.org>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'kernel/posix-timers.c')
| -rw-r--r-- | kernel/posix-timers.c | 14 | 
1 files changed, 10 insertions, 4 deletions
diff --git a/kernel/posix-timers.c b/kernel/posix-timers.c index 9944379360b..255657accf0 100644 --- a/kernel/posix-timers.c +++ b/kernel/posix-timers.c @@ -251,15 +251,18 @@ __initcall(init_posix_timers);  static void schedule_next_timer(struct k_itimer *timr)  { +	struct hrtimer *timer = &timr->it.real.timer; +  	if (timr->it.real.interval.tv64 == 0)  		return; -	timr->it_overrun += hrtimer_forward(&timr->it.real.timer, +	timr->it_overrun += hrtimer_forward(timer, timer->base->get_time(),  					    timr->it.real.interval); +  	timr->it_overrun_last = timr->it_overrun;  	timr->it_overrun = -1;  	++timr->it_requeue_pending; -	hrtimer_restart(&timr->it.real.timer); +	hrtimer_restart(timer);  }  /* @@ -334,6 +337,7 @@ EXPORT_SYMBOL_GPL(posix_timer_event);  static int posix_timer_fn(void *data)  {  	struct k_itimer *timr = data; +	struct hrtimer *timer = &timr->it.real.timer;  	unsigned long flags;  	int si_private = 0;  	int ret = HRTIMER_NORESTART; @@ -351,7 +355,8 @@ static int posix_timer_fn(void *data)  		 */  		if (timr->it.real.interval.tv64 != 0) {  			timr->it_overrun += -				hrtimer_forward(&timr->it.real.timer, +				hrtimer_forward(timer, +						timer->base->softirq_time,  						timr->it.real.interval);  			ret = HRTIMER_RESTART;  			++timr->it_requeue_pending; @@ -623,7 +628,8 @@ common_timer_get(struct k_itimer *timr, struct itimerspec *cur_setting)  	if (timr->it_requeue_pending & REQUEUE_PENDING ||  	    (timr->it_sigev_notify & ~SIGEV_THREAD_ID) == SIGEV_NONE) {  		timr->it_overrun += -			hrtimer_forward(timer, timr->it.real.interval); +			hrtimer_forward(timer, timer->base->get_time(), +					timr->it.real.interval);  		remaining = hrtimer_get_remaining(timer);  	}   calci:  |