aboutsummaryrefslogtreecommitdiffstats
path: root/include/litmus
diff options
context:
space:
mode:
authorBjoern Brandenburg <bbb@mpi-sws.org>2015-08-09 07:18:45 -0400
committerBjoern Brandenburg <bbb@mpi-sws.org>2015-08-09 06:21:16 -0400
commitb4a055a180134a149ec846087ee0153d46652339 (patch)
tree4f60a52ee3269d3f7eec1b92f7e30c09129ee70c /include/litmus
parent5b981f69f229e8519b006f09459395374c081a4e (diff)
Feather-Trace: add LITMUS^RT overhead tracing infrastructure
This patch adds the main infrastructure for tracing overheads in LITMUS^RT. It does not yet introduce any tracepoints into the kernel.
Diffstat (limited to 'include/litmus')
-rw-r--r--include/litmus/trace.h142
1 files changed, 142 insertions, 0 deletions
diff --git a/include/litmus/trace.h b/include/litmus/trace.h
new file mode 100644
index 000000000000..601787214037
--- /dev/null
+++ b/include/litmus/trace.h
@@ -0,0 +1,142 @@
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 msg_sent(unsigned long event, unsigned long to);
32feather_callback void msg_received(unsigned long event);
33
34#define MSG_TIMESTAMP_SENT(id, to) \
35 ft_event1(id, msg_sent, (unsigned long) to);
36
37#define MSG_TIMESTAMP_RECEIVED(id) \
38 ft_event0(id, msg_received);
39
40feather_callback void save_cpu_timestamp(unsigned long event);
41feather_callback void save_cpu_timestamp_time(unsigned long event, unsigned long time_ptr);
42feather_callback void save_cpu_timestamp_irq(unsigned long event, unsigned long irq_count_ptr);
43feather_callback void save_cpu_timestamp_task(unsigned long event, unsigned long t_ptr);
44feather_callback void save_cpu_timestamp_def(unsigned long event, unsigned long type);
45feather_callback void save_cpu_task_latency(unsigned long event, unsigned long when_ptr);
46
47#define CPU_TIMESTAMP_TIME(id, time_ptr) \
48 ft_event1(id, save_cpu_timestamp_time, (unsigned long) time_ptr)
49
50#define CPU_TIMESTAMP_IRQ(id, irq_count_ptr) \
51 ft_event1(id, save_cpu_timestamp_irq, (unsigned long) irq_count_ptr)
52
53#define CPU_TIMESTAMP(id) ft_event0(id, save_cpu_timestamp)
54
55#define CPU_DTIMESTAMP(id, def) ft_event1(id, save_cpu_timestamp_def, (unsigned long) def)
56
57#define CPU_TIMESTAMP_CUR(id) CPU_DTIMESTAMP(id, is_realtime(current) ? TSK_RT : TSK_BE)
58
59#define CPU_TTIMESTAMP(id, task) \
60 ft_event1(id, save_cpu_timestamp_task, (unsigned long) task)
61
62#define CPU_LTIMESTAMP(id, task) \
63 ft_event1(id, save_cpu_task_latency, (unsigned long) task)
64
65#else /* !CONFIG_SCHED_OVERHEAD_TRACE */
66
67#define MSG_TIMESTAMP_SENT(id, to)
68#define MSG_TIMESTAMP_RECEIVED(id)
69
70#define CPU_TIMESTAMP_TIME(id, time_ptr)
71#define CPU_TIMESTAMP_IRQ(id, irq_count_ptr)
72#define CPU_TIMESTAMP(id)
73#define CPU_DTIMESTAMP(id, def)
74#define CPU_TIMESTAMP_CUR(id)
75#define CPU_TTIMESTAMP(id, task)
76#define CPU_LTIMESTAMP(id, task)
77
78#endif
79
80
81/* Convention for timestamps
82 * =========================
83 *
84 * In order to process the trace files with a common tool, we use the following
85 * convention to measure execution times: The end time id of a code segment is
86 * always the next number after the start time event id.
87 */
88
89#define __TS_SYSCALL_IN_START(p) CPU_TIMESTAMP_TIME(10, p)
90#define __TS_SYSCALL_IN_END(p) CPU_TIMESTAMP_IRQ(11, p)
91
92#define TS_SYSCALL_OUT_START CPU_TIMESTAMP_CUR(20)
93#define TS_SYSCALL_OUT_END CPU_TIMESTAMP_CUR(21)
94
95#define TS_LOCK_START CPU_TIMESTAMP_CUR(30)
96#define TS_LOCK_END CPU_TIMESTAMP_CUR(31)
97
98#define TS_LOCK_SUSPEND CPU_TIMESTAMP_CUR(38)
99#define TS_LOCK_RESUME CPU_TIMESTAMP_CUR(39)
100
101#define TS_UNLOCK_START CPU_TIMESTAMP_CUR(40)
102#define TS_UNLOCK_END CPU_TIMESTAMP_CUR(41)
103
104#define TS_SCHED_START CPU_DTIMESTAMP(100, TSK_UNKNOWN) /* we only
105 * care
106 * about
107 * next */
108#define TS_SCHED_END(t) CPU_TTIMESTAMP(101, t)
109#define TS_SCHED2_START(t) CPU_TTIMESTAMP(102, t)
110#define TS_SCHED2_END(t) CPU_TTIMESTAMP(103, t)
111
112#define TS_CXS_START(t) CPU_TTIMESTAMP(104, t)
113#define TS_CXS_END(t) CPU_TTIMESTAMP(105, t)
114
115#define TS_RELEASE_START CPU_DTIMESTAMP(106, TSK_RT)
116#define TS_RELEASE_END CPU_DTIMESTAMP(107, TSK_RT)
117
118#define TS_TICK_START(t) CPU_TTIMESTAMP(110, t)
119#define TS_TICK_END(t) CPU_TTIMESTAMP(111, t)
120
121#define TS_QUANTUM_BOUNDARY_START CPU_TIMESTAMP_CUR(112)
122#define TS_QUANTUM_BOUNDARY_END CPU_TIMESTAMP_CUR(113)
123
124
125#define TS_PLUGIN_SCHED_START /* TIMESTAMP(120) */ /* currently unused */
126#define TS_PLUGIN_SCHED_END /* TIMESTAMP(121) */
127
128#define TS_PLUGIN_TICK_START /* TIMESTAMP(130) */
129#define TS_PLUGIN_TICK_END /* TIMESTAMP(131) */
130
131#define TS_ENTER_NP_START CPU_TIMESTAMP(140)
132#define TS_ENTER_NP_END CPU_TIMESTAMP(141)
133
134#define TS_EXIT_NP_START CPU_TIMESTAMP(150)
135#define TS_EXIT_NP_END CPU_TIMESTAMP(151)
136
137#define TS_SEND_RESCHED_START(c) MSG_TIMESTAMP_SENT(190, c)
138#define TS_SEND_RESCHED_END MSG_TIMESTAMP_RECEIVED(191)
139
140#define TS_RELEASE_LATENCY(when) CPU_LTIMESTAMP(208, &(when))
141
142#endif /* !_SYS_TRACE_H_ */