The new schedule_timeout_hr function is a variant of schedule_timeout that uses hrtimers internally. Consequently, its argument and return value are ktime_t. Signed-off-by: Arnd Bergmann Index: linux-cg/include/linux/sched.h =================================================================== --- linux-cg.orig/include/linux/sched.h +++ linux-cg/include/linux/sched.h @@ -246,6 +246,8 @@ extern int in_sched_functions(unsigned l #define MAX_SCHEDULE_TIMEOUT LONG_MAX extern signed long FASTCALL(schedule_timeout(signed long timeout)); +extern ktime_t FASTCALL(schedule_timeout_hr(ktime_t timeout)); + extern signed long schedule_timeout_interruptible(signed long timeout); extern signed long schedule_timeout_uninterruptible(signed long timeout); asmlinkage void schedule(void); Index: linux-cg/kernel/hrtimer.c =================================================================== --- linux-cg.orig/kernel/hrtimer.c +++ linux-cg/kernel/hrtimer.c @@ -1206,6 +1206,54 @@ void hrtimer_init_sleeper(struct hrtimer #endif } +/** + * schedule_timeout_hr - sleep until timeout + * @timeout: timeout value + * + * Make the current task sleep until @timeout has elapsed. + * The routine will return immediately unless the current task + * state has been set (see set_current_state()). + * + * You can set the task state as follows - + * + * %TASK_UNINTERRUPTIBLE - at least @timeout is guaranteed to + * pass before the routine returns. The routine will return 0 + * + * %TASK_INTERRUPTIBLE - the routine may return early if a signal is + * delivered to the current task. In this case the remaining time + * in jiffies will be returned, or 0 if the timer expired in time + * + * The current task state is guaranteed to be TASK_RUNNING when this + * routine returns. + * + * In all cases the return value is guaranteed to be a non-negative + * time value. + */ +static ktime_t __sched __schedule_timeout_hr(ktime_t time, void *addr) +{ + struct hrtimer_sleeper t; + ktime_t remain; + + hrtimer_init(&t.timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); + hrtimer_init_sleeper(&t, current); + __timer_stats_hrtimer_set_start_info(&t.timer, addr); + hrtimer_start(&t.timer, time, HRTIMER_MODE_REL); + schedule(); + hrtimer_cancel(&t.timer); + remain = hrtimer_get_remaining(&t.timer); + + if (ktime_to_ns(remain) < 0) + return ktime_set(0, 0); + else + return remain; +} + +fastcall ktime_t __sched schedule_timeout_hr(ktime_t time) +{ + return __schedule_timeout_hr(time, __builtin_return_address(0)); +} +EXPORT_SYMBOL_GPL(schedule_timeout_hr); + static int __sched do_nanosleep(struct hrtimer_sleeper *t, enum hrtimer_mode mode) { hrtimer_init_sleeper(t, current); -- - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/