On Thu, Feb 12, 2015 at 11:38 PM, Peter Zijlstra [off-list ref] wrote:
On Thu, Feb 12, 2015 at 11:28:14AM +0100, Peter Zijlstra wrote:
quoted
quoted
and you would have to check the clocksource is TSC.
It implicitly does that; it has that sched_clock_stable() thing, but
yeah I suppose someone could change the clocksource even though the tsc
is stable.
Not using TSC when its available is quite crazy though.. but sure.
Something like this on top then.. it might have a few header issues, the
whole asm/tsc.h vs clocksource.h thing looks like pain.
I haven't tried to compile it, maybe we can move cycle_t into types and
fwd declare struct clocksource or whatnot.
Of course, all this is quite horrible on the timekeeping side; it might
be tglx and/or jstutlz are having spasms just reading it :-)
Oof.. Yea, this exposes all sorts of timekeeping internals out to the
rest of the kernel that I'd rather not have out there.
quoted hunk ↗ jump to hunk
--- a/arch/x86/kernel/cpu/perf_event.c
+++ b/arch/x86/kernel/cpu/perf_event.c
@@ -1967,17 +1967,19 @@ static void local_clock_user_time(struct
cyc2ns_read_end(data);
}
-extern void notrace __ktime_get_mono_fast(u64 *offset, u32 *mult, u16 *shift);
+extern bool notrace __ktime_get_mono_fast(cycle_t (*read)(struct clocksource *cs),
+ u64 *offset, u32 *mult, u16 *shift);
static void ktime_fast_mono_user_time(struct perf_event_mmap_page *userpg, u64 now)
{
+ if (!__ktime_get_mono_fast(read_tsc, &userpg->time_zero,
+ &userpg->time_mult,
+ &userpg->time_shift))
Soo.. instead of hard-coding read_tsc here, can we instead use a
clocksource flag that we can check that the current clocksource is
valid for this sort of use?
thanks
-john