| 1 | /* |
| 2 | * Copyright (C) 2011 Mathieu Desnoyers (mathieu.desnoyers@efficios.com) |
| 3 | * |
| 4 | * Contains LTTng trace clock mapping to LTTng trace clock or mainline monotonic |
| 5 | * clock. This wrapper depends on CONFIG_HIGH_RES_TIMERS=y. |
| 6 | * |
| 7 | * Dual LGPL v2.1/GPL v2 license. |
| 8 | */ |
| 9 | |
| 10 | #ifndef _LTT_TRACE_CLOCK_H |
| 11 | #define _LTT_TRACE_CLOCK_H |
| 12 | |
| 13 | #ifdef CONFIG_HAVE_TRACE_CLOCK |
| 14 | #include <linux/trace-clock.h> |
| 15 | #else /* CONFIG_HAVE_TRACE_CLOCK */ |
| 16 | |
| 17 | #include <linux/hardirq.h> |
| 18 | #include <linux/ktime.h> |
| 19 | #include <linux/time.h> |
| 20 | #include <linux/hrtimer.h> |
| 21 | |
| 22 | static inline u64 trace_clock_monotonic_wrapper(void) |
| 23 | { |
| 24 | ktime_t ktime; |
| 25 | |
| 26 | /* |
| 27 | * Refuse to trace from NMIs with this wrapper, because an NMI could |
| 28 | * nest over the xtime write seqlock and deadlock. |
| 29 | */ |
| 30 | if (in_nmi()) |
| 31 | return (u64) -EIO; |
| 32 | |
| 33 | ktime = ktime_get(); |
| 34 | return (u64) ktime.tv64; |
| 35 | } |
| 36 | |
| 37 | static inline u32 trace_clock_read32(void) |
| 38 | { |
| 39 | return (u32) trace_clock_monotonic_wrapper(); |
| 40 | } |
| 41 | |
| 42 | static inline u64 trace_clock_read64(void) |
| 43 | { |
| 44 | return (u64) trace_clock_monotonic_wrapper(); |
| 45 | } |
| 46 | |
| 47 | static inline u64 trace_clock_frequency(void) |
| 48 | { |
| 49 | return (u64)NSEC_PER_SEC; |
| 50 | } |
| 51 | |
| 52 | static inline u32 trace_clock_freq_scale(void) |
| 53 | { |
| 54 | return 1; |
| 55 | } |
| 56 | |
| 57 | static inline int get_trace_clock(void) |
| 58 | { |
| 59 | printk(KERN_WARNING "LTTng: Using mainline kernel monotonic clock.\n"); |
| 60 | printk(KERN_WARNING " * NMIs will not be traced,\n"); |
| 61 | printk(KERN_WARNING " * expect significant performance degradation compared to the\n"); |
| 62 | printk(KERN_WARNING " LTTng trace clocks.\n"); |
| 63 | printk(KERN_WARNING "Integration of the LTTng 0.x trace clocks into LTTng 2.0 is planned\n"); |
| 64 | printk(KERN_WARNING "in a near future.\n"); |
| 65 | |
| 66 | #warning "LTTng: Using mainline kernel monotonic clock. NMIs will not be traced, and expect significant performance degradation compared to the LTTng trace clocks. Integration of the LTTng 0.x trace clocks into LTTng 2.0 is planned in a near future." |
| 67 | |
| 68 | return 0; |
| 69 | } |
| 70 | |
| 71 | static inline void put_trace_clock(void) |
| 72 | { |
| 73 | } |
| 74 | |
| 75 | #endif /* CONFIG_HAVE_TRACE_CLOCK */ |
| 76 | |
| 77 | #endif /* _LTT_TRACE_CLOCK_H */ |