aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorBjoern Brandenburg <bbb@mpi-sws.org>2013-06-23 08:40:52 -0400
committerBjoern Brandenburg <bbb@mpi-sws.org>2013-08-07 03:46:37 -0400
commite089fc170eb4c33c8703bf09cacdff7323cf7575 (patch)
tree206ea5e20ea0552077d7076f007b4d8b22fdfb40 /include
parenta20a7105a2206eb4b9c791aa276f4233bb453214 (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')
-rw-r--r--include/litmus/trace.h137
1 files changed, 137 insertions, 0 deletions
diff --git a/include/litmus/trace.h b/include/litmus/trace.h
new file mode 100644
index 000000000000..489b3d84f880
--- /dev/null
+++ b/include/litmus/trace.h
@@ -0,0 +1,137 @@
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_timestamp_time(unsigned long event, unsigned long time_ptr);
36feather_callback void save_timestamp_irq(unsigned long event, unsigned long irq_count_ptr);
37feather_callback void save_timestamp_hide_irq(unsigned long event);
38
39#define TIMESTAMP(id) ft_event0(id, save_timestamp)
40
41#define DTIMESTAMP(id, def) ft_event1(id, save_timestamp_def, (unsigned long) def)
42
43#define TIMESTAMP_CUR(id) DTIMESTAMP(id, is_realtime(current) ? TSK_RT : TSK_BE)
44
45#define TTIMESTAMP(id, task) \
46 ft_event1(id, save_timestamp_task, (unsigned long) task)
47
48#define CTIMESTAMP(id, cpu) \
49 ft_event1(id, save_timestamp_cpu, (unsigned long) cpu)
50
51#define TIMESTAMP_TIME(id, time_ptr) \
52 ft_event1(id, save_timestamp_time, (unsigned long) time_ptr)
53
54#define TIMESTAMP_IRQ(id, irq_count_ptr) \
55 ft_event1(id, save_timestamp_irq, (unsigned long) irq_count_ptr)
56
57#define TIMESTAMP_IN_IRQ(id) \
58 ft_event0(id, save_timestamp_hide_irq)
59
60#else /* !CONFIG_SCHED_OVERHEAD_TRACE */
61
62#define TIMESTAMP(id) /* no tracing */
63
64#define DTIMESTAMP(id, def) /* no tracing */
65
66#define TIMESTAMP_CUR(id) /* no tracing */
67
68#define TTIMESTAMP(id, task) /* no tracing */
69
70#define CTIMESTAMP(id, cpu) /* no tracing */
71
72#define TIMESTAMP_TIME(id, time_ptr) /* no tracing */
73
74#define TIMESTAMP_IRQ(id, irq_count_ptr) /* no tracing */
75
76#define TIMESTAMP_IN_IRQ(id) /* no tracing */
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) TIMESTAMP_TIME(10, p)
90#define __TS_SYSCALL_IN_END(p) TIMESTAMP_IRQ(11, p)
91
92#define TS_SYSCALL_OUT_START TIMESTAMP_CUR(20)
93#define TS_SYSCALL_OUT_END TIMESTAMP_CUR(21)
94
95#define TS_LOCK_START TIMESTAMP_CUR(30)
96#define TS_LOCK_END TIMESTAMP_CUR(31)
97
98#define TS_LOCK_SUSPEND TIMESTAMP_CUR(38)
99#define TS_LOCK_RESUME TIMESTAMP_CUR(39)
100
101#define TS_UNLOCK_START TIMESTAMP_CUR(40)
102#define TS_UNLOCK_END TIMESTAMP_CUR(41)
103
104#define TS_SCHED_START DTIMESTAMP(100, TSK_UNKNOWN) /* we only
105 * care
106 * about
107 * next */
108#define TS_SCHED_END(t) TTIMESTAMP(101, t)
109#define TS_SCHED2_START(t) TTIMESTAMP(102, t)
110#define TS_SCHED2_END(t) TTIMESTAMP(103, t)
111
112#define TS_CXS_START(t) TTIMESTAMP(104, t)
113#define TS_CXS_END(t) TTIMESTAMP(105, t)
114
115#define TS_RELEASE_START DTIMESTAMP(106, TSK_RT)
116#define TS_RELEASE_END DTIMESTAMP(107, TSK_RT)
117
118#define TS_TICK_START(t) TTIMESTAMP(110, t)
119#define TS_TICK_END(t) TTIMESTAMP(111, t)
120
121
122#define TS_PLUGIN_SCHED_START /* TIMESTAMP(120) */ /* currently unused */
123#define TS_PLUGIN_SCHED_END /* TIMESTAMP(121) */
124
125#define TS_PLUGIN_TICK_START /* TIMESTAMP(130) */
126#define TS_PLUGIN_TICK_END /* TIMESTAMP(131) */
127
128#define TS_ENTER_NP_START TIMESTAMP(140)
129#define TS_ENTER_NP_END TIMESTAMP(141)
130
131#define TS_EXIT_NP_START TIMESTAMP(150)
132#define TS_EXIT_NP_END TIMESTAMP(151)
133
134#define TS_SEND_RESCHED_START(c) CTIMESTAMP(190, c)
135#define TS_SEND_RESCHED_END TIMESTAMP_IN_IRQ(191)
136
137#endif /* !_SYS_TRACE_H_ */