From: Andrew Morton go away and dont come back Cc: Jonathan Corbet Cc: Ingo Molnar Cc: Thomas Gleixner Signed-off-by: Andrew Morton --- kernel/timer.c | 47 +++++++++-------------------------------------- 1 file changed, 9 insertions(+), 38 deletions(-) diff -puN kernel/timer.c~revert-git-hrt kernel/timer.c --- a/kernel/timer.c~revert-git-hrt +++ a/kernel/timer.c @@ -1360,43 +1360,18 @@ void __init init_timers(void) open_softirq(TIMER_SOFTIRQ, run_timer_softirq, NULL); } - - - -static void do_msleep(unsigned int msecs, struct hrtimer_sleeper *sleeper, - int sigs) -{ - enum hrtimer_mode mode = HRTIMER_MODE_REL; - int state = sigs ? TASK_INTERRUPTIBLE : TASK_UNINTERRUPTIBLE; - - /* - * This is really just a reworked and simplified version - * of do_nanosleep(). - */ - hrtimer_init(&sleeper->timer, CLOCK_MONOTONIC, mode); - sleeper->timer.expires = ktime_set(0, msecs*NSEC_PER_MSEC); - hrtimer_init_sleeper(sleeper, current); - - do { - set_current_state(state); - hrtimer_start(&sleeper->timer, sleeper->timer.expires, mode); - if (sleeper->task) - schedule(); - hrtimer_cancel(&sleeper->timer); - mode = HRTIMER_MODE_ABS; - } while (sleeper->task && !(sigs && signal_pending(current))); -} - /** * msleep - sleep safely even with waitqueue interruptions * @msecs: Time in milliseconds to sleep for */ void msleep(unsigned int msecs) { - struct hrtimer_sleeper sleeper; + unsigned long timeout = msecs_to_jiffies(msecs) + 1; - do_msleep(msecs, &sleeper, 0); + while (timeout) + timeout = schedule_timeout_uninterruptible(timeout); } + EXPORT_SYMBOL(msleep); /** @@ -1405,15 +1380,11 @@ EXPORT_SYMBOL(msleep); */ unsigned long msleep_interruptible(unsigned int msecs) { - struct hrtimer_sleeper sleeper; - ktime_t left; + unsigned long timeout = msecs_to_jiffies(msecs) + 1; - do_msleep(msecs, &sleeper, 1); - - if (!sleeper.task) - return 0; - left = ktime_sub(sleeper.timer.expires, - sleeper.timer.base->get_time()); - return max(((long) ktime_to_ns(left))/NSEC_PER_MSEC, 1L); + while (timeout && !signal_pending(current)) + timeout = schedule_timeout_interruptible(timeout); + return jiffies_to_msecs(timeout); } + EXPORT_SYMBOL(msleep_interruptible); _