#include #include #include #include #include #include #include #include #include #include #define server_job(s) ((s)->job ? *(s)->job : 0) #define trace_switch(s, type) sched_trace_server_switch_ ##type ( \ (s)->parent, 0, (s)->sid, server_job(s), (s)->cpu) #define trace_transition(s, type) \ sched_trace_server_switch_ ##type(0, 0, (s)->sid, server_job(s), (s)->cpu) #define NCS(x) case x: return #x static const char* server_state_name(enum server_state state) { switch(state) { NCS(SS_ACTIVE); NCS(SS_REMOVED); NCS(SS_BLOCKED); default: return "UNKNOWN"; } } void server_init(struct server *server, int sid, int *job, int cpu) { server->sid = sid; server->job = job; server->cpu = cpu; server->parent = 0; server->state = SS_REMOVED; server->linked = 0; server->in_transit = 0; } void server_state_change(struct server *server, enum server_state state, unsigned int transit) { enum server_state last = server->state; if (!server->in_transit && transit && server->state == state) { return; } if (server->in_transit == transit && state == server->state) { return; } if (server->in_transit) { trace_transition(server, away); last = server->last; } if (server->state == SS_BLOCKED) { sched_trace_server_resume(server->sid); } if (transit) { trace_transition(server, to); } else { if (last == SS_ACTIVE) { trace_switch(server, away); } switch (state) { case SS_BLOCKED: sched_trace_server_block(server->sid); break; case SS_ACTIVE: trace_switch(server, to); break; } } set_state: #ifdef CONFIG_PREEMPT_STATE_TRACE STRACE("server: %d (parent: %d, cpu: %d, job: %d) - (%s:%d)->(%s:%d) at %llu\n", server->sid, server->parent, server->cpu, (server->job) ? *server->job : 0, server_state_name(server->state), server->in_transit, server_state_name(state), transit, litmus_clock()); #endif server->last = server->state; server->state = state; server->in_transit = transit; }