Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 44f21475 authored by Roman Zippel's avatar Roman Zippel Committed by Linus Torvalds
Browse files

[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: default avatarRoman Zippel <zippel@linux-m68k.org>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 92127c7a
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -130,7 +130,8 @@ static inline int hrtimer_active(const struct hrtimer *timer)
}

/* Forward a hrtimer so it expires after now: */
extern unsigned long hrtimer_forward(struct hrtimer *timer, ktime_t interval);
extern unsigned long
hrtimer_forward(struct hrtimer *timer, ktime_t now, ktime_t interval);

/* Precise sleep: */
extern long hrtimer_nanosleep(struct timespec *rqtp,
+3 −4
Original line number Diff line number Diff line
@@ -301,18 +301,17 @@ void unlock_hrtimer_base(const struct hrtimer *timer, unsigned long *flags)
 * hrtimer_forward - forward the timer expiry
 *
 * @timer:	hrtimer to forward
 * @now:	forward past this time
 * @interval:	the interval to forward
 *
 * Forward the timer expiry so it will expire in the future.
 * Returns the number of overruns.
 */
unsigned long
hrtimer_forward(struct hrtimer *timer, ktime_t interval)
hrtimer_forward(struct hrtimer *timer, ktime_t now, ktime_t interval)
{
	unsigned long orun = 1;
	ktime_t delta, now;

	now = timer->base->get_time();
	ktime_t delta;

	delta = ktime_sub(now, timer->expires);

+2 −1
Original line number Diff line number Diff line
@@ -136,6 +136,7 @@ int it_real_fn(void *data)

	if (tsk->signal->it_real_incr.tv64 != 0) {
		hrtimer_forward(&tsk->signal->real_timer,
				tsk->signal->real_timer.base->softirq_time,
				tsk->signal->it_real_incr);

		return HRTIMER_RESTART;
+10 −4
Original line number Diff line number Diff line
@@ -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: