aboutsummaryrefslogtreecommitdiffstats
path: root/litmus/litmus.c
diff options
context:
space:
mode:
Diffstat (limited to 'litmus/litmus.c')
-rw-r--r--litmus/litmus.c29
1 files changed, 19 insertions, 10 deletions
diff --git a/litmus/litmus.c b/litmus/litmus.c
index 7d20dd1be493..cb41548d3e2d 100644
--- a/litmus/litmus.c
+++ b/litmus/litmus.c
@@ -119,21 +119,25 @@ asmlinkage long sys_set_rt_task_param(pid_t pid, struct rt_task __user * param)
119 goto out_unlock; 119 goto out_unlock;
120 } 120 }
121 121
122 /* set relative deadline to be implicit if left unspecified */
123 if (tp.relative_deadline == 0)
124 tp.relative_deadline = tp.period;
125
122 if (tp.exec_cost <= 0) 126 if (tp.exec_cost <= 0)
123 goto out_unlock; 127 goto out_unlock;
124 if (tp.period <= 0) 128 if (tp.period <= 0)
125 goto out_unlock; 129 goto out_unlock;
126 if (!cpu_online(tp.cpu)) 130 if (!cpu_online(tp.cpu))
127 goto out_unlock; 131 goto out_unlock;
128 if (tp.period < tp.exec_cost) 132 if (min(tp.relative_deadline, tp.period) < tp.exec_cost) /*density check*/
129 { 133 {
130 printk(KERN_INFO "litmus: real-time task %d rejected " 134 printk(KERN_INFO "litmus: real-time task %d rejected "
131 "because wcet > period\n", pid); 135 "because task density > 1.0\n", pid);
132 goto out_unlock; 136 goto out_unlock;
133 } 137 }
134 if ( tp.cls != RT_CLASS_HARD && 138 if (tp.cls != RT_CLASS_HARD &&
135 tp.cls != RT_CLASS_SOFT && 139 tp.cls != RT_CLASS_SOFT &&
136 tp.cls != RT_CLASS_BEST_EFFORT) 140 tp.cls != RT_CLASS_BEST_EFFORT)
137 { 141 {
138 printk(KERN_INFO "litmus: real-time task %d rejected " 142 printk(KERN_INFO "litmus: real-time task %d rejected "
139 "because its class is invalid\n", pid); 143 "because its class is invalid\n", pid);
@@ -414,11 +418,14 @@ long litmus_admit_task(struct task_struct* tsk)
414 418
415 BUG_ON(is_realtime(tsk)); 419 BUG_ON(is_realtime(tsk));
416 420
417 if (get_rt_period(tsk) == 0 || 421 if (get_rt_relative_deadline(tsk) == 0 ||
418 get_exec_cost(tsk) > get_rt_period(tsk)) { 422 get_exec_cost(tsk) >
419 TRACE_TASK(tsk, "litmus admit: invalid task parameters " 423 min(get_rt_relative_deadline(tsk), get_rt_period(tsk)) ) {
420 "(%lu, %lu)\n", 424 TRACE_TASK(tsk,
421 get_exec_cost(tsk), get_rt_period(tsk)); 425 "litmus admit: invalid task parameters "
426 "(e = %lu, p = %lu, d = %lu)\n",
427 get_exec_cost(tsk), get_rt_period(tsk),
428 get_rt_relative_deadline(tsk));
422 retval = -EINVAL; 429 retval = -EINVAL;
423 goto out; 430 goto out;
424 } 431 }
@@ -469,6 +476,8 @@ void litmus_exit_task(struct task_struct* tsk)
469{ 476{
470 if (is_realtime(tsk)) { 477 if (is_realtime(tsk)) {
471 sched_trace_task_completion(tsk, 1); 478 sched_trace_task_completion(tsk, 1);
479 sched_trace_task_exit(tsk);
480 sched_trace_task_tardy(tsk);
472 481
473 litmus->task_exit(tsk); 482 litmus->task_exit(tsk);
474 483