diff options
author | Jonathan Herman <hermanjl@cs.unc.edu> | 2012-10-15 17:18:33 -0400 |
---|---|---|
committer | Jonathan Herman <hermanjl@cs.unc.edu> | 2012-10-15 17:18:33 -0400 |
commit | 76ec41ad78e824c421c29e20cd145d95ec88b258 (patch) | |
tree | beec7a78d0edce041243348b94a1d420a279925c | |
parent | 67be6e7922465a9cc94a8c6f0353cb7051a6f97d (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.h | 2 | ||||
-rw-r--r-- | include/litmus/sched_trace.h | 12 | ||||
-rw-r--r-- | include/litmus/server.h | 8 | ||||
-rw-r--r-- | include/trace/events/litmus.h | 20 | ||||
-rw-r--r-- | litmus/sched_mc.c | 50 | ||||
-rw-r--r-- | litmus/server.c | 54 |
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 | ||
4 | enum server_state { SS_ACTIVE, SS_REMOVED , SS_BLOCKED}; | 4 | enum 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}; | |||
9 | struct server { | 9 | struct 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 | ||
20 | void server_init(struct server *server, int sid, int *job); | 22 | void server_init(struct server *server, int sid, int *job, int *cpu); |
21 | void server_state_change(struct server *server, enum server_state state, | 23 | void 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 | ||
348 | TRACE_EVENT(litmus_server_switch_to, | 348 | TRACE_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 | ||
372 | TRACE_EVENT(litmus_server_switch_away, | 374 | TRACE_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 | ||
396 | TRACE_EVENT(litmus_server_release, | 400 | TRACE_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 | { |
451 | arrive: | 445 | arrive: |
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 | ||
32 | void server_init(struct server *server, int sid, int *job) | 32 | void 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) | |||
43 | void server_state_change(struct server *server, enum server_state state, | 44 | void 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 | } |