summaryrefslogtreecommitdiff
path: root/packages/sys-kernel/linux-sources-redcore-lts/files/0005-Special-case-calls-of-schedule_timeout-1-to-use-the-.patch
diff options
context:
space:
mode:
Diffstat (limited to 'packages/sys-kernel/linux-sources-redcore-lts/files/0005-Special-case-calls-of-schedule_timeout-1-to-use-the-.patch')
-rw-r--r--packages/sys-kernel/linux-sources-redcore-lts/files/0005-Special-case-calls-of-schedule_timeout-1-to-use-the-.patch50
1 files changed, 50 insertions, 0 deletions
diff --git a/packages/sys-kernel/linux-sources-redcore-lts/files/0005-Special-case-calls-of-schedule_timeout-1-to-use-the-.patch b/packages/sys-kernel/linux-sources-redcore-lts/files/0005-Special-case-calls-of-schedule_timeout-1-to-use-the-.patch
new file mode 100644
index 0000000..3c88971
--- /dev/null
+++ b/packages/sys-kernel/linux-sources-redcore-lts/files/0005-Special-case-calls-of-schedule_timeout-1-to-use-the-.patch
@@ -0,0 +1,50 @@
+From 5da7d1778b96c514394334c92de9b3d8d71f4a29 Mon Sep 17 00:00:00 2001
+From: Con Kolivas <kernel@kolivas.org>
+Date: Sat, 5 Nov 2016 09:27:36 +1100
+Subject: [PATCH 05/16] Special case calls of schedule_timeout(1) to use the
+ min hrtimeout of 1ms, working around low Hz resolutions.
+
+---
+ kernel/time/timer.c | 17 +++++++++++++++--
+ 1 file changed, 15 insertions(+), 2 deletions(-)
+
+diff --git a/kernel/time/timer.c b/kernel/time/timer.c
+index 9c18e16059a3..dd4d1b193286 100644
+--- a/kernel/time/timer.c
++++ b/kernel/time/timer.c
+@@ -1741,6 +1741,19 @@ signed long __sched schedule_timeout(signed long timeout)
+
+ expire = timeout + jiffies;
+
++#ifdef CONFIG_HIGH_RES_TIMERS
++ if (timeout == 1 && hrtimer_resolution < NSEC_PER_SEC / HZ) {
++ /*
++ * Special case 1 as being a request for the minimum timeout
++ * and use highres timers to timeout after 1ms to workaround
++ * the granularity of low Hz tick timers.
++ */
++ if (!schedule_min_hrtimeout())
++ return 0;
++ goto out_timeout;
++ }
++#endif
++
+ setup_timer_on_stack(&timer, process_timeout, (unsigned long)current);
+ __mod_timer(&timer, expire, false);
+ schedule();
+@@ -1748,10 +1761,10 @@ signed long __sched schedule_timeout(signed long timeout)
+
+ /* Remove the timer from the object tracker */
+ destroy_timer_on_stack(&timer);
+-
++out_timeout:
+ timeout = expire - jiffies;
+
+- out:
++out:
+ return timeout < 0 ? 0 : timeout;
+ }
+ EXPORT_SYMBOL(schedule_timeout);
+--
+2.11.0
+