aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJonathan Herman <hermanjl@cs.unc.edu>2012-10-15 17:18:33 -0400
committerJonathan Herman <hermanjl@cs.unc.edu>2012-10-15 17:18:33 -0400
commit76ec41ad78e824c421c29e20cd145d95ec88b258 (patch)
treebeec7a78d0edce041243348b94a1d420a279925c
parent67be6e7922465a9cc94a8c6f0353cb7051a6f97d (diff)
Fixed sched_trace records for state transitions.
This commit is dirty and will be cleaned up when blocking states are tested.
-rw-r--r--include/litmus/sched_mc.h2
-rw-r--r--include/litmus/sched_trace.h12
-rw-r--r--include/litmus/server.h8
-rw-r--r--include/trace/events/litmus.h20
-rw-r--r--litmus/sched_mc.c50
-rw-r--r--litmus/server.c54
6 files changed, 81 insertions, 65 deletions
diff --git a/include/litmus/sched_mc.h b/include/litmus/sched_mc.h
index 12afd5525fc..05bac64caa3 100644
--- a/include/litmus/sched_mc.h
+++ b/include/litmus/sched_mc.h
@@ -31,7 +31,7 @@ struct mc_data {
31#define is_ghost(t) \ 31#define is_ghost(t) \
32 (get_rt_job(t) < get_user_job(t) && (tsk_rt(t)->completed)) 32 (get_rt_job(t) < get_user_job(t) && (tsk_rt(t)->completed))
33#define ce_sid(ce) \ 33#define ce_sid(ce) \
34 (-((ce)->level * num_online_cpus() + crit_cpu(ce)->cpu + 1)) 34 (-(num_online_cpus() + (ce)->level * num_online_cpus() + crit_cpu(ce)->cpu + 1))
35 35
36#define TS "(%s/%d:%d:%d:%s)" 36#define TS "(%s/%d:%d:%d:%s)"
37#define TA(t) (t) ? is_ghost(t) ? "ghost" : t->comm : "NULL", \ 37#define TA(t) (t) ? is_ghost(t) ? "ghost" : t->comm : "NULL", \
diff --git a/include/litmus/sched_trace.h b/include/litmus/sched_trace.h
index 59fa5db6f40..6bad8a78e4a 100644
--- a/include/litmus/sched_trace.h
+++ b/include/litmus/sched_trace.h
@@ -205,8 +205,8 @@ feather_callback void do_sched_trace_task_tardy(unsigned long id,
205 205
206#define trace_litmus_container_param(cid, name) 206#define trace_litmus_container_param(cid, name)
207#define trace_litmus_server_param(sid, cid, wcet, time) 207#define trace_litmus_server_param(sid, cid, wcet, time)
208#define trace_litmus_server_switch_to(sid, job, tid, tjob) 208#define trace_litmus_server_switch_to(sid, job, tid, tjob, cpu)
209#define trace_litmus_server_switch_away(sid, job, tid, tjob) 209#define trace_litmus_server_switch_away(sid, job, tid, tjob, cpu)
210#define trace_litmus_server_release(sid, job, release, deadline) 210#define trace_litmus_server_release(sid, job, release, deadline)
211#define trace_litmus_server_completion(sid, job) 211#define trace_litmus_server_completion(sid, job)
212#define trace_litmus_server_block(sid) 212#define trace_litmus_server_block(sid)
@@ -328,14 +328,14 @@ feather_callback void do_sched_trace_task_tardy(unsigned long id,
328 trace_litmus_server_param(sid, cid, wcet, period); \ 328 trace_litmus_server_param(sid, cid, wcet, period); \
329 } while(0) 329 } while(0)
330 330
331#define sched_trace_server_switch_to(sid, job, tid, tjob) \ 331#define sched_trace_server_switch_to(sid, job, tid, tjob, cpu) \
332 do { \ 332 do { \
333 trace_litmus_server_switch_to(sid, job, tid, tjob); \ 333 trace_litmus_server_switch_to(sid, job, tid, tjob, cpu);\
334 } while(0) 334 } while(0)
335 335
336#define sched_trace_server_switch_away(sid, job, tid, tjob) \ 336#define sched_trace_server_switch_away(sid, job, tid, tjob, cpu) \
337 do { \ 337 do { \
338 trace_litmus_server_switch_away(sid, job, tid, tjob); \ 338 trace_litmus_server_switch_away(sid, job, tid, tjob, cpu);\
339 } while (0) 339 } while (0)
340 340
341#define sched_trace_server_release(sid, job, job_params) \ 341#define sched_trace_server_release(sid, job, job_params) \
diff --git a/include/litmus/server.h b/include/litmus/server.h
index c950325954f..35a2ad85cf3 100644
--- a/include/litmus/server.h
+++ b/include/litmus/server.h
@@ -1,7 +1,7 @@
1#ifndef __SERVER_H 1#ifndef __SERVER_H
2#define __SERVER_H 2#define __SERVER_H
3 3
4enum server_state { SS_ACTIVE, SS_REMOVED , SS_BLOCKED}; 4enum server_state { SS_ACTIVE, SS_REMOVED , SS_BLOCKED };
5 5
6/* 6/*
7 * An accounting class only. 7 * An accounting class only.
@@ -9,15 +9,17 @@ enum server_state { SS_ACTIVE, SS_REMOVED , SS_BLOCKED};
9struct server { 9struct server {
10 int sid; 10 int sid;
11 unsigned int *job; 11 unsigned int *job;
12 int cpu; 12 int *cpu;
13 int parent;
13 14
14 unsigned int in_transit:1; 15 unsigned int in_transit:1;
15 16
16 enum server_state state; 17 enum server_state state;
18 enum server_state last;
17 struct task_struct *linked; 19 struct task_struct *linked;
18}; 20};
19 21
20void server_init(struct server *server, int sid, int *job); 22void server_init(struct server *server, int sid, int *job, int *cpu);
21void server_state_change(struct server *server, enum server_state state, 23void server_state_change(struct server *server, enum server_state state,
22 unsigned int transit); 24 unsigned int transit);
23 25
diff --git a/include/trace/events/litmus.h b/include/trace/events/litmus.h
index f7143aa0d18..95aae9460cb 100644
--- a/include/trace/events/litmus.h
+++ b/include/trace/events/litmus.h
@@ -347,15 +347,16 @@ TRACE_EVENT(litmus_server_param,
347 347
348TRACE_EVENT(litmus_server_switch_to, 348TRACE_EVENT(litmus_server_switch_to,
349 349
350 TP_PROTO(int sid, unsigned int job, int tid, unsigned int tjob), 350 TP_PROTO(int sid, unsigned int job, int tid, unsigned int tjob, int cpu),
351 351
352 TP_ARGS(sid, job, tid, tjob), 352 TP_ARGS(sid, job, tid, tjob, cpu),
353 353
354 TP_STRUCT__entry( 354 TP_STRUCT__entry(
355 __field( int, sid) 355 __field( int, sid)
356 __field( unsigned int, job) 356 __field( unsigned int, job)
357 __field( int, tid) 357 __field( int, tid)
358 __field( unsigned int, tjob) 358 __field( unsigned int, tjob)
359 __field( int, cpu)
359 ), 360 ),
360 361
361 TP_fast_assign( 362 TP_fast_assign(
@@ -363,23 +364,25 @@ TRACE_EVENT(litmus_server_switch_to,
363 __entry->tid = tid; 364 __entry->tid = tid;
364 __entry->job = job; 365 __entry->job = job;
365 __entry->tjob = tjob; 366 __entry->tjob = tjob;
367 __entry->cpu = cpu;
366 ), 368 ),
367 369
368 TP_printk("switch_to(server(%d, %u)): (%d, %d)\n", 370 TP_printk("switch_to(server(%d, %u)): (%d, %d) on %d\n",
369 __entry->sid, __entry->job, __entry->tid, __entry->tjob) 371 __entry->sid, __entry->job, __entry->tid, __entry->tjob, __entry->cpu)
370); 372);
371 373
372TRACE_EVENT(litmus_server_switch_away, 374TRACE_EVENT(litmus_server_switch_away,
373 375
374 TP_PROTO(int sid, unsigned int job, int tid, unsigned int tjob), 376 TP_PROTO(int sid, unsigned int job, int tid, unsigned int tjob, int cpu),
375 377
376 TP_ARGS(sid, job, tid, tjob), 378 TP_ARGS(sid, job, tid, tjob, cpu),
377 379
378 TP_STRUCT__entry( 380 TP_STRUCT__entry(
379 __field( int, sid) 381 __field( int, sid)
380 __field( unsigned int, job) 382 __field( unsigned int, job)
381 __field( int, tid) 383 __field( int, tid)
382 __field( unsigned int, tjob) 384 __field( unsigned int, tjob)
385 __field( int, cpu)
383 ), 386 ),
384 387
385 TP_fast_assign( 388 TP_fast_assign(
@@ -387,10 +390,11 @@ TRACE_EVENT(litmus_server_switch_away,
387 __entry->tid = tid; 390 __entry->tid = tid;
388 __entry->job = job; 391 __entry->job = job;
389 __entry->tjob = tjob; 392 __entry->tjob = tjob;
393 __entry->cpu = cpu;
390 ), 394 ),
391 395
392 TP_printk("switch_away(server(%d, %u)): (%d, %d)\n", 396 TP_printk("switch_away(server(%d, %u)): (%d, %d) on %d\n",
393 __entry->sid, __entry->job, __entry->tid, __entry->tjob) 397 __entry->sid, __entry->job, __entry->tid, __entry->tjob, __entry->cpu)
394); 398);
395 399
396TRACE_EVENT(litmus_server_release, 400TRACE_EVENT(litmus_server_release,
diff --git a/litmus/sched_mc.c b/litmus/sched_mc.c
index f0200176c49..17e1f47173d 100644
--- a/litmus/sched_mc.c
+++ b/litmus/sched_mc.c
@@ -122,8 +122,9 @@ static int acquire_resources(struct task_struct *t)
122 } 122 }
123 123
124 acquired = has_resources(t, cpu); 124 acquired = has_resources(t, cpu);
125 if (acquired) 125 if (acquired) {
126 server_state_change(task_server, SS_ACTIVE, 0); 126 server_state_change(task_server, SS_ACTIVE, 0);
127 }
127 raw_spin_unlock(&dgl_lock); 128 raw_spin_unlock(&dgl_lock);
128 129
129 return acquired; 130 return acquired;
@@ -235,13 +236,8 @@ static void fix_crit_position(struct crit_entry *ce)
235{ 236{
236 struct server *server = &ce->server; 237 struct server *server = &ce->server;
237 if (is_global(ce->domain) && server->in_transit) { 238 if (is_global(ce->domain) && server->in_transit) {
238 if (SS_ACTIVE == server->state) { 239 server_state_change(server, server->state, 0);
239 server_state_change(server, SS_ACTIVE, 0); 240 update_crit_position(ce);
240 update_crit_position(ce);
241 } else if (SS_REMOVED == server->state) {
242 server_state_change(server, SS_REMOVED, 0);
243 update_crit_position(ce);
244 }
245 } 241 }
246} 242}
247 243
@@ -259,12 +255,12 @@ static inline struct crit_entry* lowest_prio_cpu(struct domain *dom)
259 hn = bheap_peek(cpu_lower_prio, heap); 255 hn = bheap_peek(cpu_lower_prio, heap);
260 ce = (hn) ? hn->value : NULL; 256 ce = (hn) ? hn->value : NULL;
261 if (ce) { 257 if (ce) {
262 if (ce->server.state == SS_ACTIVE) 258 if (ce->server.in_transit)
259 fix_crit_position(ce);
260 else if (ce->server.state == SS_ACTIVE)
263 res = ce; 261 res = ce;
264 else if (ce->server.state == SS_REMOVED) 262 else if (ce->server.state == SS_REMOVED)
265 ce = NULL; 263 ce = NULL;
266 else
267 fix_crit_position(ce);
268 } 264 }
269 } while (ce && !res); 265 } while (ce && !res);
270 266
@@ -323,7 +319,6 @@ static void start_crit(struct crit_entry *ce)
323#endif 319#endif
324 } 320 }
325 321
326 task_server->cpu = ce_sid(ce);
327 server_state_change(task_server, SS_ACTIVE, 0); 322 server_state_change(task_server, SS_ACTIVE, 0);
328} 323}
329 324
@@ -344,7 +339,6 @@ static void stop_crit(struct crit_entry *ce)
344 } 339 }
345 340
346 server_state_change(task_server, SS_REMOVED, 0); 341 server_state_change(task_server, SS_REMOVED, 0);
347 task_server->cpu = 0;
348} 342}
349 343
350/** 344/**
@@ -371,17 +365,17 @@ static void link_task_to_crit(struct crit_entry *ce,
371 365
372 TRACE_MC_TASK(ce->server.linked, "Unlinking\n"); 366 TRACE_MC_TASK(ce->server.linked, "Unlinking\n");
373 367
374 ce->server.linked->rt_param.linked_on = NO_CPU;
375 ce->server.linked->rt_param.server.cpu = 0;
376 stop_crit(ce); 368 stop_crit(ce);
369 tsk_rt(ce->server.linked)->server.parent = 0;
370 ce->server.linked->rt_param.linked_on = NO_CPU;
377 } 371 }
378 372
379 /* Actually link task */ 373 /* Actually link task */
380 ce->server.linked = task; 374 ce->server.linked = task;
381 if (task) { 375 if (task) {
382 /* Block if task cannot acquire resources */ 376 /* Block if task cannot acquire resources */
383 task->rt_param.linked_on = crit_cpu(ce)->cpu; 377 task->rt_param.linked_on = crit_cpu(ce)->cpu;
384 task->rt_param.server.cpu = ce_sid(ce); 378 tsk_rt(task)->server.parent = ce_sid(ce);
385 379
386 if (ce->domain->acquire_resources(task)) { 380 if (ce->domain->acquire_resources(task)) {
387 start_crit(ce); 381 start_crit(ce);
@@ -449,6 +443,7 @@ static void low_prio_arrival(struct task_struct *task)
449#endif 443#endif
450 { 444 {
451arrive: 445arrive:
446 TRACE_MC_TASK(task, "On interrupt master, requeueing task\n");
452 job_arrival(task); 447 job_arrival(task);
453 } 448 }
454} 449}
@@ -499,14 +494,16 @@ static void link_task_to_cpu(struct cpu_entry *entry, struct task_struct *task)
499 server = &tsk_rt(entry->linked)->server; 494 server = &tsk_rt(entry->linked)->server;
500 sched_trace_server_switch_away(server->sid, *server->job, 495 sched_trace_server_switch_away(server->sid, *server->job,
501 entry->linked->pid, 496 entry->linked->pid,
502 get_user_job(entry->linked)); 497 get_user_job(entry->linked),
498 entry->cpu);
503 } 499 }
504 500
505 if (task) { 501 if (task) {
506 server = &tsk_rt(task)->server; 502 server = &tsk_rt(task)->server;
507 sched_trace_server_switch_to(server->sid, *server->job, 503 sched_trace_server_switch_to(server->sid, *server->job,
508 task->pid, 504 task->pid,
509 get_user_job(task)); 505 get_user_job(task),
506 entry->cpu);
510 } 507 }
511 508
512 entry->linked = task; 509 entry->linked = task;
@@ -517,6 +514,7 @@ static void link_task_to_cpu(struct cpu_entry *entry, struct task_struct *task)
517 server = &ce->server; 514 server = &ce->server;
518 515
519 if (server->state == SS_REMOVED) { 516 if (server->state == SS_REMOVED) {
517 TRACE_CRIT_ENTRY(ce, "Moving up to active\n");
520 server_state_change(server, SS_ACTIVE, 1); 518 server_state_change(server, SS_ACTIVE, 1);
521 } 519 }
522 } 520 }
@@ -600,8 +598,9 @@ static void update_crit_levels(struct cpu_entry *entry)
600 if (ce->server.linked) { 598 if (ce->server.linked) {
601 link_task_to_crit(ce, NULL); 599 link_task_to_crit(ce, NULL);
602 } 600 }
601 TRACE_CRIT_ENTRY(ce, "Removing lower crit\n");
603 server_state_change(server, SS_REMOVED, 1); 602 server_state_change(server, SS_REMOVED, 1);
604 TRACE_CRIT_ENTRY(ce, "(SS_REMOVE)\n"); 603
605 } 604 }
606 } 605 }
607 /* Need to unlock so we can access domains */ 606 /* Need to unlock so we can access domains */
@@ -728,12 +727,12 @@ static void remove_from_all(struct task_struct* task)
728 ce = &entry->crit_entries[tsk_mc_crit(task)]; 727 ce = &entry->crit_entries[tsk_mc_crit(task)];
729 if (task->rt_param.linked_on != NO_CPU) { 728 if (task->rt_param.linked_on != NO_CPU) {
730 BUG_ON(ce->server.linked != task); 729 BUG_ON(ce->server.linked != task);
731 link_task_to_crit(ce, NULL);
732 update_crit_position(ce);
733 if (entry->linked == task) { 730 if (entry->linked == task) {
734 update = 1; 731 update = 1;
735 link_task_to_cpu(entry, NULL); 732 link_task_to_cpu(entry, NULL);
736 } 733 }
734 link_task_to_crit(ce, NULL);
735 update_crit_position(ce);
737 } else { 736 } else {
738 TRACE_MC_TASK(task, "Unlinked before we got lock!\n"); 737 TRACE_MC_TASK(task, "Unlinked before we got lock!\n");
739 } 738 }
@@ -985,7 +984,8 @@ static void mc_task_new(struct task_struct *t, int on_rq, int running)
985 sched_trace_server_param(-t->pid, t->pid, 984 sched_trace_server_param(-t->pid, t->pid,
986 get_exec_cost(t), get_rt_period(t)); 985 get_exec_cost(t), get_rt_period(t));
987 server_init(&tsk_rt(t)->server, -t->pid, 986 server_init(&tsk_rt(t)->server, -t->pid,
988 &tsk_rt(t)->job_params.job_no); 987 &tsk_rt(t)->job_params.job_no,
988 &tsk_rt(t)->linked_on);
989 tsk_rt(t)->task_params.budget_policy = PRECISE_ENFORCEMENT; 989 tsk_rt(t)->task_params.budget_policy = PRECISE_ENFORCEMENT;
990 990
991 BUG_ON(!tsk_rt(t)->server.job); 991 BUG_ON(!tsk_rt(t)->server.job);
@@ -1559,8 +1559,8 @@ static void init_crit_entry(struct crit_entry *ce, enum crit_level level,
1559 ce->server.linked = NULL; 1559 ce->server.linked = NULL;
1560 ce->node = node; 1560 ce->node = node;
1561 ce->domain = &dom_data->domain; 1561 ce->domain = &dom_data->domain;
1562 server_init(&ce->server, ce_sid(ce), 0); 1562 server_init(&ce->server, ce_sid(ce), 0, &entry->cpu);
1563 ce->server.cpu = -entry->cpu - 1; 1563 ce->server.parent = -entry->cpu - 1;
1564#ifdef CONFIG_MERGE_TIMERS 1564#ifdef CONFIG_MERGE_TIMERS
1565 init_event(&ce->event, level, mc_ghost_exhausted, 1565 init_event(&ce->event, level, mc_ghost_exhausted,
1566 event_list_alloc(GFP_ATOMIC)); 1566 event_list_alloc(GFP_ATOMIC));
diff --git a/litmus/server.c b/litmus/server.c
index 3ff48e8316a..6e713a24fd3 100644
--- a/litmus/server.c
+++ b/litmus/server.c
@@ -13,9 +13,9 @@
13 13
14#define server_job(s) ((s)->job ? *(s)->job : 0) 14#define server_job(s) ((s)->job ? *(s)->job : 0)
15#define trace_switch(s, type) sched_trace_server_switch_ ##type ( \ 15#define trace_switch(s, type) sched_trace_server_switch_ ##type ( \
16 (s)->cpu, 0, (s)->sid, server_job(s)) 16 (s)->parent, 0, (s)->sid, server_job(s), *(s)->cpu)
17#define trace_transition(s, type) \ 17#define trace_transition(s, type) \
18 sched_trace_server_switch_ ##type(0, 0, (s)->sid, server_job(s)) 18 sched_trace_server_switch_ ##type(0, 0, (s)->sid, server_job(s), *(s)->cpu)
19 19
20#define NCS(x) case x: return #x 20#define NCS(x) case x: return #x
21 21
@@ -29,12 +29,13 @@ static const char* server_state_name(enum server_state state)
29 } 29 }
30} 30}
31 31
32void server_init(struct server *server, int sid, int *job) 32void server_init(struct server *server, int sid, int *job, int *cpu)
33{ 33{
34 server->sid = sid; 34 server->sid = sid;
35 server->job = job; 35 server->job = job;
36 36
37 server->cpu = 0; 37 server->cpu = cpu;
38 server->parent = 0;
38 server->state = SS_REMOVED; 39 server->state = SS_REMOVED;
39 server->linked = 0; 40 server->linked = 0;
40 server->in_transit = 0; 41 server->in_transit = 0;
@@ -43,38 +44,45 @@ void server_init(struct server *server, int sid, int *job)
43void server_state_change(struct server *server, enum server_state state, 44void server_state_change(struct server *server, enum server_state state,
44 unsigned int transit) 45 unsigned int transit)
45{ 46{
47 enum server_state last = server->state;
48
46 if (!server->in_transit && transit && 49 if (!server->in_transit && transit &&
47 server->state == state) 50 server->state == state) {
51 STRACE("Ignoring transit state when target same\n");
48 return; 52 return;
49 if (server->in_transit == transit && state == server->state) 53 }
54 if (server->in_transit == transit && state == server->state) {
55 STRACE("Ignoring identical change\n");
50 return; 56 return;
51
52 if (server->in_transit && transit) {
53 sched_trace_server_completion(server->sid, 0);
54 goto set_state;
55 } 57 }
56 58
57 if (server->in_transit) { 59 if (server->in_transit) {
60 STRACE("Transition end\n");
58 trace_transition(server, away); 61 trace_transition(server, away);
59 } else { 62 last = server->last;
60 switch (server->state) { 63 }
61 case SS_BLOCKED: 64
62 sched_trace_server_resume(server->sid); 65 if (server->state == SS_BLOCKED) {
63 break; 66 STRACE("Server resume\n");
64 case SS_ACTIVE: 67 sched_trace_server_resume(server->sid);
65 trace_switch(server, away);
66 break;
67 }
68 } 68 }
69 69
70 if (transit) { 70 if (transit) {
71 STRACE("Transition begin\n");
71 trace_transition(server, to); 72 trace_transition(server, to);
72 } else { 73 } else {
74 if (last == SS_ACTIVE) {
75 STRACE("Switch from server\n");
76 trace_switch(server, away);
77 }
78
73 switch (state) { 79 switch (state) {
74 case SS_BLOCKED: 80 case SS_BLOCKED:
81 STRACE("Server block\n");
75 sched_trace_server_block(server->sid); 82 sched_trace_server_block(server->sid);
76 break; 83 break;
77 case SS_ACTIVE: 84 case SS_ACTIVE:
85 STRACE("Switch to server\n");
78 trace_switch(server, to); 86 trace_switch(server, to);
79 break; 87 break;
80 } 88 }
@@ -82,11 +90,13 @@ void server_state_change(struct server *server, enum server_state state,
82 90
83 set_state: 91 set_state:
84#ifdef CONFIG_PREEMPT_STATE_TRACE 92#ifdef CONFIG_PREEMPT_STATE_TRACE
85 STRACE("server: %d - (%s:%d)->(%s:%d)\n", 93 STRACE("server: %d (parent: %d, cpu: %d, job: %d) - (%s:%d)->(%s:%d) at %llu\n",
86 server->sid, 94 server->sid, server->parent, *server->cpu, (server->job) ? *server->job : 0,
87 server_state_name(server->state), server->in_transit, 95 server_state_name(server->state), server->in_transit,
88 server_state_name(state), transit); 96 server_state_name(state), transit,
97 litmus_clock());
89#endif 98#endif
99 server->last = server->state;
90 server->state = state; 100 server->state = state;
91 server->in_transit = transit; 101 server->in_transit = transit;
92} 102}