summaryrefslogtreecommitdiff
path: root/sys-kernel/linux-image-redcore-lts-legacy/files/4.19-0006-Special-case-calls-of-schedule_timeout-1-to-use-the-.patch
diff options
context:
space:
mode:
Diffstat (limited to 'sys-kernel/linux-image-redcore-lts-legacy/files/4.19-0006-Special-case-calls-of-schedule_timeout-1-to-use-the-.patch')
-rw-r--r--sys-kernel/linux-image-redcore-lts-legacy/files/4.19-0006-Special-case-calls-of-schedule_timeout-1-to-use-the-.patch49
1 files changed, 49 insertions, 0 deletions
diff --git a/sys-kernel/linux-image-redcore-lts-legacy/files/4.19-0006-Special-case-calls-of-schedule_timeout-1-to-use-the-.patch b/sys-kernel/linux-image-redcore-lts-legacy/files/4.19-0006-Special-case-calls-of-schedule_timeout-1-to-use-the-.patch
new file mode 100644
index 00000000..aa348475
--- /dev/null
+++ b/sys-kernel/linux-image-redcore-lts-legacy/files/4.19-0006-Special-case-calls-of-schedule_timeout-1-to-use-the-.patch
@@ -0,0 +1,49 @@
+From 65ea992f1da66b8c0a5554776d1350417b9107cb Mon Sep 17 00:00:00 2001
+From: Con Kolivas <kernel@kolivas.org>
+Date: Sat, 5 Nov 2016 09:27:36 +1100
+Subject: [PATCH 06/16] Special case calls of schedule_timeout(1) to use the
+ min hrtimeout of 1ms, working around low Hz resolutions.
+
+---
+ kernel/time/timer.c | 16 ++++++++++++++--
+ 1 file changed, 14 insertions(+), 2 deletions(-)
+
+diff --git a/kernel/time/timer.c b/kernel/time/timer.c
+index 981eaddff95b..ae942d459aa2 100644
+--- a/kernel/time/timer.c
++++ b/kernel/time/timer.c
+@@ -1801,6 +1801,18 @@ 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
+ timer.task = current;
+ timer_setup_on_stack(&timer.timer, process_timeout, 0);
+ __mod_timer(&timer.timer, expire, 0);
+@@ -1809,10 +1821,10 @@ signed long __sched schedule_timeout(signed long timeout)
+
+ /* Remove the timer from the object tracker */
+ destroy_timer_on_stack(&timer.timer);
+-
++out_timeout:
+ timeout = expire - jiffies;
+
+- out:
++out:
+ return timeout < 0 ? 0 : timeout;
+ }
+ EXPORT_SYMBOL(schedule_timeout);
+--
+2.17.1
+