diff options
Diffstat (limited to 'rt-graph.c')
-rw-r--r-- | rt-graph.c | 78 |
1 files changed, 62 insertions, 16 deletions
@@ -1,5 +1,16 @@ | |||
1 | #include "rt-graph.h" | 1 | #include "rt-graph.h" |
2 | #include "trace-hash.h" | ||
2 | 3 | ||
4 | #define DEBUG_LEVEL 1 | ||
5 | #if DEBUG_LEVEL > 0 | ||
6 | #define dprintf(l, x...) \ | ||
7 | do { \ | ||
8 | if (l <= DEBUG_LEVEL) \ | ||
9 | printf(x); \ | ||
10 | } while (0) | ||
11 | #else | ||
12 | #define dprintf(l, x...) do { if (0) printf(x); } while (0) | ||
13 | #endif | ||
3 | /** | 14 | /** |
4 | * rt_graph_check_task_param - check for litmus_task_param record | 15 | * rt_graph_check_task_param - check for litmus_task_param record |
5 | * Return 1 and @pid, @wcet, and @period if the record matches | 16 | * Return 1 and @pid, @wcet, and @period if the record matches |
@@ -22,8 +33,9 @@ int rt_graph_check_task_param(struct rt_graph_info *rtinfo, | |||
22 | event = pevent_find_event_by_name(pevent, "litmus", | 33 | event = pevent_find_event_by_name(pevent, "litmus", |
23 | "litmus_task_param"); | 34 | "litmus_task_param"); |
24 | if (!event) | 35 | if (!event) |
25 | return 0; | 36 | goto out; |
26 | rtinfo->task_param_id = event->id; | 37 | rtinfo->task_param_id = event->id; |
38 | dprintf(2, "Found task_param id %d\n", event->id); | ||
27 | rtinfo->param_pid_field = pevent_find_field(event, "pid"); | 39 | rtinfo->param_pid_field = pevent_find_field(event, "pid"); |
28 | rtinfo->param_wcet_field = pevent_find_field(event, "wcet"); | 40 | rtinfo->param_wcet_field = pevent_find_field(event, "wcet"); |
29 | rtinfo->param_period_field = pevent_find_field(event, "period"); | 41 | rtinfo->param_period_field = pevent_find_field(event, "period"); |
@@ -39,8 +51,13 @@ int rt_graph_check_task_param(struct rt_graph_info *rtinfo, | |||
39 | pevent_read_number_field(rtinfo->param_period_field, | 51 | pevent_read_number_field(rtinfo->param_period_field, |
40 | record->data, period); | 52 | record->data, period); |
41 | ret = 1; | 53 | ret = 1; |
42 | } | 54 | dprintf(3, "Read task_param (%d) record for task %d " |
55 | "(%llu, %llu)\n", id, *pid, *wcet, *period); | ||
43 | 56 | ||
57 | /* Only of these per task, so we can safely add new tasks now */ | ||
58 | add_task_hash(rtinfo->tasks, *pid); | ||
59 | } | ||
60 | out: | ||
44 | return ret; | 61 | return ret; |
45 | } | 62 | } |
46 | 63 | ||
@@ -50,7 +67,7 @@ int rt_graph_check_task_param(struct rt_graph_info *rtinfo, | |||
50 | */ | 67 | */ |
51 | int rt_graph_check_task_release(struct rt_graph_info *rtinfo, | 68 | int rt_graph_check_task_release(struct rt_graph_info *rtinfo, |
52 | struct pevent *pevent, struct record *record, | 69 | struct pevent *pevent, struct record *record, |
53 | gint *pid, gint *job, | 70 | gint *pid, gint *job, unsigned long long *release, |
54 | unsigned long long *deadline) | 71 | unsigned long long *deadline) |
55 | { | 72 | { |
56 | struct event_format *event; | 73 | struct event_format *event; |
@@ -62,10 +79,12 @@ int rt_graph_check_task_release(struct rt_graph_info *rtinfo, | |||
62 | event = pevent_find_event_by_name(pevent, "litmus", | 79 | event = pevent_find_event_by_name(pevent, "litmus", |
63 | "litmus_task_release"); | 80 | "litmus_task_release"); |
64 | if (!event) | 81 | if (!event) |
65 | return 0; | 82 | goto out; |
66 | rtinfo->task_release_id = event->id; | 83 | rtinfo->task_release_id = event->id; |
84 | dprintf(2, "Found task_release id %d\n", event->id); | ||
67 | rtinfo->release_pid_field = pevent_find_field(event, "pid"); | 85 | rtinfo->release_pid_field = pevent_find_field(event, "pid"); |
68 | rtinfo->release_job_field = pevent_find_field(event, "job"); | 86 | rtinfo->release_job_field = pevent_find_field(event, "job"); |
87 | rtinfo->release_release_field = pevent_find_field(event, "release"); | ||
69 | rtinfo->release_deadline_field = pevent_find_field(event, "deadline"); | 88 | rtinfo->release_deadline_field = pevent_find_field(event, "deadline"); |
70 | } | 89 | } |
71 | 90 | ||
@@ -77,11 +96,15 @@ int rt_graph_check_task_release(struct rt_graph_info *rtinfo, | |||
77 | pevent_read_number_field(rtinfo->release_job_field, | 96 | pevent_read_number_field(rtinfo->release_job_field, |
78 | record->data, &val); | 97 | record->data, &val); |
79 | *job = val; | 98 | *job = val; |
99 | pevent_read_number_field(rtinfo->release_release_field, | ||
100 | record->data, release); | ||
80 | pevent_read_number_field(rtinfo->release_deadline_field, | 101 | pevent_read_number_field(rtinfo->release_deadline_field, |
81 | record->data, deadline); | 102 | record->data, deadline); |
82 | ret = 1; | 103 | ret = 1; |
104 | dprintf(3, "Read task_release (%d) record for job %d:%d, " | ||
105 | "dead: %llu\n", id, *pid, *job, *deadline); | ||
83 | } | 106 | } |
84 | 107 | out: | |
85 | return ret; | 108 | return ret; |
86 | } | 109 | } |
87 | 110 | ||
@@ -91,21 +114,23 @@ int rt_graph_check_task_release(struct rt_graph_info *rtinfo, | |||
91 | */ | 114 | */ |
92 | int rt_graph_check_task_completion(struct rt_graph_info *rtinfo, | 115 | int rt_graph_check_task_completion(struct rt_graph_info *rtinfo, |
93 | struct pevent *pevent, struct record *record, | 116 | struct pevent *pevent, struct record *record, |
94 | gint *pid, gint *job) | 117 | gint *pid, gint *job, unsigned long long *when) |
95 | { | 118 | { |
96 | struct event_format *event; | 119 | struct event_format *event; |
97 | unsigned long long val; | 120 | unsigned long long val; |
98 | gint id; | 121 | gint id; |
99 | int ret = 0; | 122 | int ret = 0; |
100 | 123 | ||
101 | if (rtinfo->task_param_id < 0) { | 124 | if (rtinfo->task_completion_id < 0) { |
102 | event = pevent_find_event_by_name(pevent, "litmus", | 125 | event = pevent_find_event_by_name(pevent, "litmus", |
103 | "litmus_task_completion"); | 126 | "litmus_task_completion"); |
104 | if (!event) | 127 | if (!event) |
105 | return 0; | 128 | goto out; |
106 | rtinfo->task_completion_id = event->id; | 129 | rtinfo->task_completion_id = event->id; |
130 | dprintf(2, "Found task_completion id %d\n", event->id); | ||
107 | rtinfo->completion_pid_field = pevent_find_field(event, "pid"); | 131 | rtinfo->completion_pid_field = pevent_find_field(event, "pid"); |
108 | rtinfo->completion_job_field = pevent_find_field(event, "job"); | 132 | rtinfo->completion_job_field = pevent_find_field(event, "job"); |
133 | rtinfo->completion_when_field = pevent_find_field(event, "when"); | ||
109 | } | 134 | } |
110 | 135 | ||
111 | id = pevent_data_type(pevent, record); | 136 | id = pevent_data_type(pevent, record); |
@@ -116,9 +141,13 @@ int rt_graph_check_task_completion(struct rt_graph_info *rtinfo, | |||
116 | pevent_read_number_field(rtinfo->completion_job_field, | 141 | pevent_read_number_field(rtinfo->completion_job_field, |
117 | record->data, &val); | 142 | record->data, &val); |
118 | *job = val; | 143 | *job = val; |
144 | pevent_read_number_field(rtinfo->completion_when_field, | ||
145 | record->data, when); | ||
119 | ret = 1; | 146 | ret = 1; |
147 | dprintf(3, "Read task_completion (%d) record for job %d:%d\n", | ||
148 | id, *pid, *job); | ||
120 | } | 149 | } |
121 | 150 | out: | |
122 | return ret; | 151 | return ret; |
123 | } | 152 | } |
124 | 153 | ||
@@ -128,7 +157,7 @@ int rt_graph_check_task_completion(struct rt_graph_info *rtinfo, | |||
128 | */ | 157 | */ |
129 | int rt_graph_check_task_block(struct rt_graph_info *rtinfo, | 158 | int rt_graph_check_task_block(struct rt_graph_info *rtinfo, |
130 | struct pevent *pevent, struct record *record, | 159 | struct pevent *pevent, struct record *record, |
131 | gint *pid) | 160 | gint *pid, unsigned long long *when) |
132 | { | 161 | { |
133 | struct event_format *event; | 162 | struct event_format *event; |
134 | unsigned long long val; | 163 | unsigned long long val; |
@@ -139,9 +168,11 @@ int rt_graph_check_task_block(struct rt_graph_info *rtinfo, | |||
139 | event = pevent_find_event_by_name(pevent, "litmus", | 168 | event = pevent_find_event_by_name(pevent, "litmus", |
140 | "litmus_task_block"); | 169 | "litmus_task_block"); |
141 | if (!event) | 170 | if (!event) |
142 | return 0; | 171 | goto out; |
172 | dprintf(2, "Found task_block id %d\n", event->id); | ||
143 | rtinfo->task_block_id = event->id; | 173 | rtinfo->task_block_id = event->id; |
144 | rtinfo->block_pid_field = pevent_find_field(event, "pid"); | 174 | rtinfo->block_pid_field = pevent_find_field(event, "pid"); |
175 | rtinfo->block_when_field = pevent_find_field(event, "when"); | ||
145 | } | 176 | } |
146 | 177 | ||
147 | id = pevent_data_type(pevent, record); | 178 | id = pevent_data_type(pevent, record); |
@@ -149,9 +180,13 @@ int rt_graph_check_task_block(struct rt_graph_info *rtinfo, | |||
149 | pevent_read_number_field(rtinfo->block_pid_field, | 180 | pevent_read_number_field(rtinfo->block_pid_field, |
150 | record->data, &val); | 181 | record->data, &val); |
151 | *pid = val; | 182 | *pid = val; |
183 | pevent_read_number_field(rtinfo->block_when_field, | ||
184 | record->data, when); | ||
152 | ret = 1; | 185 | ret = 1; |
186 | dprintf(3, "Read task_block (%d) record for task %d\n", | ||
187 | id, *pid); | ||
153 | } | 188 | } |
154 | 189 | out: | |
155 | return ret; | 190 | return ret; |
156 | } | 191 | } |
157 | 192 | ||
@@ -161,7 +196,7 @@ int rt_graph_check_task_block(struct rt_graph_info *rtinfo, | |||
161 | */ | 196 | */ |
162 | int rt_graph_check_task_resume(struct rt_graph_info *rtinfo, | 197 | int rt_graph_check_task_resume(struct rt_graph_info *rtinfo, |
163 | struct pevent *pevent, struct record *record, | 198 | struct pevent *pevent, struct record *record, |
164 | gint *pid) | 199 | gint *pid, unsigned long long *when) |
165 | { | 200 | { |
166 | struct event_format *event; | 201 | struct event_format *event; |
167 | unsigned long long val; | 202 | unsigned long long val; |
@@ -172,9 +207,11 @@ int rt_graph_check_task_resume(struct rt_graph_info *rtinfo, | |||
172 | event = pevent_find_event_by_name(pevent, "litmus", | 207 | event = pevent_find_event_by_name(pevent, "litmus", |
173 | "litmus_task_resume"); | 208 | "litmus_task_resume"); |
174 | if (!event) | 209 | if (!event) |
175 | return 0; | 210 | goto out; |
211 | dprintf(2, "Found task_resume id %d\n", event->id); | ||
176 | rtinfo->task_resume_id = event->id; | 212 | rtinfo->task_resume_id = event->id; |
177 | rtinfo->resume_pid_field = pevent_find_field(event, "pid"); | 213 | rtinfo->resume_pid_field = pevent_find_field(event, "pid"); |
214 | rtinfo->resume_when_field = pevent_find_field(event, "when"); | ||
178 | } | 215 | } |
179 | 216 | ||
180 | id = pevent_data_type(pevent, record); | 217 | id = pevent_data_type(pevent, record); |
@@ -182,9 +219,13 @@ int rt_graph_check_task_resume(struct rt_graph_info *rtinfo, | |||
182 | pevent_read_number_field(rtinfo->resume_pid_field, | 219 | pevent_read_number_field(rtinfo->resume_pid_field, |
183 | record->data, &val); | 220 | record->data, &val); |
184 | *pid = val; | 221 | *pid = val; |
222 | pevent_read_number_field(rtinfo->resume_when_field, | ||
223 | record->data, when); | ||
185 | ret = 1; | 224 | ret = 1; |
225 | dprintf(3, "Read task_resume (%d) record for task %d\n", | ||
226 | id, *pid); | ||
186 | } | 227 | } |
187 | 228 | out: | |
188 | return ret; | 229 | return ret; |
189 | } | 230 | } |
190 | 231 | ||
@@ -193,7 +234,7 @@ int rt_graph_check_task_resume(struct rt_graph_info *rtinfo, | |||
193 | */ | 234 | */ |
194 | void init_rt_event_cache(struct rt_graph_info *rtinfo) | 235 | void init_rt_event_cache(struct rt_graph_info *rtinfo) |
195 | { | 236 | { |
196 | print("hello"); | 237 | dprintf(1, "Initializing RT event cache\n"); |
197 | rtinfo->task_param_id = -1; | 238 | rtinfo->task_param_id = -1; |
198 | rtinfo->task_release_id = -1; | 239 | rtinfo->task_release_id = -1; |
199 | rtinfo->task_completion_id = -1; | 240 | rtinfo->task_completion_id = -1; |
@@ -206,11 +247,16 @@ void init_rt_event_cache(struct rt_graph_info *rtinfo) | |||
206 | 247 | ||
207 | rtinfo->release_pid_field = NULL; | 248 | rtinfo->release_pid_field = NULL; |
208 | rtinfo->release_job_field = NULL; | 249 | rtinfo->release_job_field = NULL; |
250 | rtinfo->release_release_field = NULL; | ||
209 | rtinfo->release_deadline_field = NULL; | 251 | rtinfo->release_deadline_field = NULL; |
210 | 252 | ||
211 | rtinfo->completion_pid_field = NULL; | 253 | rtinfo->completion_pid_field = NULL; |
212 | rtinfo->completion_job_field = NULL; | 254 | rtinfo->completion_job_field = NULL; |
255 | rtinfo->completion_when_field = NULL; | ||
213 | 256 | ||
214 | rtinfo->block_pid_field = NULL; | 257 | rtinfo->block_pid_field = NULL; |
258 | rtinfo->block_when_field = NULL; | ||
259 | |||
215 | rtinfo->resume_pid_field = NULL; | 260 | rtinfo->resume_pid_field = NULL; |
261 | rtinfo->resume_when_field = NULL; | ||
216 | } | 262 | } |