aboutsummaryrefslogtreecommitdiffstats
path: root/litmus
diff options
context:
space:
mode:
authorBjoern Brandenburg <bbb@mpi-sws.org>2015-10-06 15:45:29 -0400
committerBjoern Brandenburg <bbb@mpi-sws.org>2016-03-08 10:12:45 -0500
commitbd415c3ca4f80d9920a624513a164c312a6322c2 (patch)
tree7bdbc8b2cc3a5b169d1b2ff45c524ed66d4bdb0f /litmus
parent5864d409a8e756d191b048b66b63ddb98a575452 (diff)
LITMUS^RT: split task admission into two functions
Diffstat (limited to 'litmus')
-rw-r--r--litmus/litmus.c54
1 files changed, 31 insertions, 23 deletions
diff --git a/litmus/litmus.c b/litmus/litmus.c
index c03de2dcea0c..aaa1cacd99d6 100644
--- a/litmus/litmus.c
+++ b/litmus/litmus.c
@@ -345,26 +345,9 @@ static void reinit_litmus_state(struct task_struct* p, int restore)
345 } 345 }
346} 346}
347 347
348long litmus_admit_task(struct task_struct* tsk) 348static long __litmus_admit_task(struct task_struct* tsk)
349{ 349{
350 long retval = 0; 350 long err;
351
352 BUG_ON(is_realtime(tsk));
353
354 tsk_rt(tsk)->heap_node = NULL;
355 tsk_rt(tsk)->rel_heap = NULL;
356
357 if (get_rt_relative_deadline(tsk) == 0 ||
358 get_exec_cost(tsk) >
359 min(get_rt_relative_deadline(tsk), get_rt_period(tsk)) ) {
360 TRACE_TASK(tsk,
361 "litmus admit: invalid task parameters "
362 "(e = %lu, p = %lu, d = %lu)\n",
363 get_exec_cost(tsk), get_rt_period(tsk),
364 get_rt_relative_deadline(tsk));
365 retval = -EINVAL;
366 goto out;
367 }
368 351
369 INIT_LIST_HEAD(&tsk_rt(tsk)->list); 352 INIT_LIST_HEAD(&tsk_rt(tsk)->list);
370 353
@@ -375,17 +358,16 @@ long litmus_admit_task(struct task_struct* tsk)
375 if (!tsk_rt(tsk)->heap_node || !tsk_rt(tsk)->rel_heap) { 358 if (!tsk_rt(tsk)->heap_node || !tsk_rt(tsk)->rel_heap) {
376 printk(KERN_WARNING "litmus: no more heap node memory!?\n"); 359 printk(KERN_WARNING "litmus: no more heap node memory!?\n");
377 360
378 retval = -ENOMEM; 361 return -ENOMEM;
379 goto out;
380 } else { 362 } else {
381 bheap_node_init(&tsk_rt(tsk)->heap_node, tsk); 363 bheap_node_init(&tsk_rt(tsk)->heap_node, tsk);
382 } 364 }
383 365
384 preempt_disable(); 366 preempt_disable();
385 367
386 retval = litmus->admit_task(tsk); 368 err = litmus->admit_task(tsk);
387 369
388 if (!retval) { 370 if (!err) {
389 sched_trace_task_name(tsk); 371 sched_trace_task_name(tsk);
390 sched_trace_task_param(tsk); 372 sched_trace_task_param(tsk);
391 atomic_inc(&rt_task_count); 373 atomic_inc(&rt_task_count);
@@ -393,6 +375,32 @@ long litmus_admit_task(struct task_struct* tsk)
393 375
394 preempt_enable(); 376 preempt_enable();
395 377
378 return err;
379}
380
381long litmus_admit_task(struct task_struct* tsk)
382{
383 long retval = 0;
384
385 BUG_ON(is_realtime(tsk));
386
387 tsk_rt(tsk)->heap_node = NULL;
388 tsk_rt(tsk)->rel_heap = NULL;
389
390 if (get_rt_relative_deadline(tsk) == 0 ||
391 get_exec_cost(tsk) >
392 min(get_rt_relative_deadline(tsk), get_rt_period(tsk)) ) {
393 TRACE_TASK(tsk,
394 "litmus admit: invalid task parameters "
395 "(e = %lu, p = %lu, d = %lu)\n",
396 get_exec_cost(tsk), get_rt_period(tsk),
397 get_rt_relative_deadline(tsk));
398 retval = -EINVAL;
399 goto out;
400 }
401
402 retval = __litmus_admit_task(tsk);
403
396out: 404out:
397 if (retval) { 405 if (retval) {
398 if (tsk_rt(tsk)->heap_node) 406 if (tsk_rt(tsk)->heap_node)