summaryrefslogtreecommitdiffstats
path: root/recipes-kernel/linux/files/patches/sched-nohz-Fix-overflow-error-in-scheduler_tick_max_.patch
diff options
context:
space:
mode:
Diffstat (limited to 'recipes-kernel/linux/files/patches/sched-nohz-Fix-overflow-error-in-scheduler_tick_max_.patch')
-rw-r--r--recipes-kernel/linux/files/patches/sched-nohz-Fix-overflow-error-in-scheduler_tick_max_.patch76
1 files changed, 76 insertions, 0 deletions
diff --git a/recipes-kernel/linux/files/patches/sched-nohz-Fix-overflow-error-in-scheduler_tick_max_.patch b/recipes-kernel/linux/files/patches/sched-nohz-Fix-overflow-error-in-scheduler_tick_max_.patch
new file mode 100644
index 0000000..c279422
--- /dev/null
+++ b/recipes-kernel/linux/files/patches/sched-nohz-Fix-overflow-error-in-scheduler_tick_max_.patch
@@ -0,0 +1,76 @@
1From 189a149dfc3ab55282b38d2194a0d7def74d8dfa Mon Sep 17 00:00:00 2001
2From: Kevin Hilman <khilman@linaro.org>
3Date: Wed, 15 Jan 2014 14:51:38 +0100
4Subject: [PATCH] sched/nohz: Fix overflow error in
5 scheduler_tick_max_deferment()
6
7While calculating the scheduler tick max deferment, the delta is
8converted from microseconds to nanoseconds through a multiplication
9against NSEC_PER_USEC.
10
11But this microseconds operand is an unsigned int, thus the result may
12likely overflow. The result is cast to u64 but only once the operation
13is completed, which is too late to avoid overflown result.
14
15This is currently not a problem because the scheduler tick max deferment
16is 1 second. But this may become an issue as we plan to make this
17value tunable.
18
19So lets fix this by casting the usecs value to u64 before multiplying by
20NSECS_PER_USEC.
21
22Also to prevent from this kind of mistake to happen again, move this
23ad-hoc jiffies -> nsecs conversion to a new helper.
24
25Signed-off-by: Kevin Hilman <khilman@linaro.org>
26Cc: Thomas Gleixner <tglx@linutronix.de>
27Cc: Ingo Molnar <mingo@kernel.org>
28Cc: Peter Zijlstra <peterz@infradead.org>
29Cc: Alex Shi <alex.shi@linaro.org>
30Cc: Steven Rostedt <rostedt@goodmis.org>
31Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
32Cc: John Stultz <john.stultz@linaro.org>
33Cc: Kevin Hilman <khilman@linaro.org>
34Link: http://lkml.kernel.org/r/1387315388-31676-2-git-send-email-khilman@linaro.org
35[move ad-hoc conversion to jiffies_to_nsecs helper]
36Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
37
38Signed-off-by: Mats Liljegren <mats.liljegren@enea.com>
39---
40 include/linux/jiffies.h | 6 ++++++
41 kernel/sched/core.c | 2 +-
42 2 files changed, 7 insertions(+), 1 deletion(-)
43
44diff --git a/include/linux/jiffies.h b/include/linux/jiffies.h
45index 8fb8edf..4df91d4 100644
46--- a/include/linux/jiffies.h
47+++ b/include/linux/jiffies.h
48@@ -290,6 +290,12 @@ extern unsigned long preset_lpj;
49 */
50 extern unsigned int jiffies_to_msecs(const unsigned long j);
51 extern unsigned int jiffies_to_usecs(const unsigned long j);
52+
53+static inline u64 jiffies_to_nsecs(const unsigned long j)
54+{
55+ return (u64)jiffies_to_usecs(j) * NSEC_PER_USEC;
56+}
57+
58 extern unsigned long msecs_to_jiffies(const unsigned int m);
59 extern unsigned long usecs_to_jiffies(const unsigned int u);
60 extern unsigned long timespec_to_jiffies(const struct timespec *value);
61diff --git a/kernel/sched/core.c b/kernel/sched/core.c
62index e8b3350..45c2cf1 100644
63--- a/kernel/sched/core.c
64+++ b/kernel/sched/core.c
65@@ -2774,7 +2774,7 @@ u64 scheduler_tick_max_deferment(void)
66 if (time_before_eq(next, now))
67 return 0;
68
69- return jiffies_to_usecs(next - now) * NSEC_PER_USEC;
70+ return jiffies_to_nsecs(next - now);
71 }
72 #endif
73
74--
751.9.1
76