}
 
 /* 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,
 
  * 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);
 
 
 
        if (tsk->signal->it_real_incr.tv64 != 0) {
                hrtimer_forward(&tsk->signal->real_timer,
-                              tsk->signal->it_real_incr);
+                               tsk->signal->real_timer.base->softirq_time,
+                               tsk->signal->it_real_incr);
 
                return HRTIMER_RESTART;
        }
 
 
 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);
 }
 
 /*
 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;
                 */
                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;
        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: