aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBjoern B. Brandenburg <bbb@cs.unc.edu>2007-10-27 15:47:22 -0400
committerBjoern B. Brandenburg <bbb@cs.unc.edu>2007-10-27 15:47:22 -0400
commita4d08351aacc56e79b03c85fc9bbcb03567309fa (patch)
tree8f15cd5c23a86c72c7376c3da8248e4850629b7f
parent2e4b97e2e722699fe2ce2699714887eac0ff84cc (diff)
cleanup: tidy up code before release2007.2
This gets rid of quite a few FIXMEs and TODOs, as well as some cruft.
-rw-r--r--include/linux/litmus.h23
-rw-r--r--include/linux/pfair_math.h3
-rw-r--r--include/linux/sched_plugin.h8
-rw-r--r--kernel/litmus.c15
-rw-r--r--kernel/sched.c11
-rw-r--r--kernel/sched_adaptive.c4
-rw-r--r--kernel/sched_edf_hsb.c81
-rw-r--r--kernel/sched_global_edf.c12
-rw-r--r--kernel/sched_part_edf.c11
-rw-r--r--kernel/sched_pfair.c2
-rw-r--r--kernel/sched_plugin.c53
-rw-r--r--kernel/sched_psn_edf.c29
12 files changed, 22 insertions, 230 deletions
diff --git a/include/linux/litmus.h b/include/linux/litmus.h
index dc39ecbf7e..259594e922 100644
--- a/include/linux/litmus.h
+++ b/include/linux/litmus.h
@@ -35,7 +35,6 @@ typedef enum {
35typedef enum { 35typedef enum {
36 LITMUS_RESERVED_RANGE = 1024, 36 LITMUS_RESERVED_RANGE = 1024,
37 37
38 ENABLE_WEIGHT_CHANGE_SIGNAL
39} sched_setup_cmd_t; 38} sched_setup_cmd_t;
40 39
41/* Runtime modes */ 40/* Runtime modes */
@@ -49,30 +48,14 @@ enum rt_mode_t {
49#define PLUGIN_PFAIR "pfair" 48#define PLUGIN_PFAIR "pfair"
50#define PLUGIN_PART_EDF "part_edf" 49#define PLUGIN_PART_EDF "part_edf"
51#define PLUGIN_GLOBAL_EDF "global_edf" 50#define PLUGIN_GLOBAL_EDF "global_edf"
52#define PLUGIN_PFAIR_STAGGER "stagger"
53#define PLUGIN_PFAIR_DESYNC "desync"
54#define PLUGIN_GLOBAL_EDF_NP "global_edf_np" 51#define PLUGIN_GLOBAL_EDF_NP "global_edf_np"
55#define PLUGIN_EDF_HSB "edf_hsb" 52#define PLUGIN_EDF_HSB "edf_hsb"
56#define PLUGIN_GSN_EDF "gsn_edf" 53#define PLUGIN_GSN_EDF "gsn_edf"
57#define PLUGIN_PSN_EDF "psn_edf" 54#define PLUGIN_PSN_EDF "psn_edf"
58#define PLUGIN_ADAPTIVE "adaptive" 55#define PLUGIN_ADAPTIVE "adaptive"
59 56
60/* Additional clone flags
61 Indicates that the thread is to be used in
62 realtime mode, therefore it should not be
63 woken up in a linux manner,
64 we just set its state to TASK_STOPPED
65 It must be prepared and added to the ready queue explicitly
66*/
67
68/* Type definition for our quantums */
69typedef unsigned long long quantum_t;
70
71extern spolicy sched_policy; 57extern spolicy sched_policy;
72 58
73extern unsigned long slot_size;
74extern unsigned long stagger_offset;
75
76/* RT mode start time */ 59/* RT mode start time */
77extern volatile unsigned long rt_start_time; 60extern volatile unsigned long rt_start_time;
78 61
@@ -82,10 +65,6 @@ extern atomic_t rt_mode;
82#define get_rt_mode() (atomic_read(&rt_mode)) 65#define get_rt_mode() (atomic_read(&rt_mode))
83#define set_rt_mode(a) atomic_set(&rt_mode,(a)) 66#define set_rt_mode(a) atomic_set(&rt_mode,(a))
84 67
85/* CLEANUP: Should be queue_lock, does it really belong here? */
86extern spinlock_t litmus_task_set_lock;
87
88
89#define TRACE(fmt, args...) \ 68#define TRACE(fmt, args...) \
90 sched_trace_log_message("%d: " fmt, raw_smp_processor_id(), ## args) 69 sched_trace_log_message("%d: " fmt, raw_smp_processor_id(), ## args)
91 70
@@ -99,7 +78,7 @@ extern spinlock_t litmus_task_set_lock;
99 do { if (cond) TRACE("BUG_ON(%s) at %s:%d " \ 78 do { if (cond) TRACE("BUG_ON(%s) at %s:%d " \
100 "called from %p current=%s/%d state=%d " \ 79 "called from %p current=%s/%d state=%d " \
101 "flags=%x mode=%d partition=%d cpu=%d rtflags=%d"\ 80 "flags=%x mode=%d partition=%d cpu=%d rtflags=%d"\
102 " job=%u knp=%d timeslice=%u\n", \ 81 " job=%u knp=%d timeslice=%u\n", \
103 #cond, __FILE__, __LINE__, __builtin_return_address(0), current->comm, \ 82 #cond, __FILE__, __LINE__, __builtin_return_address(0), current->comm, \
104 current->pid, current->state, current->flags, get_rt_mode(), \ 83 current->pid, current->state, current->flags, get_rt_mode(), \
105 get_partition(current), smp_processor_id(), get_rt_flags(current), \ 84 get_partition(current), smp_processor_id(), get_rt_flags(current), \
diff --git a/include/linux/pfair_math.h b/include/linux/pfair_math.h
index dab1778f0b..b2a14e4c54 100644
--- a/include/linux/pfair_math.h
+++ b/include/linux/pfair_math.h
@@ -7,6 +7,9 @@
7#include <linux/litmus.h> 7#include <linux/litmus.h>
8#include <linux/sched.h> 8#include <linux/sched.h>
9 9
10/* Type definition for our quantums */
11typedef unsigned long long quantum_t;
12
10/* 13/*
11* This file defines mathematical functions "ceiling", "floor", 14* This file defines mathematical functions "ceiling", "floor",
12* and PFAIR specific functions for computing the release and 15* and PFAIR specific functions for computing the release and
diff --git a/include/linux/sched_plugin.h b/include/linux/sched_plugin.h
index fa0716f0eb..1ea8178b25 100644
--- a/include/linux/sched_plugin.h
+++ b/include/linux/sched_plugin.h
@@ -33,13 +33,6 @@ struct pi_semaphore {
33 */ 33 */
34typedef void runqueue_t; 34typedef void runqueue_t;
35 35
36/********************* real-time callbacks ********************/
37
38/* Special plugin shutdown hook that clear plugin data structures
39 Currently is not supported
40*/
41typedef void (*plugin_shutdown_hook_t) (void);
42
43 36
44/********************* scheduler invocation ******************/ 37/********************* scheduler invocation ******************/
45 38
@@ -105,7 +98,6 @@ struct sched_plugin {
105 int ready_to_use; 98 int ready_to_use;
106 99
107 /* management interface */ 100 /* management interface */
108 plugin_shutdown_hook_t shutdown_hook; /*currently unsupported */
109 mode_change_t mode_change; 101 mode_change_t mode_change;
110 102
111 /* scheduler invocation */ 103 /* scheduler invocation */
diff --git a/kernel/litmus.c b/kernel/litmus.c
index ee1e09a627..8f238ba979 100644
--- a/kernel/litmus.c
+++ b/kernel/litmus.c
@@ -19,25 +19,22 @@
19spolicy sched_policy = SCHED_DEFAULT; 19spolicy sched_policy = SCHED_DEFAULT;
20int sched_options = 0; 20int sched_options = 0;
21 21
22/* avoid races with multiple task wake-ups */
23DEFINE_SPINLOCK(litmus_task_set_lock);
24 22
25/* This is a flag for switching the system into RT mode when it is booted up 23/* This is a flag for switching the system into RT mode when it is booted up
26 * In RT-mode non-realtime tasks are shut down and scheduled as spare 24 * In RT-mode non-realtime tasks are scheduled as background tasks.
27 * time available
28 */ 25 */
29 26
30/* The system is booting in non-realtime mode */ 27/* The system is booting in non-realtime mode */
31atomic_t rt_mode = ATOMIC_INIT(MODE_NON_RT); 28atomic_t rt_mode = ATOMIC_INIT(MODE_NON_RT);
32/* Here we specify a mode change to be made */ 29/* Here we specify a mode change to be made */
33atomic_t new_mode = ATOMIC_INIT(MODE_NON_RT); 30atomic_t new_mode = ATOMIC_INIT(MODE_NON_RT);
34/* Number of RT tasks that exist in the system */ 31/* Number of RT tasks that exist in the system */
35atomic_t n_rt_tasks = ATOMIC_INIT(0); 32atomic_t n_rt_tasks = ATOMIC_INIT(0);
36 33
37/* Only one process can perform mode change */ 34/* Only one CPU may perform a mode change. */
38static queuelock_t mode_change_lock; 35static queuelock_t mode_change_lock;
39 36
40/* A time instant when we switched to RT mode */ 37/* The time instant when we switched to RT mode */
41volatile jiffie_t rt_start_time = 0; 38volatile jiffie_t rt_start_time = 0;
42 39
43/* To send signals from the scheduler 40/* To send signals from the scheduler
diff --git a/kernel/sched.c b/kernel/sched.c
index d7fd42a431..5ad4276e4b 100644
--- a/kernel/sched.c
+++ b/kernel/sched.c
@@ -61,9 +61,11 @@
61#include <linux/sched_plugin.h> 61#include <linux/sched_plugin.h>
62#include <linux/sched_trace.h> 62#include <linux/sched_trace.h>
63#include <linux/rt_param.h> 63#include <linux/rt_param.h>
64
65#include <linux/trace.h> 64#include <linux/trace.h>
66 65
66/* LITMUS: avoid races with multiple task wake-ups */
67DEFINE_SPINLOCK(litmus_task_set_lock);
68
67/* 69/*
68 * Convert user-nice values [ -20 ... 0 ... 19 ] 70 * Convert user-nice values [ -20 ... 0 ... 19 ]
69 * to static priority [ MAX_RT_PRIO..MAX_PRIO-1 ], 71 * to static priority [ MAX_RT_PRIO..MAX_PRIO-1 ],
@@ -1693,7 +1695,6 @@ void fastcall wake_up_new_task(struct task_struct *p, unsigned long clone_flags)
1693 1695
1694 if (clone_flags & CLONE_REALTIME) { 1696 if (clone_flags & CLONE_REALTIME) {
1695 /* just mark the task as stopped */ 1697 /* just mark the task as stopped */
1696 /* CLEANUP: Do we have to remove the task from the rq? */
1697 p->state = TASK_STOPPED; 1698 p->state = TASK_STOPPED;
1698 return; 1699 return;
1699 } 1700 }
@@ -5541,7 +5542,7 @@ static struct notifier_block __cpuinitdata migration_notifier = {
5541 .priority = 10 5542 .priority = 10
5542}; 5543};
5543 5544
5544int __init linux_migration_init(void) 5545int __init migration_init(void)
5545{ 5546{
5546 void *cpu = (void *)(long)smp_processor_id(); 5547 void *cpu = (void *)(long)smp_processor_id();
5547 int err; 5548 int err;
@@ -7003,7 +7004,7 @@ static int update_sched_domains(struct notifier_block *nfb,
7003 return NOTIFY_OK; 7004 return NOTIFY_OK;
7004} 7005}
7005 7006
7006void __init linux_sched_init_smp(void) 7007void __init sched_init_smp(void)
7007{ 7008{
7008 cpumask_t non_isolated_cpus; 7009 cpumask_t non_isolated_cpus;
7009 7010
@@ -7036,7 +7037,7 @@ int in_sched_functions(unsigned long addr)
7036 && addr < (unsigned long)__sched_text_end); 7037 && addr < (unsigned long)__sched_text_end);
7037} 7038}
7038 7039
7039void __init linux_sched_init(void) 7040void __init sched_init(void)
7040{ 7041{
7041 int i, j, k; 7042 int i, j, k;
7042 7043
diff --git a/kernel/sched_adaptive.c b/kernel/sched_adaptive.c
index 97d06b1ad4..319ebbc11c 100644
--- a/kernel/sched_adaptive.c
+++ b/kernel/sched_adaptive.c
@@ -838,8 +838,6 @@ static noinline void preempt(cpu_entry_t *entry)
838 } else 838 } else
839 /* in case that it is a remote CPU we have to defer the 839 /* in case that it is a remote CPU we have to defer the
840 * the decision to the remote CPU 840 * the decision to the remote CPU
841 * FIXME: We could save a few IPI's here if we leave the flag
842 * set when we are waiting for a np_exit().
843 */ 841 */
844 if (!test_will_schedule(entry->cpu)) 842 if (!test_will_schedule(entry->cpu))
845 smp_send_reschedule(entry->cpu); 843 smp_send_reschedule(entry->cpu);
@@ -1432,7 +1430,7 @@ sched_plugin_t *__init init_adaptive_plugin(void)
1432 fc_b = _frac( 303, 1000); 1430 fc_b = _frac( 303, 1000);
1433 1431
1434 optimizer_period = 1000; 1432 optimizer_period = 1000;
1435 optimizer_min_invocation_sep = 50; 1433 optimizer_min_invocation_sep = 200;
1436 task_error_threshold = _frac(1, 2); 1434 task_error_threshold = _frac(1, 2);
1437 1435
1438 if (!s_plugin.ready_to_use) 1436 if (!s_plugin.ready_to_use)
diff --git a/kernel/sched_edf_hsb.c b/kernel/sched_edf_hsb.c
index c2a4c6c679..a2f670d994 100644
--- a/kernel/sched_edf_hsb.c
+++ b/kernel/sched_edf_hsb.c
@@ -1077,52 +1077,6 @@ static struct task_struct* null_heuristic(struct task_struct *prev,
1077 return NULL; 1077 return NULL;
1078} 1078}
1079 1079
1080/*static struct task_struct* history_heuristic(struct task_struct *prev, rt_domain_t* edf)
1081{
1082 struct list_head *pos;
1083 struct task_struct* tsk = NULL;
1084 struct task_struct* cur;
1085
1086 if (is_realtime(prev) && is_running(prev) &&
1087 get_rt_flags(prev) != RT_F_SLEEP)
1088 tsk = prev;
1089 list_for_each(pos, &edf->ready_queue) {
1090 cur = list_entry(pos, struct task_struct, rt_list);
1091 if (!tsk ||
1092 tsk->rt_param.stats.nontardy_jobs_ctr >
1093 cur->rt_param.stats.nontardy_jobs_ctr)
1094 tsk = cur;
1095 }
1096 if (tsk && tsk->rt_param.stats.nontardy_jobs_ctr < 5)
1097 return tsk;
1098 else
1099 return NULL;
1100}
1101*/
1102/* TODO: write slack heuristic.*/
1103/*static struct task_struct* slack_heuristic(struct task_struct *prev, rt_domain_t* edf)
1104{
1105 struct list_head *pos;
1106 struct task_struct* tsk = NULL;
1107 struct task_struct* cur;
1108
1109 if (is_realtime(prev) && is_running(prev) &&
1110 get_rt_flags(prev) != RT_F_SLEEP)
1111 tsk = prev;
1112 list_for_each(pos, &edf->ready_queue) {
1113 cur = list_entry(pos, struct task_struct, rt_list);
1114 if (!tsk ||
1115 tsk->rt_param.stats.nontardy_job_ctr >
1116 cur->rt_param.stats.nontardy_job_ctr)
1117 tsk = cur;
1118 }
1119 if (tsk && tsk->rt_param.stats.nontardy_job_ctr < 5)
1120 return tsk;
1121 else
1122 return NULL;
1123}*/
1124
1125
1126/* caller holds all locks 1080/* caller holds all locks
1127 */ 1081 */
1128 1082
@@ -1229,7 +1183,7 @@ static int schedule_srt_be_cap(struct task_struct *prev,
1229 int deactivate = 1; 1183 int deactivate = 1;
1230 be_server_t* bes; 1184 be_server_t* bes;
1231 cpu_state_t* state; 1185 cpu_state_t* state;
1232 int type; /* FIXME: Initialize? */ 1186 int type = BG;
1233 1187
1234reschedule: 1188reschedule:
1235 write_lock_irqsave(&srt.ready_lock, flags); 1189 write_lock_irqsave(&srt.ready_lock, flags);
@@ -1531,9 +1485,6 @@ static void hsb_wake_up_task(struct task_struct *task)
1531 } 1485 }
1532 else if (task->time_slice) { 1486 else if (task->time_slice) {
1533 /* came back in time before deadline 1487 /* came back in time before deadline
1534 * TODO: clip budget to fit into period, otherwise it could
1535 * cause a deadline overrun in the next period, i.e.
1536 * over allocation in the next period.
1537 */ 1488 */
1538 set_rt_flags(task, RT_F_RUNNING); 1489 set_rt_flags(task, RT_F_RUNNING);
1539 hsb_add_ready(task); 1490 hsb_add_ready(task);
@@ -1546,43 +1497,16 @@ static void hsb_wake_up_task(struct task_struct *task)
1546 1497
1547static void hsb_task_blocks(struct task_struct *t) 1498static void hsb_task_blocks(struct task_struct *t)
1548{ 1499{
1549 /* CLEANUP: The BUG_ON actually triggerd in a really weierd case if a
1550 * BEST_EFFORT gets caught in a migration right after execv
1551 * The next version of Litmus should deal with this more gracefully.
1552 */
1553
1554 /*BUG_ON(!is_realtime(t));*/
1555 /* not really anything to do since it can only block if 1500 /* not really anything to do since it can only block if
1556 * it is running, and when it is not running it is not in any 1501 * it is running, and when it is not running it is not in any
1557 * queue anyway. 1502 * queue anyway.
1558 *
1559 * TODO: Check whether the assumption is correct for SIGKILL and
1560 * SIGSTOP.
1561 */ 1503 */
1562 TRACE("task %d blocks with budget=%d\n", t->pid, t->time_slice); 1504 TRACE("task %d blocks with budget=%d\n", t->pid, t->time_slice);
1563 /*BUG_ON(t->rt_list.next != LIST_POISON1);*/
1564 /*BUG_ON(t->rt_list.prev != LIST_POISON2);*/
1565
1566 if (is_be(t)) 1505 if (is_be(t))
1567 sched_trace_job_completion(t); 1506 sched_trace_job_completion(t);
1568} 1507}
1569 1508
1570 1509
1571/* When _tear_down is called, the task should not be in any queue any more
1572 * as it must have blocked first. We don't have any internal state for the task,
1573 * it is all in the task_struct.
1574 */
1575static long hsb_tear_down(struct task_struct * t)
1576{
1577 /* CLEANUP: see hsb_task_blocks */
1578 /*BUG_ON(!is_realtime(t));
1579 TRACE("edf-hsb: tear down called for %d \n", t->pid);
1580 BUG_ON(t->array);
1581 BUG_ON(t->rt_list.next != LIST_POISON1);
1582 BUG_ON(t->rt_list.prev != LIST_POISON2);*/
1583 return 0;
1584}
1585
1586static int hsb_mode_change(int new_mode) 1510static int hsb_mode_change(int new_mode)
1587{ 1511{
1588 int cpu; 1512 int cpu;
@@ -1769,8 +1693,6 @@ static sched_plugin_t s_plugin __cacheline_aligned_in_smp = {
1769 .scheduler_tick = hsb_scheduler_tick,\ 1693 .scheduler_tick = hsb_scheduler_tick,\
1770 .prepare_task = hsb_prepare_task,\ 1694 .prepare_task = hsb_prepare_task,\
1771 .sleep_next_period = edf_sleep_next_period,\ 1695 .sleep_next_period = edf_sleep_next_period,\
1772 .tear_down = hsb_tear_down,\
1773 .shutdown_hook = 0,\
1774 .schedule = hsb_schedule,\ 1696 .schedule = hsb_schedule,\
1775 .finish_switch = hsb_finish_switch,\ 1697 .finish_switch = hsb_finish_switch,\
1776 .mode_change = hsb_mode_change,\ 1698 .mode_change = hsb_mode_change,\
@@ -1789,7 +1711,6 @@ sched_plugin_t *__init init_edf_hsb_plugin(void)
1789 capacity_queue_init(&cap_queue); 1711 capacity_queue_init(&cap_queue);
1790 edf_domain_init(&srt, srt_check_resched); 1712 edf_domain_init(&srt, srt_check_resched);
1791 edf_domain_init(&be, be_check_resched); 1713 edf_domain_init(&be, be_check_resched);
1792 /* TODO: Re-implement FIFO time slicing, was 50ms. */
1793 fifo_domain_init(&hsb_fifo, NULL); 1714 fifo_domain_init(&hsb_fifo, NULL);
1794 for (i = 0; i < NR_CPUS; i++) 1715 for (i = 0; i < NR_CPUS; i++)
1795 { 1716 {
diff --git a/kernel/sched_global_edf.c b/kernel/sched_global_edf.c
index 6e3928b7df..4b36bc5a48 100644
--- a/kernel/sched_global_edf.c
+++ b/kernel/sched_global_edf.c
@@ -64,7 +64,6 @@ static void adjust_cpu_queue(int exec_rt, jiffie_t deadline)
64 entry->executes_realtime = exec_rt; 64 entry->executes_realtime = exec_rt;
65 entry->cur_deadline = deadline; 65 entry->cur_deadline = deadline;
66 66
67 /* TODO: move instead of del+reinsert */
68 list_del(&entry->list); 67 list_del(&entry->list);
69 /* if we do not execute real-time jobs we just move 68 /* if we do not execute real-time jobs we just move
70 * to the end of the queue 69 * to the end of the queue
@@ -94,10 +93,6 @@ static void adjust_cpu_queue(int exec_rt, jiffie_t deadline)
94 * kick the next if necessary, and so on. The caller is responsible for making 93 * kick the next if necessary, and so on. The caller is responsible for making
95 * sure that it is not the last entry or that a reschedule is not necessary. 94 * sure that it is not the last entry or that a reschedule is not necessary.
96 * 95 *
97 * TODO: This function is probably way too trigger happy. It should only send
98 * IPIs if the other CPU is not going to reschedule anyway. But that is
99 * hard to detect reliably. Too many schedules will hurt performance
100 * but do not cause incorrect schedules.
101 */ 96 */
102static int gedf_check_resched(rt_domain_t *edf) 97static int gedf_check_resched(rt_domain_t *edf)
103{ 98{
@@ -336,9 +331,6 @@ static void gedf_wake_up_task(struct task_struct *task)
336 } 331 }
337 else if (task->time_slice) { 332 else if (task->time_slice) {
338 /* came back in time before deadline 333 /* came back in time before deadline
339 * TODO: clip budget to fit into period, otherwise it could
340 * cause a deadline overrun in the next period, i.e.
341 * over allocation in the next period.
342 */ 334 */
343 set_rt_flags(task, RT_F_RUNNING); 335 set_rt_flags(task, RT_F_RUNNING);
344 add_ready(&gedf, task); 336 add_ready(&gedf, task);
@@ -356,8 +348,6 @@ static void gedf_task_blocks(struct task_struct *t)
356 * it is running, and when it is not running it is not in any 348 * it is running, and when it is not running it is not in any
357 * queue anyway. 349 * queue anyway.
358 * 350 *
359 * TODO: Check whether the assumption is correct for SIGKILL and
360 * SIGSTOP.
361 */ 351 */
362 TRACE("task %d blocks with budget=%d\n", t->pid, t->time_slice); 352 TRACE("task %d blocks with budget=%d\n", t->pid, t->time_slice);
363 BUG_ON(t->rt_list.next != LIST_POISON1); 353 BUG_ON(t->rt_list.next != LIST_POISON1);
@@ -433,7 +423,6 @@ static sched_plugin_t s_plugin __cacheline_aligned_in_smp = {
433 .prepare_task = gedf_prepare_task,\ 423 .prepare_task = gedf_prepare_task,\
434 .sleep_next_period = edf_sleep_next_period,\ 424 .sleep_next_period = edf_sleep_next_period,\
435 .tear_down = gedf_tear_down,\ 425 .tear_down = gedf_tear_down,\
436 .shutdown_hook = 0,\
437 .schedule = gedf_schedule,\ 426 .schedule = gedf_schedule,\
438 .finish_switch = gedf_finish_switch,\ 427 .finish_switch = gedf_finish_switch,\
439 .mode_change = gedf_mode_change,\ 428 .mode_change = gedf_mode_change,\
@@ -538,7 +527,6 @@ static int gedf_np_check_resched(rt_domain_t *edf)
538 .prepare_task = gedf_prepare_task,\ 527 .prepare_task = gedf_prepare_task,\
539 .sleep_next_period = edf_sleep_next_period,\ 528 .sleep_next_period = edf_sleep_next_period,\
540 .tear_down = gedf_tear_down,\ 529 .tear_down = gedf_tear_down,\
541 .shutdown_hook = 0,\
542 .schedule = gedf_schedule,\ 530 .schedule = gedf_schedule,\
543 .finish_switch = gedf_finish_switch,\ 531 .finish_switch = gedf_finish_switch,\
544 .mode_change = gedf_mode_change,\ 532 .mode_change = gedf_mode_change,\
diff --git a/kernel/sched_part_edf.c b/kernel/sched_part_edf.c
index 8166c8f4c6..a792ac5d03 100644
--- a/kernel/sched_part_edf.c
+++ b/kernel/sched_part_edf.c
@@ -241,10 +241,10 @@ static void part_edf_wake_up_task(struct task_struct *task)
241 add_ready(edf, task); 241 add_ready(edf, task);
242 242
243 } else if (task->time_slice) { 243 } else if (task->time_slice) {
244 /* came back in time before deadline 244 /* Came back in time before deadline. This may cause
245 * TODO: clip budget to fit into period, otherwise it could 245 * deadline overruns, but since we don't handle suspensions
246 * cause a deadline overrun in the next period, i.e. 246 * in the analytical model, we don't care since we can't
247 * over allocation in the next period. 247 * guarantee anything at all if tasks block.
248 */ 248 */
249 set_rt_flags(task, RT_F_RUNNING); 249 set_rt_flags(task, RT_F_RUNNING);
250 add_ready(edf, task); 250 add_ready(edf, task);
@@ -262,8 +262,6 @@ static void part_edf_task_blocks(struct task_struct *t)
262 * it is running, and when it is not running it is not in any 262 * it is running, and when it is not running it is not in any
263 * queue anyway. 263 * queue anyway.
264 * 264 *
265 * TODO: Check whether the assumption is correct for SIGKILL and
266 * SIGSTOP.
267 */ 265 */
268 TRACE("task %d blocks with budget=%d\n", t->pid, t->time_slice); 266 TRACE("task %d blocks with budget=%d\n", t->pid, t->time_slice);
269 BUG_ON(in_list(&t->rt_list)); 267 BUG_ON(in_list(&t->rt_list));
@@ -313,7 +311,6 @@ static sched_plugin_t s_plugin __cacheline_aligned_in_smp = {
313 .prepare_task = part_edf_prepare_task,\ 311 .prepare_task = part_edf_prepare_task,\
314 .sleep_next_period = edf_sleep_next_period,\ 312 .sleep_next_period = edf_sleep_next_period,\
315 .tear_down = part_edf_tear_down,\ 313 .tear_down = part_edf_tear_down,\
316 .shutdown_hook = NULL,\
317 .schedule = part_edf_schedule,\ 314 .schedule = part_edf_schedule,\
318 .finish_switch = part_edf_finish_switch,\ 315 .finish_switch = part_edf_finish_switch,\
319 .mode_change = part_edf_mode_change,\ 316 .mode_change = part_edf_mode_change,\
diff --git a/kernel/sched_pfair.c b/kernel/sched_pfair.c
index 20a7526a0a..1a6a790fb7 100644
--- a/kernel/sched_pfair.c
+++ b/kernel/sched_pfair.c
@@ -480,9 +480,7 @@ static sched_plugin_t s_plugin __cacheline_aligned_in_smp = {
480 .ready_to_use = 1,\ 480 .ready_to_use = 1,\
481 .scheduler_tick = pfair_scheduler_tick,\ 481 .scheduler_tick = pfair_scheduler_tick,\
482 .prepare_task = pfair_prepare_task,\ 482 .prepare_task = pfair_prepare_task,\
483 .sleep_next_period = 0,\
484 .tear_down = pfair_tear_down,\ 483 .tear_down = pfair_tear_down,\
485 .shutdown_hook = 0,\
486 .schedule = pfair_schedule,\ 484 .schedule = pfair_schedule,\
487 .finish_switch = pfair_finish_task_switch,\ 485 .finish_switch = pfair_finish_task_switch,\
488 .mode_change = pfair_mode_change,\ 486 .mode_change = pfair_mode_change,\
diff --git a/kernel/sched_plugin.c b/kernel/sched_plugin.c
index 3c7d6c0842..1f759b7c9f 100644
--- a/kernel/sched_plugin.c
+++ b/kernel/sched_plugin.c
@@ -9,14 +9,6 @@
9#include <linux/sched_plugin.h> 9#include <linux/sched_plugin.h>
10 10
11 11
12/* These are the original Linux initialization functions.
13 * We replace them here with our initialization code and call them
14 * after setting up LITMUS.
15 */
16void linux_sched_init(void);
17void linux_sched_init_smp(void);
18int linux_migration_init(void);
19
20/************************************************************* 12/*************************************************************
21 * Dummy plugin functions * 13 * Dummy plugin functions *
22 *************************************************************/ 14 *************************************************************/
@@ -99,7 +91,6 @@ sched_plugin_t linux_sched_plugin = {
99 .wake_up_task = litmus_dummy_wake_up_task, 91 .wake_up_task = litmus_dummy_wake_up_task,
100 .task_blocks = litmus_dummy_task_blocks, 92 .task_blocks = litmus_dummy_task_blocks,
101 .sleep_next_period = litmus_dummy_sleep_next_period, 93 .sleep_next_period = litmus_dummy_sleep_next_period,
102 .shutdown_hook = 0,
103 .schedule = litmus_dummy_schedule, 94 .schedule = litmus_dummy_schedule,
104 .finish_switch = litmus_dummy_finish_switch, 95 .finish_switch = litmus_dummy_finish_switch,
105 .scheduler_setup = litmus_dummy_scheduler_setup, 96 .scheduler_setup = litmus_dummy_scheduler_setup,
@@ -115,47 +106,3 @@ sched_plugin_t linux_sched_plugin = {
115 */ 106 */
116sched_plugin_t *curr_sched_plugin = &linux_sched_plugin; 107sched_plugin_t *curr_sched_plugin = &linux_sched_plugin;
117 108
118
119/* At sched-init */
120void __init sched_init(void)
121{
122 printk("Entering custom sched init, plugin %s\n",
123 curr_sched_plugin->plugin_name);
124 /* Init tracing facility before plugin functions are called */
125
126 /* CLEANUP: reenable this if needed
127 pstats = INIT_PSTATS;
128
129 */
130
131 /* Call linux sched init tasks */
132 linux_sched_init();
133 printk("Sched init complete\n");
134}
135
136void __init sched_init_smp(void)
137{
138 printk("Entering custom SMP init, plugin %s\n",
139 curr_sched_plugin->plugin_name);
140 /* Call linux smp initializer */
141 linux_sched_init_smp();
142 /* Enable tracing facilities here */
143 /*
144 CLEANUP: Reenable if needed.
145 if (smp_processor_id() == 0) {
146 if (init_trace()) {
147 printk("Tracing disabled\n");
148 } else {
149 printk("Default tracing enabled\n");
150 }
151 } */
152 printk("Sched init SMP complete\n");
153}
154
155int __init migration_init(void)
156{
157 printk("Entering migration init\n");
158
159 /* Call linux migration init as it was before */
160 return linux_migration_init();
161}
diff --git a/kernel/sched_psn_edf.c b/kernel/sched_psn_edf.c
index 32f9b23829..9e4f4abd52 100644
--- a/kernel/sched_psn_edf.c
+++ b/kernel/sched_psn_edf.c
@@ -301,39 +301,11 @@ static void psnedf_wake_up_task(struct task_struct *task)
301 TRACE("psnedf: %d unsuspends with budget=%d\n", 301 TRACE("psnedf: %d unsuspends with budget=%d\n",
302 task->pid, task->time_slice); 302 task->pid, task->time_slice);
303 303
304
305 /* After fixing the litmus_controlled bug, 304 /* After fixing the litmus_controlled bug,
306 * this should hold again. 305 * this should hold again.
307 */ 306 */
308 BUG_ON(in_list(&task->rt_list)); 307 BUG_ON(in_list(&task->rt_list));
309 308
310 /* FIXME:
311 * There exists a race between this function, suspensions due to IO,
312 * and switching in and out of real-time mode. For some reason, the
313 * BUG_ON triggered after a task system warm-up phase.
314 *
315 * BUG_ON(in_list(&task->rt_list));
316 *
317 * Replaced by an if to gather more information.
318 */
319/*
320 if (unlikely(in_list(&task->rt_list))) {
321 TRACE(KERN_CRIT "wake_up_task: Why is %s/%d in rt list? "
322 "state=%ld next=%p prev=%p flags=0x%8lx mode=%d "
323 "partition=%d cpu=%d deadline=%ld now=%ld release=%ld"
324 "rtflags=%d timeslice=%d job=%u knp=%d",
325 task->comm, task->pid,
326 task->state, task->rt_list.next, task->rt_list.prev,
327 task->flags, get_rt_mode(),
328 get_partition(task), smp_processor_id(),
329 get_deadline(task), jiffies, get_release(task),
330 get_rt_flags(task), task->time_slice,
331 task->rt_param.times.job_no, task->rt_param.kernel_np);
332 task->state = TASK_RUNNING;
333 return;
334 }
335*/
336
337 task->state = TASK_RUNNING; 309 task->state = TASK_RUNNING;
338 310
339 /* We need to take suspensions because of semaphores into 311 /* We need to take suspensions because of semaphores into
@@ -520,7 +492,6 @@ static sched_plugin_t s_plugin __cacheline_aligned_in_smp = {
520 .prepare_task = psnedf_prepare_task,\ 492 .prepare_task = psnedf_prepare_task,\
521 .sleep_next_period = edf_sleep_next_period,\ 493 .sleep_next_period = edf_sleep_next_period,\
522 .tear_down = psnedf_tear_down,\ 494 .tear_down = psnedf_tear_down,\
523 .shutdown_hook = NULL,\
524 .schedule = psnedf_schedule,\ 495 .schedule = psnedf_schedule,\
525 .mode_change = psnedf_mode_change,\ 496 .mode_change = psnedf_mode_change,\
526 .wake_up_task = psnedf_wake_up_task,\ 497 .wake_up_task = psnedf_wake_up_task,\