aboutsummaryrefslogtreecommitdiffstats
path: root/include/litmus/trace.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/litmus/trace.h')
-rw-r--r--include/litmus/trace.h145
1 files changed, 145 insertions, 0 deletions
diff --git a/include/litmus/trace.h b/include/litmus/trace.h
new file mode 100644
index 00000000000..8ad4966c602
--- /dev/null
+++ b/include/litmus/trace.h
@@ -0,0 +1,145 @@
1#ifndef _SYS_TRACE_H_
2#define _SYS_TRACE_H_
3
4#ifdef CONFIG_SCHED_OVERHEAD_TRACE
5
6
7#include <litmus/feather_trace.h>
8#include <litmus/feather_buffer.h>
9
10
11/*********************** TIMESTAMPS ************************/
12
13enum task_type_marker {
14 TSK_BE,
15 TSK_RT,
16 TSK_UNKNOWN
17};
18
19struct timestamp {
20 uint64_t timestamp:48;
21 uint64_t pid:16;
22 uint32_t seq_no;
23 uint8_t cpu;
24 uint8_t event;
25 uint8_t task_type:2;
26 uint8_t irq_flag:1;
27 uint8_t irq_count:5;
28};
29
30/* tracing callbacks */
31feather_callback void save_timestamp(unsigned long event);
32feather_callback void save_timestamp_def(unsigned long event, unsigned long type);
33feather_callback void save_timestamp_task(unsigned long event, unsigned long t_ptr);
34feather_callback void save_timestamp_cpu(unsigned long event, unsigned long cpu);
35feather_callback void save_task_latency(unsigned long event, unsigned long when_ptr);
36feather_callback void save_timestamp_time(unsigned long event, unsigned long time_ptr);
37feather_callback void save_timestamp_irq(unsigned long event, unsigned long irq_count_ptr);
38feather_callback void save_timestamp_hide_irq(unsigned long event);
39
40#define TIMESTAMP(id) ft_event0(id, save_timestamp)
41
42#define DTIMESTAMP(id, def) ft_event1(id, save_timestamp_def, (unsigned long) def)
43
44#define TIMESTAMP_CUR(id) DTIMESTAMP(id, is_realtime(current) ? TSK_RT : TSK_BE)
45
46#define TTIMESTAMP(id, task) \
47 ft_event1(id, save_timestamp_task, (unsigned long) task)
48
49#define CTIMESTAMP(id, cpu) \
50 ft_event1(id, save_timestamp_cpu, (unsigned long) cpu)
51
52#define LTIMESTAMP(id, task) \
53 ft_event1(id, save_task_latency, (unsigned long) task)
54
55#define TIMESTAMP_TIME(id, time_ptr) \
56 ft_event1(id, save_timestamp_time, (unsigned long) time_ptr)
57
58#define TIMESTAMP_IRQ(id, irq_count_ptr) \
59 ft_event1(id, save_timestamp_irq, (unsigned long) irq_count_ptr)
60
61#define TIMESTAMP_IN_IRQ(id) \
62 ft_event0(id, save_timestamp_hide_irq)
63
64#else /* !CONFIG_SCHED_OVERHEAD_TRACE */
65
66#define TIMESTAMP(id) /* no tracing */
67
68#define DTIMESTAMP(id, def) /* no tracing */
69
70#define TIMESTAMP_CUR(id) /* no tracing */
71
72#define TTIMESTAMP(id, task) /* no tracing */
73
74#define CTIMESTAMP(id, cpu) /* no tracing */
75
76#define LTIMESTAMP(id, when_ptr) /* no tracing */
77
78#define TIMESTAMP_TIME(id, time_ptr) /* no tracing */
79
80#define TIMESTAMP_IRQ(id, irq_count_ptr) /* no tracing */
81
82#define TIMESTAMP_IN_IRQ(id) /* no tracing */
83
84#endif
85
86
87/* Convention for timestamps
88 * =========================
89 *
90 * In order to process the trace files with a common tool, we use the following
91 * convention to measure execution times: The end time id of a code segment is
92 * always the next number after the start time event id.
93 */
94
95#define __TS_SYSCALL_IN_START(p) TIMESTAMP_TIME(10, p)
96#define __TS_SYSCALL_IN_END(p) TIMESTAMP_IRQ(11, p)
97
98#define TS_SYSCALL_OUT_START TIMESTAMP_CUR(20)
99#define TS_SYSCALL_OUT_END TIMESTAMP_CUR(21)
100
101#define TS_LOCK_START TIMESTAMP_CUR(30)
102#define TS_LOCK_END TIMESTAMP_CUR(31)
103
104#define TS_LOCK_SUSPEND TIMESTAMP_CUR(38)
105#define TS_LOCK_RESUME TIMESTAMP_CUR(39)
106
107#define TS_UNLOCK_START TIMESTAMP_CUR(40)
108#define TS_UNLOCK_END TIMESTAMP_CUR(41)
109
110#define TS_SCHED_START DTIMESTAMP(100, TSK_UNKNOWN) /* we only
111 * care
112 * about
113 * next */
114#define TS_SCHED_END(t) TTIMESTAMP(101, t)
115#define TS_SCHED2_START(t) TTIMESTAMP(102, t)
116#define TS_SCHED2_END(t) TTIMESTAMP(103, t)
117
118#define TS_CXS_START(t) TTIMESTAMP(104, t)
119#define TS_CXS_END(t) TTIMESTAMP(105, t)
120
121#define TS_RELEASE_START DTIMESTAMP(106, TSK_RT)
122#define TS_RELEASE_END DTIMESTAMP(107, TSK_RT)
123
124#define TS_TICK_START(t) TTIMESTAMP(110, t)
125#define TS_TICK_END(t) TTIMESTAMP(111, t)
126
127
128#define TS_PLUGIN_SCHED_START /* TIMESTAMP(120) */ /* currently unused */
129#define TS_PLUGIN_SCHED_END /* TIMESTAMP(121) */
130
131#define TS_PLUGIN_TICK_START /* TIMESTAMP(130) */
132#define TS_PLUGIN_TICK_END /* TIMESTAMP(131) */
133
134#define TS_ENTER_NP_START TIMESTAMP(140)
135#define TS_ENTER_NP_END TIMESTAMP(141)
136
137#define TS_EXIT_NP_START TIMESTAMP(150)
138#define TS_EXIT_NP_END TIMESTAMP(151)
139
140#define TS_SEND_RESCHED_START(c) CTIMESTAMP(190, c)
141#define TS_SEND_RESCHED_END TIMESTAMP_IN_IRQ(191)
142
143#define TS_RELEASE_LATENCY(when) LTIMESTAMP(208, &(when))
144
145#endif /* !_SYS_TRACE_H_ */