diff options
Diffstat (limited to 'kernel/time')
-rw-r--r-- | kernel/time/sched_clock.c | 19 |
1 files changed, 8 insertions, 11 deletions
diff --git a/kernel/time/sched_clock.c b/kernel/time/sched_clock.c index aad1ae6077ef..a326f27d7f09 100644 --- a/kernel/time/sched_clock.c +++ b/kernel/time/sched_clock.c | |||
@@ -49,10 +49,14 @@ static inline u64 notrace cyc_to_ns(u64 cyc, u32 mult, u32 shift) | |||
49 | return (cyc * mult) >> shift; | 49 | return (cyc * mult) >> shift; |
50 | } | 50 | } |
51 | 51 | ||
52 | static unsigned long long notrace cyc_to_sched_clock(u32 cyc, u32 mask) | 52 | static unsigned long long notrace sched_clock_32(void) |
53 | { | 53 | { |
54 | u64 epoch_ns; | 54 | u64 epoch_ns; |
55 | u32 epoch_cyc; | 55 | u32 epoch_cyc; |
56 | u32 cyc; | ||
57 | |||
58 | if (cd.suspended) | ||
59 | return cd.epoch_ns; | ||
56 | 60 | ||
57 | /* | 61 | /* |
58 | * Load the epoch_cyc and epoch_ns atomically. We do this by | 62 | * Load the epoch_cyc and epoch_ns atomically. We do this by |
@@ -68,7 +72,9 @@ static unsigned long long notrace cyc_to_sched_clock(u32 cyc, u32 mask) | |||
68 | smp_rmb(); | 72 | smp_rmb(); |
69 | } while (epoch_cyc != cd.epoch_cyc_copy); | 73 | } while (epoch_cyc != cd.epoch_cyc_copy); |
70 | 74 | ||
71 | return epoch_ns + cyc_to_ns((cyc - epoch_cyc) & mask, cd.mult, cd.shift); | 75 | cyc = read_sched_clock(); |
76 | cyc = (cyc - epoch_cyc) & sched_clock_mask; | ||
77 | return epoch_ns + cyc_to_ns(cyc, cd.mult, cd.shift); | ||
72 | } | 78 | } |
73 | 79 | ||
74 | /* | 80 | /* |
@@ -160,19 +166,10 @@ void __init setup_sched_clock(u32 (*read)(void), int bits, unsigned long rate) | |||
160 | pr_debug("Registered %pF as sched_clock source\n", read); | 166 | pr_debug("Registered %pF as sched_clock source\n", read); |
161 | } | 167 | } |
162 | 168 | ||
163 | static unsigned long long notrace sched_clock_32(void) | ||
164 | { | ||
165 | u32 cyc = read_sched_clock(); | ||
166 | return cyc_to_sched_clock(cyc, sched_clock_mask); | ||
167 | } | ||
168 | |||
169 | unsigned long long __read_mostly (*sched_clock_func)(void) = sched_clock_32; | 169 | unsigned long long __read_mostly (*sched_clock_func)(void) = sched_clock_32; |
170 | 170 | ||
171 | unsigned long long notrace sched_clock(void) | 171 | unsigned long long notrace sched_clock(void) |
172 | { | 172 | { |
173 | if (cd.suspended) | ||
174 | return cd.epoch_ns; | ||
175 | |||
176 | return sched_clock_func(); | 173 | return sched_clock_func(); |
177 | } | 174 | } |
178 | 175 | ||