diff options
| author | Linux Build Service Account <lnxbuild@localhost> | 2017-01-09 12:42:33 -0800 |
|---|---|---|
| committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2017-01-09 12:42:32 -0800 |
| commit | 8f67fe86568e4f72d9822fa5e88ed879a171b95b (patch) | |
| tree | 9c717f5d9295c6ce4ca1200b0a6f785e958cfe5c /kernel | |
| parent | 2f996ae5f9fbc8e1f8c3cfc3d39957fff79b0f38 (diff) | |
| parent | c51fd6364e2abb94cbaac9e69612ab8c425711ec (diff) | |
Merge "timers: Fix usleep_range() in the context of wake_up_process()"
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/time/timer.c | 21 |
1 files changed, 9 insertions, 12 deletions
diff --git a/kernel/time/timer.c b/kernel/time/timer.c index 7d0d2632400d..849c49e946e0 100644 --- a/kernel/time/timer.c +++ b/kernel/time/timer.c @@ -1784,16 +1784,6 @@ unsigned long msleep_interruptible(unsigned int msecs) EXPORT_SYMBOL(msleep_interruptible); -static void __sched do_usleep_range(unsigned long min, unsigned long max) -{ - ktime_t kmin; - u64 delta; - - kmin = ktime_set(0, min * NSEC_PER_USEC); - delta = (u64)(max - min) * NSEC_PER_USEC; - schedule_hrtimeout_range(&kmin, delta, HRTIMER_MODE_REL); -} - /** * usleep_range - Drop in replacement for udelay where wakeup is flexible * @min: Minimum time in usecs to sleep @@ -1801,7 +1791,14 @@ static void __sched do_usleep_range(unsigned long min, unsigned long max) */ void __sched usleep_range(unsigned long min, unsigned long max) { - __set_current_state(TASK_UNINTERRUPTIBLE); - do_usleep_range(min, max); + ktime_t exp = ktime_add_us(ktime_get(), min); + u64 delta = (u64)(max - min) * NSEC_PER_USEC; + + for (;;) { + __set_current_state(TASK_UNINTERRUPTIBLE); + /* Do not return before the requested sleep time has elapsed */ + if (!schedule_hrtimeout_range(&exp, delta, HRTIMER_MODE_ABS)) + break; + } } EXPORT_SYMBOL(usleep_range); |
