aboutsummaryrefslogtreecommitdiffstats
path: root/include/litmus
diff options
context:
space:
mode:
Diffstat (limited to 'include/litmus')
-rw-r--r--include/litmus/pgm.h12
-rw-r--r--include/litmus/rt_param.h15
-rw-r--r--include/litmus/sched_trace.h39
3 files changed, 65 insertions, 1 deletions
diff --git a/include/litmus/pgm.h b/include/litmus/pgm.h
new file mode 100644
index 000000000000..5682a76b3acb
--- /dev/null
+++ b/include/litmus/pgm.h
@@ -0,0 +1,12 @@
1#ifndef _LITMUS_PGM_H_
2#define _LITMUS_PGM_H_
3
4#include <litmus/litmus.h>
5
6#define is_pgm_waiting(t) (tsk_rt(t)->ctrl_page && tsk_rt(t)->ctrl_page->pgm_waiting)
7#define is_pgm_sending(t) (tsk_rt(t)->ctrl_page && tsk_rt(t)->ctrl_page->pgm_sending)
8#define is_pgm_satisfied(t) (tsk_rt(t)->ctrl_page && tsk_rt(t)->ctrl_page->pgm_satisfied)
9
10int setup_pgm_release(struct task_struct* t);
11
12#endif
diff --git a/include/litmus/rt_param.h b/include/litmus/rt_param.h
index a3dde39753bd..fa0f5f4647bd 100644
--- a/include/litmus/rt_param.h
+++ b/include/litmus/rt_param.h
@@ -51,6 +51,14 @@ typedef enum {
51 TASK_EARLY 51 TASK_EARLY
52} release_policy_t; 52} release_policy_t;
53 53
54typedef enum {
55 PGM_NOT_A_NODE,
56 PGM_SRC,
57 PGM_SINK,
58 PGM_SRC_SINK,
59 PGM_INTERNAL
60} pgm_node_type_t;
61
54/* We use the common priority interpretation "lower index == higher priority", 62/* We use the common priority interpretation "lower index == higher priority",
55 * which is commonly used in fixed-priority schedulability analysis papers. 63 * which is commonly used in fixed-priority schedulability analysis papers.
56 * So, a numerically lower priority value implies higher scheduling priority, 64 * So, a numerically lower priority value implies higher scheduling priority,
@@ -122,6 +130,8 @@ struct rt_task {
122 task_class_t cls; 130 task_class_t cls;
123 budget_policy_t budget_policy; /* ignored by pfair */ 131 budget_policy_t budget_policy; /* ignored by pfair */
124 release_policy_t release_policy; 132 release_policy_t release_policy;
133 pgm_node_type_t pgm_type;
134 lt_t pgm_expected_etoe;
125}; 135};
126 136
127union np_flag { 137union np_flag {
@@ -162,6 +172,11 @@ struct control_page {
162 uint64_t irq_syscall_start; /* Snapshot of irq_count when the syscall 172 uint64_t irq_syscall_start; /* Snapshot of irq_count when the syscall
163 * started. */ 173 * started. */
164 174
175 /* Flags from userspace signifying PGM wait states. */
176 volatile uint32_t pgm_waiting; /* waiting for tokens */
177 volatile uint32_t pgm_sending; /* sending tokens */
178 volatile uint32_t pgm_satisfied; /* done waiting/sending */
179
165 /* to be extended */ 180 /* to be extended */
166}; 181};
167 182
diff --git a/include/litmus/sched_trace.h b/include/litmus/sched_trace.h
index 82bde8241298..d3f78a812ef3 100644
--- a/include/litmus/sched_trace.h
+++ b/include/litmus/sched_trace.h
@@ -80,6 +80,19 @@ struct st_sys_release_data {
80 u64 release; 80 u64 release;
81}; 81};
82 82
83struct st_pgm_param_data {
84 u32 node_type;
85 u16 graph_pid;
86 u16 unused;
87 u64 expected_graph_etoe;
88};
89
90struct st_pgm_release_data {
91 u64 release; /* PGM-adjusted release time */
92 u64 deadline; /* PGM-adjusted deadline */
93};
94
95
83#define DATA(x) struct st_ ## x ## _data x; 96#define DATA(x) struct st_ ## x ## _data x;
84 97
85typedef enum { 98typedef enum {
@@ -94,7 +107,9 @@ typedef enum {
94 ST_BLOCK, 107 ST_BLOCK,
95 ST_RESUME, 108 ST_RESUME,
96 ST_ACTION, 109 ST_ACTION,
97 ST_SYS_RELEASE 110 ST_SYS_RELEASE,
111 ST_PGM_PARAM,
112 ST_PGM_RELEASE
98} st_event_record_type_t; 113} st_event_record_type_t;
99 114
100struct st_event_record { 115struct st_event_record {
@@ -113,6 +128,8 @@ struct st_event_record {
113 DATA(resume); 128 DATA(resume);
114 DATA(action); 129 DATA(action);
115 DATA(sys_release); 130 DATA(sys_release);
131 DATA(pgm_param);
132 DATA(pgm_release);
116 } data; 133 } data;
117}; 134};
118 135
@@ -154,6 +171,10 @@ feather_callback void do_sched_trace_action(unsigned long id,
154 unsigned long action); 171 unsigned long action);
155feather_callback void do_sched_trace_sys_release(unsigned long id, 172feather_callback void do_sched_trace_sys_release(unsigned long id,
156 lt_t* start); 173 lt_t* start);
174feather_callback void do_sched_trace_pgm_param(unsigned long id,
175 struct task_struct* task);
176feather_callback void do_sched_trace_pgm_release(unsigned long id,
177 struct task_struct* task);
157 178
158#endif 179#endif
159 180
@@ -179,6 +200,8 @@ feather_callback void do_sched_trace_sys_release(unsigned long id,
179#define trace_litmus_task_block(t) 200#define trace_litmus_task_block(t)
180#define trace_litmus_task_resume(t) 201#define trace_litmus_task_resume(t)
181#define trace_litmus_sys_release(start) 202#define trace_litmus_sys_release(start)
203#define trace_litmus_pgm_param(t)
204#define trace_litmus_pgm_release(t)
182 205
183#endif 206#endif
184 207
@@ -252,6 +275,20 @@ feather_callback void do_sched_trace_sys_release(unsigned long id,
252 trace_litmus_sys_release(when); \ 275 trace_litmus_sys_release(when); \
253 } while (0) 276 } while (0)
254 277
278#define sched_trace_pgm_param(t) \
279 do { \
280 SCHED_TRACE(SCHED_TRACE_BASE_ID + 11, \
281 do_sched_trace_pgm_param, t); \
282 trace_litmus_pgm_param(t); \
283 } while (0)
284
285#define sched_trace_pgm_release(t) \
286 do { \
287 SCHED_TRACE(SCHED_TRACE_BASE_ID + 12, \
288 do_sched_trace_pgm_release, t); \
289 trace_litmus_pgm_release(t); \
290 } while (0)
291
255#define sched_trace_quantum_boundary() /* NOT IMPLEMENTED */ 292#define sched_trace_quantum_boundary() /* NOT IMPLEMENTED */
256 293
257#endif /* __KERNEL__ */ 294#endif /* __KERNEL__ */