summaryrefslogtreecommitdiff
path: root/sys-kernel/linux-image-redcore-lts-legacy/files/4.19-0011-Don-t-use-hrtimer-overlay-when-pm_freezing-since-som.patch
diff options
context:
space:
mode:
Diffstat (limited to 'sys-kernel/linux-image-redcore-lts-legacy/files/4.19-0011-Don-t-use-hrtimer-overlay-when-pm_freezing-since-som.patch')
-rw-r--r--sys-kernel/linux-image-redcore-lts-legacy/files/4.19-0011-Don-t-use-hrtimer-overlay-when-pm_freezing-since-som.patch69
1 files changed, 69 insertions, 0 deletions
diff --git a/sys-kernel/linux-image-redcore-lts-legacy/files/4.19-0011-Don-t-use-hrtimer-overlay-when-pm_freezing-since-som.patch b/sys-kernel/linux-image-redcore-lts-legacy/files/4.19-0011-Don-t-use-hrtimer-overlay-when-pm_freezing-since-som.patch
new file mode 100644
index 00000000..680e5fcd
--- /dev/null
+++ b/sys-kernel/linux-image-redcore-lts-legacy/files/4.19-0011-Don-t-use-hrtimer-overlay-when-pm_freezing-since-som.patch
@@ -0,0 +1,69 @@
+From befdee72d814b6c302da85af524b15762e72e0cf Mon Sep 17 00:00:00 2001
+From: Con Kolivas <kernel@kolivas.org>
+Date: Mon, 20 Feb 2017 13:32:58 +1100
+Subject: [PATCH 11/16] Don't use hrtimer overlay when pm_freezing since some
+ drivers still don't correctly use freezable timeouts.
+
+---
+ kernel/time/hrtimer.c | 2 +-
+ 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 12735724cce4..32fb7b6d9568 100644
+--- a/kernel/time/hrtimer.c
++++ b/kernel/time/hrtimer.c
+@@ -2048,7 +2048,7 @@ long __sched schedule_msec_hrtimeout(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);
+
+ secs = timeout / 1000;
+diff --git a/kernel/time/timer.c b/kernel/time/timer.c
+index 542c13d98950..d5d0fa004d2b 100644
+--- a/kernel/time/timer.c
++++ b/kernel/time/timer.c
+@@ -44,6 +44,7 @@
+ #include <linux/sched/debug.h>
+ #include <linux/slab.h>
+ #include <linux/compat.h>
++#include <linux/freezer.h>
+
+ #include <linux/uaccess.h>
+ #include <asm/unistd.h>
+@@ -1972,12 +1973,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);
+@@ -1994,12 +1995,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);
+--
+2.17.1
+