diff options
author | Jonathan Herman <hermanjl@cs.unc.edu> | 2012-05-06 20:50:08 -0400 |
---|---|---|
committer | Jonathan Herman <hermanjl@cs.unc.edu> | 2012-05-06 20:50:08 -0400 |
commit | 41bba723584060d4045eaa133d6cde5f83c10f3a (patch) | |
tree | 36f5d528879c2cc758f57eaf941862eea7ffff30 | |
parent | 44b10b376140b33e03ad54c927564f5f720b61ca (diff) |
Finer-grained fifo locking
-rw-r--r-- | include/litmus/color.h | 3 | ||||
-rw-r--r-- | litmus/sched_color.c | 15 |
2 files changed, 10 insertions, 8 deletions
diff --git a/include/litmus/color.h b/include/litmus/color.h index 03524692511a..970585927145 100644 --- a/include/litmus/color.h +++ b/include/litmus/color.h | |||
@@ -1,9 +1,6 @@ | |||
1 | #ifndef LITMUS_COLOR_H | 1 | #ifndef LITMUS_COLOR_H |
2 | #define LITMUS_COLOR_H | 2 | #define LITMUS_COLOR_H |
3 | 3 | ||
4 | #define NUM_COLORS 64 | ||
5 | #define NUM_WAYS 12 | ||
6 | |||
7 | #ifdef __KERNEL__ | 4 | #ifdef __KERNEL__ |
8 | 5 | ||
9 | #define ONE_COLOR_LEN 11 | 6 | #define ONE_COLOR_LEN 11 |
diff --git a/litmus/sched_color.c b/litmus/sched_color.c index f6115e552cf8..29516e948749 100644 --- a/litmus/sched_color.c +++ b/litmus/sched_color.c | |||
@@ -60,6 +60,7 @@ static raw_spinlock_t dgl_lock; | |||
60 | #define has_resources(t, c) (tsk_rt(t)->req == group_lock.acquired[c]) | 60 | #define has_resources(t, c) (tsk_rt(t)->req == group_lock.acquired[c]) |
61 | #define task_dom(entry, task) (is_be(task) ? &fifo_domain : &entry->rm_domain) | 61 | #define task_dom(entry, task) (is_be(task) ? &fifo_domain : &entry->rm_domain) |
62 | #define task_lock(entry, task) (is_be(task) ? &fifo_lock : entry_lock(entry)) | 62 | #define task_lock(entry, task) (is_be(task) ? &fifo_lock : entry_lock(entry)) |
63 | #define is_fifo_server(s) (s->sid > num_online_cpus()) | ||
63 | 64 | ||
64 | /* | 65 | /* |
65 | * Requeue onto domain's release or ready queue based on task state. | 66 | * Requeue onto domain's release or ready queue based on task state. |
@@ -188,9 +189,7 @@ static void link(struct rt_server *server, struct task_struct *task) | |||
188 | if (is_server(task)) { | 189 | if (is_server(task)) { |
189 | tserv = task_fserver(task); | 190 | tserv = task_fserver(task); |
190 | tserv->running = 1; | 191 | tserv->running = 1; |
191 | raw_spin_lock(&fifo_lock); | ||
192 | schedule_server(tserv); | 192 | schedule_server(tserv); |
193 | raw_spin_unlock(&fifo_lock); | ||
194 | } | 193 | } |
195 | 194 | ||
196 | server->linked = task; | 195 | server->linked = task; |
@@ -256,6 +255,7 @@ static struct task_struct* schedule_server(struct rt_server *server) | |||
256 | { | 255 | { |
257 | struct task_struct *next; | 256 | struct task_struct *next; |
258 | struct rt_server *lserver; | 257 | struct rt_server *lserver; |
258 | int is_fifo = is_fifo_server(server); | ||
259 | 259 | ||
260 | TRACE("Scheduling server %d\n", server->sid); | 260 | TRACE("Scheduling server %d\n", server->sid); |
261 | 261 | ||
@@ -268,16 +268,20 @@ static struct task_struct* schedule_server(struct rt_server *server) | |||
268 | } | 268 | } |
269 | 269 | ||
270 | next = server->linked; | 270 | next = server->linked; |
271 | if (is_fifo) | ||
272 | raw_spin_lock(&fifo_lock); | ||
271 | if ((!next || !is_np(next)) && | 273 | if ((!next || !is_np(next)) && |
272 | server->need_preempt(server->domain, next)) { | 274 | server->need_preempt(server->domain, next)) { |
273 | if (next) { | 275 | if (next) { |
274 | TRACE_TASK(next, "Preempted\n"); | 276 | TRACE_TASK(next, "Preempted\n"); |
275 | unlink(server); | 277 | unlink(server); |
276 | server->requeue(server, next); | 278 | requeue(server->domain, next); |
277 | } | 279 | } |
278 | next = __take_ready(server->domain); | 280 | next = __take_ready(server->domain); |
279 | link(server, next); | 281 | link(server, next); |
280 | } | 282 | } |
283 | if (is_fifo) | ||
284 | raw_spin_unlock(&fifo_lock); | ||
281 | 285 | ||
282 | return next; | 286 | return next; |
283 | } | 287 | } |
@@ -346,9 +350,7 @@ static void fifo_update(struct rt_server *server) | |||
346 | } | 350 | } |
347 | 351 | ||
348 | /* Calculate next task */ | 352 | /* Calculate next task */ |
349 | raw_spin_lock(&fifo_lock); | ||
350 | schedule_server(&fserver->server); | 353 | schedule_server(&fserver->server); |
351 | raw_spin_unlock(&fifo_lock); | ||
352 | 354 | ||
353 | /* Reserve needed resources */ | 355 | /* Reserve needed resources */ |
354 | raw_spin_lock(&dgl_lock); | 356 | raw_spin_lock(&dgl_lock); |
@@ -449,7 +451,9 @@ static struct task_struct* color_schedule(struct task_struct *prev) | |||
449 | 451 | ||
450 | if (entry->scheduled && cpu_empty(entry, plink) && is_running(prev)) { | 452 | if (entry->scheduled && cpu_empty(entry, plink) && is_running(prev)) { |
451 | TRACE_TASK(prev, "Snuck in on new!\n"); | 453 | TRACE_TASK(prev, "Snuck in on new!\n"); |
454 | raw_spin_lock(&fifo_lock); | ||
452 | requeue(task_dom(entry, prev), prev); | 455 | requeue(task_dom(entry, prev), prev); |
456 | raw_spin_unlock(&fifo_lock); | ||
453 | } | 457 | } |
454 | 458 | ||
455 | /* Pick next top-level task */ | 459 | /* Pick next top-level task */ |
@@ -693,6 +697,7 @@ static long color_activate_plugin(void) | |||
693 | if (!is_queued(server_task)) | 697 | if (!is_queued(server_task)) |
694 | requeue(&entry->rm_domain, server_task); | 698 | requeue(&entry->rm_domain, server_task); |
695 | 699 | ||
700 | |||
696 | TRACE_TASK(server_task, "Created server with wcet: %llu, " | 701 | TRACE_TASK(server_task, "Created server with wcet: %llu, " |
697 | "period: %llu\n", tp.exec_cost, tp.period); | 702 | "period: %llu\n", tp.exec_cost, tp.period); |
698 | 703 | ||