aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/sched_trace.h
blob: 47cd4ed5e09278defef5d0ee8fd19733fd117216 (plain) (blame)
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