/* sched_trace.h -- record scheduler events to a byte stream for offline analysis. */ #ifndef _LINUX_SCHED_TRACE_H_ #define _LINUX_SCHED_TRACE_H_ #include typedef enum { ST_INVOCATION = 0, ST_ARRIVAL = 1, ST_DEPARTURE = 2, ST_PREEMPTION = 3, ST_SCHEDULED = 4, ST_JOB_RELEASE = 5, ST_JOB_COMPLETION = 6, ST_CAPACITY_RELEASE = 7, ST_CAPACITY_ALLOCATION = 8, ST_SERVICE_LEVEL_CHANGE = 9, ST_WEIGHT_ERROR = 10, } trace_type_t; typedef struct { trace_type_t trace:8; unsigned int size:24; unsigned long long timestamp; } trace_header_t; typedef struct { unsigned int is_rt:1; unsigned int is_server:1; task_class_t class:4; unsigned int budget:24; u32 deadline; pid_t pid; } task_info_t; typedef struct { trace_header_t header; unsigned long flags; } invocation_record_t; typedef struct { trace_header_t header; task_info_t task; } arrival_record_t; typedef struct { trace_header_t header; task_info_t task; } departure_record_t; typedef struct { trace_header_t header; task_info_t task; task_info_t by; } preemption_record_t; typedef struct { trace_header_t header; task_info_t task; } scheduled_record_t; typedef struct { trace_header_t header; task_info_t task; u16 period; u16 wcet; } release_record_t; typedef struct { trace_header_t header; task_info_t task; u16 period; u16 wcet; int tardiness; unsigned int job_no; } completion_record_t; typedef struct { trace_header_t header; task_info_t task; } cap_release_record_t; typedef struct { trace_header_t header; task_info_t task; u16 budget; u32 deadline; pid_t donor; } cap_allocation_record_t; typedef struct { trace_header_t header; task_info_t task; unsigned int from:16; unsigned int to:16; service_level_t new_level; service_level_t old_level; } service_level_change_record_t; typedef struct { trace_header_t header; pid_t task; fp_t estimate; fp_t actual; } weight_error_record_t; #ifdef CONFIG_SCHED_TASK_TRACE void sched_trace_scheduler_invocation(void); void sched_trace_task_arrival(struct task_struct *t); void sched_trace_task_departure(struct task_struct *t); void sched_trace_task_preemption(struct task_struct *t, struct task_struct* by); void sched_trace_task_scheduled(struct task_struct *); void sched_trace_job_release(struct task_struct *t); void sched_trace_job_completion(struct task_struct *t); void sched_trace_capacity_release(struct task_struct *t); void sched_trace_capacity_allocation(struct task_struct *t, u16 budget, u32 deadline, pid_t donor); void sched_trace_capacity_alloc_srv(pid_t srv, u32 srv_dl, task_class_t cls, u16 srv_budget, u16 budget, u32 deadline, pid_t donor); void sched_trace_server_release(int id, unsigned int wcet, unsigned int period, task_class_t class); void sched_trace_server_completion(int id, unsigned int budget, jiffie_t deadline, task_class_t class); void sched_trace_server_scheduled(int id, task_class_t class, unsigned int budget, jiffie_t deadline); void sched_trace_service_level_change(struct task_struct* t, unsigned int from, unsigned int to); void sched_trace_weight_error(struct task_struct* t, fp_t actual); #else #define sched_trace_scheduler_invocation(x) #define sched_trace_task_arrival(t) #define sched_trace_task_departure(t) #define sched_trace_task_preemption(t, by) #define sched_trace_task_scheduled(t) #define sched_trace_job_release(t) #define sched_trace_job_completion(t) #define sched_trace_capacity_release(t) #define sched_trace_capacity_allocation(t, budget, deadline, donor) #define sched_trace_capacity_alloc_srv(srv, srv_dl, cls, srv_budget,\ budget, deadline, donor) #define sched_trace_server_release(id, wcet, period, class) #define sched_trace_server_completion(id, budget, deadline, class) #define sched_trace_server_scheduled(id, class, budget, deadline) #define sched_trace_service_level_change(t, a, b) #define sched_trace_weight_error(x, y) #endif #ifdef CONFIG_SCHED_DEBUG_TRACE void sched_trace_log_message(const char* fmt, ...); #else #define sched_trace_log_message(fmt, ...) #endif #endif