diff options
author | Con Kolivas <kernel@kolivas.org> | 2016-12-10 09:54:27 +1100 |
---|---|---|
committer | Con Kolivas <kernel@kolivas.org> | 2016-12-10 09:54:27 +1100 |
commit | f16b14cf573cc631f6794981e7bfad3f14fdf9c5 (patch) | |
tree | d236b0327e45c9ba3253afb14336376a916d6710 | |
parent | 32376ae5806bad926bbd5f2519fe7ddef7c4813e (diff) |
Don't use hrtimer overlay when pm_freezing since some drivers still don't correctly use freezable timeouts.
-rw-r--r-- | kernel/time/hrtimer.c | 2 | ||||
-rw-r--r-- | kernel/time/timer.c | 9 |
2 files changed, 6 insertions, 5 deletions
diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c index 8a25fab84563..309494ba454e 100644 --- a/kernel/time/hrtimer.c +++ b/kernel/time/hrtimer.c @@ -1810,7 +1810,7 @@ signed long __sched schedule_msec_hrtimeout(signed long timeout) * (yet) better than Hz, as would occur during startup, use regular * timers. */ - if (jiffs > 4 || hrtimer_resolution >= NSEC_PER_SEC / HZ) + if (jiffs > 4 || hrtimer_resolution >= NSEC_PER_SEC / HZ || pm_freezing) return schedule_timeout(jiffs); delta = (timeout % 1000) * NSEC_PER_MSEC; diff --git a/kernel/time/timer.c b/kernel/time/timer.c index c7217aa4da19..9d0d44bd5f01 100644 --- a/kernel/time/timer.c +++ b/kernel/time/timer.c @@ -42,6 +42,7 @@ #include <linux/sched/sysctl.h> #include <linux/slab.h> #include <linux/compat.h> +#include <linux/freezer.h> #include <asm/uaccess.h> #include <asm/unistd.h> @@ -1910,12 +1911,12 @@ void msleep(unsigned int msecs) * Use high resolution timers where the resolution of tick based * timers is inadequate. */ - if (jiffs < 5 && hrtimer_resolution < NSEC_PER_SEC / HZ) { + if (jiffs < 5 && hrtimer_resolution < NSEC_PER_SEC / HZ && !pm_freezing) { while (msecs) msecs = schedule_msec_hrtimeout_uninterruptible(msecs); return; } - timeout = msecs_to_jiffies(msecs) + 1; + timeout = jiffs + 1; while (timeout) timeout = schedule_timeout_uninterruptible(timeout); @@ -1932,12 +1933,12 @@ unsigned long msleep_interruptible(unsigned int msecs) int jiffs = msecs_to_jiffies(msecs); unsigned long timeout; - if (jiffs < 5 && hrtimer_resolution < NSEC_PER_SEC / HZ) { + if (jiffs < 5 && hrtimer_resolution < NSEC_PER_SEC / HZ && !pm_freezing) { while (msecs && !signal_pending(current)) msecs = schedule_msec_hrtimeout_interruptible(msecs); return msecs; } - timeout = msecs_to_jiffies(msecs) + 1; + timeout = jiffs + 1; while (timeout && !signal_pending(current)) timeout = schedule_timeout_interruptible(timeout); |