aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJonathan Herman <hermanjl@cs.unc.edu>2012-05-06 20:50:08 -0400
committerJonathan Herman <hermanjl@cs.unc.edu>2012-05-06 20:50:08 -0400
commit41bba723584060d4045eaa133d6cde5f83c10f3a (patch)
tree36f5d528879c2cc758f57eaf941862eea7ffff30
parent44b10b376140b33e03ad54c927564f5f720b61ca (diff)
Finer-grained fifo locking
-rw-r--r--include/litmus/color.h3
-rw-r--r--litmus/sched_color.c15
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