diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2018-04-02 19:18:31 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2018-04-02 19:18:31 -0400 |
commit | a5532439ebab93e47784effb96aafa7d7ba4b760 (patch) | |
tree | 82a8e88870ec995a3139d0afdfe246407db44ad6 | |
parent | cea061e455c88312b86142e68c8fc5b8e1294ca2 (diff) | |
parent | ea89c065482179b2bf9f9b6788b06a6e0c68a73b (diff) |
Merge branch 'x86-timers-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull x86 timer updates from Ingo Molnar:
"Two changes: add the new convert_art_ns_to_tsc() API for upcoming
Intel Goldmont+ drivers, and remove the obsolete rdtscll() API"
* 'x86-timers-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
x86/tsc: Get rid of rdtscll()
x86/tsc: Convert ART in nanoseconds to TSC
-rw-r--r-- | arch/x86/events/msr.c | 3 | ||||
-rw-r--r-- | arch/x86/include/asm/msr.h | 3 | ||||
-rw-r--r-- | arch/x86/include/asm/tsc.h | 1 | ||||
-rw-r--r-- | arch/x86/kernel/cpu/mcheck/mce-inject.c | 2 | ||||
-rw-r--r-- | arch/x86/kernel/tsc.c | 39 |
5 files changed, 43 insertions, 5 deletions
diff --git a/arch/x86/events/msr.c b/arch/x86/events/msr.c index 18e2628e2d8f..e7edf19e64c2 100644 --- a/arch/x86/events/msr.c +++ b/arch/x86/events/msr.c | |||
@@ -188,10 +188,11 @@ static inline u64 msr_read_counter(struct perf_event *event) | |||
188 | if (event->hw.event_base) | 188 | if (event->hw.event_base) |
189 | rdmsrl(event->hw.event_base, now); | 189 | rdmsrl(event->hw.event_base, now); |
190 | else | 190 | else |
191 | rdtscll(now); | 191 | now = rdtsc_ordered(); |
192 | 192 | ||
193 | return now; | 193 | return now; |
194 | } | 194 | } |
195 | |||
195 | static void msr_event_update(struct perf_event *event) | 196 | static void msr_event_update(struct perf_event *event) |
196 | { | 197 | { |
197 | u64 prev, now; | 198 | u64 prev, now; |
diff --git a/arch/x86/include/asm/msr.h b/arch/x86/include/asm/msr.h index 77254c9c8f61..04addd6e0a4a 100644 --- a/arch/x86/include/asm/msr.h +++ b/arch/x86/include/asm/msr.h | |||
@@ -232,9 +232,6 @@ static __always_inline unsigned long long rdtsc_ordered(void) | |||
232 | return rdtsc(); | 232 | return rdtsc(); |
233 | } | 233 | } |
234 | 234 | ||
235 | /* Deprecated, keep it for a cycle for easier merging: */ | ||
236 | #define rdtscll(now) do { (now) = rdtsc_ordered(); } while (0) | ||
237 | |||
238 | static inline unsigned long long native_read_pmc(int counter) | 235 | static inline unsigned long long native_read_pmc(int counter) |
239 | { | 236 | { |
240 | DECLARE_ARGS(val, low, high); | 237 | DECLARE_ARGS(val, low, high); |
diff --git a/arch/x86/include/asm/tsc.h b/arch/x86/include/asm/tsc.h index cf5d53c3f9ea..2701d221583a 100644 --- a/arch/x86/include/asm/tsc.h +++ b/arch/x86/include/asm/tsc.h | |||
@@ -31,6 +31,7 @@ static inline cycles_t get_cycles(void) | |||
31 | } | 31 | } |
32 | 32 | ||
33 | extern struct system_counterval_t convert_art_to_tsc(u64 art); | 33 | extern struct system_counterval_t convert_art_to_tsc(u64 art); |
34 | extern struct system_counterval_t convert_art_ns_to_tsc(u64 art_ns); | ||
34 | 35 | ||
35 | extern void tsc_early_delay_calibrate(void); | 36 | extern void tsc_early_delay_calibrate(void); |
36 | extern void tsc_init(void); | 37 | extern void tsc_init(void); |
diff --git a/arch/x86/kernel/cpu/mcheck/mce-inject.c b/arch/x86/kernel/cpu/mcheck/mce-inject.c index 231ad23b24a9..475cb4f5f14f 100644 --- a/arch/x86/kernel/cpu/mcheck/mce-inject.c +++ b/arch/x86/kernel/cpu/mcheck/mce-inject.c | |||
@@ -491,7 +491,7 @@ static void do_inject(void) | |||
491 | unsigned int cpu = i_mce.extcpu; | 491 | unsigned int cpu = i_mce.extcpu; |
492 | u8 b = i_mce.bank; | 492 | u8 b = i_mce.bank; |
493 | 493 | ||
494 | rdtscll(i_mce.tsc); | 494 | i_mce.tsc = rdtsc_ordered(); |
495 | 495 | ||
496 | if (i_mce.misc) | 496 | if (i_mce.misc) |
497 | i_mce.status |= MCI_STATUS_MISCV; | 497 | i_mce.status |= MCI_STATUS_MISCV; |
diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c index fb4302738410..ef32297ff17e 100644 --- a/arch/x86/kernel/tsc.c +++ b/arch/x86/kernel/tsc.c | |||
@@ -1179,6 +1179,45 @@ struct system_counterval_t convert_art_to_tsc(u64 art) | |||
1179 | } | 1179 | } |
1180 | EXPORT_SYMBOL(convert_art_to_tsc); | 1180 | EXPORT_SYMBOL(convert_art_to_tsc); |
1181 | 1181 | ||
1182 | /** | ||
1183 | * convert_art_ns_to_tsc() - Convert ART in nanoseconds to TSC. | ||
1184 | * @art_ns: ART (Always Running Timer) in unit of nanoseconds | ||
1185 | * | ||
1186 | * PTM requires all timestamps to be in units of nanoseconds. When user | ||
1187 | * software requests a cross-timestamp, this function converts system timestamp | ||
1188 | * to TSC. | ||
1189 | * | ||
1190 | * This is valid when CPU feature flag X86_FEATURE_TSC_KNOWN_FREQ is set | ||
1191 | * indicating the tsc_khz is derived from CPUID[15H]. Drivers should check | ||
1192 | * that this flag is set before conversion to TSC is attempted. | ||
1193 | * | ||
1194 | * Return: | ||
1195 | * struct system_counterval_t - system counter value with the pointer to the | ||
1196 | * corresponding clocksource | ||
1197 | * @cycles: System counter value | ||
1198 | * @cs: Clocksource corresponding to system counter value. Used | ||
1199 | * by timekeeping code to verify comparibility of two cycle | ||
1200 | * values. | ||
1201 | */ | ||
1202 | |||
1203 | struct system_counterval_t convert_art_ns_to_tsc(u64 art_ns) | ||
1204 | { | ||
1205 | u64 tmp, res, rem; | ||
1206 | |||
1207 | rem = do_div(art_ns, USEC_PER_SEC); | ||
1208 | |||
1209 | res = art_ns * tsc_khz; | ||
1210 | tmp = rem * tsc_khz; | ||
1211 | |||
1212 | do_div(tmp, USEC_PER_SEC); | ||
1213 | res += tmp; | ||
1214 | |||
1215 | return (struct system_counterval_t) { .cs = art_related_clocksource, | ||
1216 | .cycles = res}; | ||
1217 | } | ||
1218 | EXPORT_SYMBOL(convert_art_ns_to_tsc); | ||
1219 | |||
1220 | |||
1182 | static void tsc_refine_calibration_work(struct work_struct *work); | 1221 | static void tsc_refine_calibration_work(struct work_struct *work); |
1183 | static DECLARE_DELAYED_WORK(tsc_irqwork, tsc_refine_calibration_work); | 1222 | static DECLARE_DELAYED_WORK(tsc_irqwork, tsc_refine_calibration_work); |
1184 | /** | 1223 | /** |