diff options
Diffstat (limited to 'litmus/litmus.c')
-rw-r--r-- | litmus/litmus.c | 29 |
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 | ||