Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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

+43 -5
+2 -1
arch/x86/events/msr.c
··· 188 188 if (event->hw.event_base) 189 189 rdmsrl(event->hw.event_base, now); 190 190 else 191 - rdtscll(now); 191 + now = rdtsc_ordered(); 192 192 193 193 return now; 194 194 } 195 + 195 196 static void msr_event_update(struct perf_event *event) 196 197 { 197 198 u64 prev, now;
-3
arch/x86/include/asm/msr.h
··· 232 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 235 static inline unsigned long long native_read_pmc(int counter) 239 236 { 240 237 DECLARE_ARGS(val, low, high);
+1
arch/x86/include/asm/tsc.h
··· 31 31 } 32 32 33 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 36 extern void tsc_early_delay_calibrate(void); 36 37 extern void tsc_init(void);
+1 -1
arch/x86/kernel/cpu/mcheck/mce-inject.c
··· 491 491 unsigned int cpu = i_mce.extcpu; 492 492 u8 b = i_mce.bank; 493 493 494 - rdtscll(i_mce.tsc); 494 + i_mce.tsc = rdtsc_ordered(); 495 495 496 496 if (i_mce.misc) 497 497 i_mce.status |= MCI_STATUS_MISCV;
+39
arch/x86/kernel/tsc.c
··· 1179 1179 } 1180 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 1221 static void tsc_refine_calibration_work(struct work_struct *work); 1183 1222 static DECLARE_DELAYED_WORK(tsc_irqwork, tsc_refine_calibration_work); 1184 1223 /**