diff options
author | Jisheng Zhang <jszhang@marvell.com> | 2015-10-20 04:02:34 -0400 |
---|---|---|
committer | Daniel Lezcano <daniel.lezcano@linaro.org> | 2015-10-26 20:32:33 -0400 |
commit | d6df3576e6b4bcf765f5ace69915b4fa4a7ee1c3 (patch) | |
tree | 0ab04e90271ba7f74b0247bfaf93b5fb4f61330f /drivers/clocksource/arm_global_timer.c | |
parent | 56fd16cabac9cd8f15e2902898a9d0cc96e2fa70 (diff) |
clocksource/drivers/arm_global_timer: Prevent ftrace recursion
Currently arm_global_timer can be used as a scheduler clock. We properly
marked gt_sched_clock_read() as notrace but we then call another function
gt_counter_read() that _wasn't_ notrace.
Having a traceable function in the sched_clock() path leads to a recursion
within ftrace and a kernel crash.
Fix this by adding an extra notrace function to keep other users of
gt_counter_read() traceable.
Signed-off-by: Jisheng Zhang <jszhang@marvell.com>
Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
Diffstat (limited to 'drivers/clocksource/arm_global_timer.c')
-rw-r--r-- | drivers/clocksource/arm_global_timer.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/drivers/clocksource/arm_global_timer.c b/drivers/clocksource/arm_global_timer.c index 29ea50ac366a..a2cb6fae9295 100644 --- a/drivers/clocksource/arm_global_timer.c +++ b/drivers/clocksource/arm_global_timer.c | |||
@@ -60,7 +60,7 @@ static struct clock_event_device __percpu *gt_evt; | |||
60 | * different to the 32-bit upper value read previously, go back to step 2. | 60 | * different to the 32-bit upper value read previously, go back to step 2. |
61 | * Otherwise the 64-bit timer counter value is correct. | 61 | * Otherwise the 64-bit timer counter value is correct. |
62 | */ | 62 | */ |
63 | static u64 gt_counter_read(void) | 63 | static u64 notrace _gt_counter_read(void) |
64 | { | 64 | { |
65 | u64 counter; | 65 | u64 counter; |
66 | u32 lower; | 66 | u32 lower; |
@@ -79,6 +79,11 @@ static u64 gt_counter_read(void) | |||
79 | return counter; | 79 | return counter; |
80 | } | 80 | } |
81 | 81 | ||
82 | static u64 gt_counter_read(void) | ||
83 | { | ||
84 | return _gt_counter_read(); | ||
85 | } | ||
86 | |||
82 | /** | 87 | /** |
83 | * To ensure that updates to comparator value register do not set the | 88 | * To ensure that updates to comparator value register do not set the |
84 | * Interrupt Status Register proceed as follows: | 89 | * Interrupt Status Register proceed as follows: |
@@ -201,7 +206,7 @@ static struct clocksource gt_clocksource = { | |||
201 | #ifdef CONFIG_CLKSRC_ARM_GLOBAL_TIMER_SCHED_CLOCK | 206 | #ifdef CONFIG_CLKSRC_ARM_GLOBAL_TIMER_SCHED_CLOCK |
202 | static u64 notrace gt_sched_clock_read(void) | 207 | static u64 notrace gt_sched_clock_read(void) |
203 | { | 208 | { |
204 | return gt_counter_read(); | 209 | return _gt_counter_read(); |
205 | } | 210 | } |
206 | #endif | 211 | #endif |
207 | 212 | ||