1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
|
/* sched_trace.h -- record scheduler events to a byte stream for offline analysis.
*/
#ifndef _LINUX_SCHED_TRACE_H_
#define _LINUX_SCHED_TRACE_H_
#include <linux/sched.h>
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,
} trace_type_t;
typedef struct {
trace_type_t trace:8;
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;
} 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;
#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);
#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)
#endif
#ifdef CONFIG_SCHED_DEBUG_TRACE
void sched_trace_log_message(const char* fmt, ...);
#else
#define sched_trace_log_message(fmt, ...)
#endif
#endif
|