diff options
author | Jonathan Herman <hermanjl@cs.unc.edu> | 2012-10-15 00:37:24 -0400 |
---|---|---|
committer | Jonathan Herman <hermanjl@cs.unc.edu> | 2012-10-15 00:37:24 -0400 |
commit | 67be6e7922465a9cc94a8c6f0353cb7051a6f97d (patch) | |
tree | f9b180570ccdeda2b70acd9d8723585b9676fca7 /include/litmus | |
parent | a33f25feae0c9c372011559a2b2e0708b7d22c66 (diff) |
Switched to common server model for tasks and crit entries.
Diffstat (limited to 'include/litmus')
-rw-r--r-- | include/litmus/rt_param.h | 16 | ||||
-rw-r--r-- | include/litmus/sched_mc.h | 28 | ||||
-rw-r--r-- | include/litmus/server.h | 24 |
3 files changed, 37 insertions, 31 deletions
diff --git a/include/litmus/rt_param.h b/include/litmus/rt_param.h index e9e26faddcea..dad0abb1a598 100644 --- a/include/litmus/rt_param.h +++ b/include/litmus/rt_param.h | |||
@@ -5,6 +5,8 @@ | |||
5 | #ifndef _LINUX_RT_PARAM_H_ | 5 | #ifndef _LINUX_RT_PARAM_H_ |
6 | #define _LINUX_RT_PARAM_H_ | 6 | #define _LINUX_RT_PARAM_H_ |
7 | 7 | ||
8 | #include <litmus/server.h> | ||
9 | |||
8 | /* Litmus time type. */ | 10 | /* Litmus time type. */ |
9 | typedef unsigned long long lt_t; | 11 | typedef unsigned long long lt_t; |
10 | 12 | ||
@@ -165,6 +167,8 @@ struct rt_param { | |||
165 | 167 | ||
166 | unsigned int is_server:1; | 168 | unsigned int is_server:1; |
167 | 169 | ||
170 | unsigned int completed:1; | ||
171 | |||
168 | #ifdef CONFIG_LITMUS_LOCKING | 172 | #ifdef CONFIG_LITMUS_LOCKING |
169 | /* Is the task being priority-boosted by a locking protocol? */ | 173 | /* Is the task being priority-boosted by a locking protocol? */ |
170 | unsigned int priority_boosted:1; | 174 | unsigned int priority_boosted:1; |
@@ -180,8 +184,7 @@ struct rt_param { | |||
180 | struct rt_event *event; | 184 | struct rt_event *event; |
181 | #endif | 185 | #endif |
182 | 186 | ||
183 | struct rt_server *server; | 187 | struct server server; |
184 | |||
185 | 188 | ||
186 | /* user controlled parameters */ | 189 | /* user controlled parameters */ |
187 | struct rt_task task_params; | 190 | struct rt_task task_params; |
@@ -281,13 +284,12 @@ struct rt_param { | |||
281 | void *color_ctrl_page_orig; | 284 | void *color_ctrl_page_orig; |
282 | #endif | 285 | #endif |
283 | struct dgl_group_req *req; | 286 | struct dgl_group_req *req; |
287 | enum server_state state; | ||
284 | }; | 288 | }; |
285 | 289 | ||
286 | /* Possible RT flags */ | 290 | #define RT_F_RUNNING 1 |
287 | #define RT_F_RUNNING 0x00000000 | 291 | #define RT_F_SLEEP 2 |
288 | #define RT_F_SLEEP 0x00000001 | 292 | #define RT_F_EXIT_SEM 4 |
289 | #define RT_F_BLOCKED 0x00000002 | ||
290 | #define RT_F_EXIT_SEM 0x00000008 | ||
291 | 293 | ||
292 | #endif | 294 | #endif |
293 | 295 | ||
diff --git a/include/litmus/sched_mc.h b/include/litmus/sched_mc.h index 327f476aad74..12afd5525fca 100644 --- a/include/litmus/sched_mc.h +++ b/include/litmus/sched_mc.h | |||
@@ -28,15 +28,13 @@ struct mc_data { | |||
28 | #define tsk_mc_data(t) (tsk_rt(t)->mc_data) | 28 | #define tsk_mc_data(t) (tsk_rt(t)->mc_data) |
29 | #define tsk_mc_crit(t) \ | 29 | #define tsk_mc_crit(t) \ |
30 | (tsk_mc_data(t) ? tsk_mc_data(t)->mc_task.crit : CRIT_LEVEL_C) | 30 | (tsk_mc_data(t) ? tsk_mc_data(t)->mc_task.crit : CRIT_LEVEL_C) |
31 | #define is_cblocked(t) (get_rt_flags(t) & RT_F_BLOCKED) | ||
32 | #define is_ghost(t) \ | 31 | #define is_ghost(t) \ |
33 | (get_rt_job(t) < get_user_job(t) && (get_rt_flags(t) & RT_F_SLEEP)) | 32 | (get_rt_job(t) < get_user_job(t) && (tsk_rt(t)->completed)) |
34 | #define ce_sid(ce) \ | 33 | #define ce_sid(ce) \ |
35 | (-((ce)->level * num_online_cpus() + crit_cpu(ce)->cpu + 1)) | 34 | (-((ce)->level * num_online_cpus() + crit_cpu(ce)->cpu + 1)) |
36 | 35 | ||
37 | #define TS "(%s/%d:%d:%d:%s)" | 36 | #define TS "(%s/%d:%d:%d:%s)" |
38 | #define TA(t) (t) ? tsk_mc_data(t) ? is_ghost(t) ? "ghost" : is_cblocked(t) ? "blocked" : t->comm \ | 37 | #define TA(t) (t) ? is_ghost(t) ? "ghost" : t->comm : "NULL", \ |
39 | : t->comm : "NULL", \ | ||
40 | (t) ? t->pid : 1, \ | 38 | (t) ? t->pid : 1, \ |
41 | (t) ? get_rt_job(t) : 1, \ | 39 | (t) ? get_rt_job(t) : 1, \ |
42 | (t) ? get_user_job(t) : 1, \ | 40 | (t) ? get_user_job(t) : 1, \ |
@@ -45,7 +43,7 @@ struct mc_data { | |||
45 | STRACE(TS " " fmt, TA(t), ##args) | 43 | STRACE(TS " " fmt, TA(t), ##args) |
46 | #define TRACE_CRIT_ENTRY(ce, fmt, args...) \ | 44 | #define TRACE_CRIT_ENTRY(ce, fmt, args...) \ |
47 | STRACE("%s P%d, linked=" TS " " fmt, \ | 45 | STRACE("%s P%d, linked=" TS " " fmt, \ |
48 | (ce)->domain->name, crit_cpu(ce)->cpu, TA((ce)->linked), ##args) | 46 | (ce)->domain->name, crit_cpu(ce)->cpu, TA((ce)->server.linked), ##args) |
49 | 47 | ||
50 | /* | 48 | /* |
51 | * The MC-CE scheduler uses this as domain data. | 49 | * The MC-CE scheduler uses this as domain data. |
@@ -62,23 +60,6 @@ struct ce_dom_data { | |||
62 | }; | 60 | }; |
63 | 61 | ||
64 | /** | 62 | /** |
65 | * enum crit_state - Logically add / remove CPUs from criticality levels. | ||
66 | * | ||
67 | * Global crit levels need to use a two step process to remove CPUs so | ||
68 | * that the CPUs can be removed without holding domain locks. | ||
69 | * | ||
70 | * @CS_ACTIVE The criticality entry can run a task | ||
71 | * @CS_ACTIVATE The criticality entry can run a task, but hasn't had its | ||
72 | * position updated in a global heap. Set with ONLY CPU lock. | ||
73 | * @CS_REMOVE The criticality entry is logically removed, but hasn't had its | ||
74 | * position adjusted in a global heap. This should be set when | ||
75 | * ONLY the CPU state is locked. | ||
76 | * @CS_REMOVED The criticality entry has been removed from the crit level | ||
77 | * @CS_BLOCKED The criticality entry cannot run until an event occurs | ||
78 | */ | ||
79 | enum crit_state { CS_ACTIVE, CS_ACTIVATE, CS_REMOVE, CS_REMOVED , CS_BLOCKED}; | ||
80 | |||
81 | /** | ||
82 | * struct crit_entry - State of a CPU within each criticality level system. | 63 | * struct crit_entry - State of a CPU within each criticality level system. |
83 | * @level Criticality level of this entry | 64 | * @level Criticality level of this entry |
84 | * @linked Logically running task, ghost or regular | 65 | * @linked Logically running task, ghost or regular |
@@ -89,10 +70,9 @@ enum crit_state { CS_ACTIVE, CS_ACTIVATE, CS_REMOVE, CS_REMOVED , CS_BLOCKED}; | |||
89 | * @node Used to sort crit_entries by preemptability in global domains | 70 | * @node Used to sort crit_entries by preemptability in global domains |
90 | */ | 71 | */ |
91 | struct crit_entry { | 72 | struct crit_entry { |
73 | struct server server; | ||
92 | enum crit_level level; | 74 | enum crit_level level; |
93 | struct task_struct* linked; | ||
94 | struct domain* domain; | 75 | struct domain* domain; |
95 | enum crit_state state; | ||
96 | #ifdef CONFIG_MERGE_TIMERS | 76 | #ifdef CONFIG_MERGE_TIMERS |
97 | struct rt_event event; | 77 | struct rt_event event; |
98 | #else | 78 | #else |
diff --git a/include/litmus/server.h b/include/litmus/server.h new file mode 100644 index 000000000000..c950325954ff --- /dev/null +++ b/include/litmus/server.h | |||
@@ -0,0 +1,24 @@ | |||
1 | #ifndef __SERVER_H | ||
2 | #define __SERVER_H | ||
3 | |||
4 | enum server_state { SS_ACTIVE, SS_REMOVED , SS_BLOCKED}; | ||
5 | |||
6 | /* | ||
7 | * An accounting class only. | ||
8 | */ | ||
9 | struct server { | ||
10 | int sid; | ||
11 | unsigned int *job; | ||
12 | int cpu; | ||
13 | |||
14 | unsigned int in_transit:1; | ||
15 | |||
16 | enum server_state state; | ||
17 | struct task_struct *linked; | ||
18 | }; | ||
19 | |||
20 | void server_init(struct server *server, int sid, int *job); | ||
21 | void server_state_change(struct server *server, enum server_state state, | ||
22 | unsigned int transit); | ||
23 | |||
24 | #endif | ||