X-Git-Url: https://git.liburcu.org/?a=blobdiff_plain;f=wrapper%2Ftrace-clock.h;h=d2b7f19dba76e197738d055217250d38767bd816;hb=2754583e7a52bb07e00d9c20f8f6790adb1bc503;hp=d7d18429ba1c1f17d22d35c4ce6ec8484aef422e;hpb=9616f0bf9524fc6b8ad184e87f4935c97f78a8bc;p=lttng-modules.git diff --git a/wrapper/trace-clock.h b/wrapper/trace-clock.h index d7d18429..d2b7f19d 100644 --- a/wrapper/trace-clock.h +++ b/wrapper/trace-clock.h @@ -36,6 +36,7 @@ #include #include #include "../lttng-kernel-version.h" +#include "../lttng-clock.h" #include "percpu-defs.h" #include "random.h" @@ -44,6 +45,8 @@ #error "Linux kernels 3.10 and 3.11 introduce a deadlock in the timekeeping subsystem. Fixed by commit 7bd36014460f793c19e7d6c94dab67b0afcfcb7f \"timekeeping: Fix HRTICK related deadlock from ntp lock changes\" in Linux." #endif +extern struct lttng_trace_clock *lttng_trace_clock; + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,17,0)) DECLARE_PER_CPU(local_t, lttng_last_tsc); @@ -142,21 +145,31 @@ static inline u64 trace_clock_monotonic_wrapper(void) } #endif /* #else #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,17,0)) */ -static inline u64 trace_clock_read64(void) +static inline u64 trace_clock_read64_monotonic(void) { return (u64) trace_clock_monotonic_wrapper(); } -static inline u64 trace_clock_freq(void) +static inline u64 trace_clock_freq_monotonic(void) { return (u64) NSEC_PER_SEC; } -static inline int trace_clock_uuid(char *uuid) +static inline int trace_clock_uuid_monotonic(char *uuid) { return wrapper_get_bootid(uuid); } +static inline const char *trace_clock_name_monotonic(void) +{ + return "monotonic"; +} + +static inline const char *trace_clock_description_monotonic(void) +{ + return "Monotonic Clock"; +} + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,17,0)) static inline int get_trace_clock(void) { @@ -175,6 +188,67 @@ static inline void put_trace_clock(void) { } +static inline u64 trace_clock_read64(void) +{ + struct lttng_trace_clock *ltc = ACCESS_ONCE(lttng_trace_clock); + + if (likely(!ltc)) { + return trace_clock_read64_monotonic(); + } else { + read_barrier_depends(); /* load ltc before content */ + return ltc->read64(); + } +} + +static inline u64 trace_clock_freq(void) +{ + struct lttng_trace_clock *ltc = ACCESS_ONCE(lttng_trace_clock); + + if (!ltc) { + return trace_clock_freq_monotonic(); + } else { + read_barrier_depends(); /* load ltc before content */ + return ltc->freq(); + } +} + +static inline int trace_clock_uuid(char *uuid) +{ + struct lttng_trace_clock *ltc = ACCESS_ONCE(lttng_trace_clock); + + read_barrier_depends(); /* load ltc before content */ + /* Use default UUID cb when NULL */ + if (!ltc || !ltc->uuid) { + return trace_clock_uuid_monotonic(uuid); + } else { + return ltc->uuid(uuid); + } +} + +static inline const char *trace_clock_name(void) +{ + struct lttng_trace_clock *ltc = ACCESS_ONCE(lttng_trace_clock); + + if (!ltc) { + return trace_clock_name_monotonic(); + } else { + read_barrier_depends(); /* load ltc before content */ + return ltc->name(); + } +} + +static inline const char *trace_clock_description(void) +{ + struct lttng_trace_clock *ltc = ACCESS_ONCE(lttng_trace_clock); + + if (!ltc) { + return trace_clock_description_monotonic(); + } else { + read_barrier_depends(); /* load ltc before content */ + return ltc->description(); + } +} + #endif /* CONFIG_HAVE_TRACE_CLOCK */ #endif /* _LTTNG_TRACE_CLOCK_H */