diff options
| -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 | /** |
