diff options
author | Bjoern Brandenburg <bbb@mpi-sws.org> | 2015-10-06 15:45:29 -0400 |
---|---|---|
committer | Bjoern Brandenburg <bbb@mpi-sws.org> | 2016-03-08 10:12:45 -0500 |
commit | bd415c3ca4f80d9920a624513a164c312a6322c2 (patch) | |
tree | 7bdbc8b2cc3a5b169d1b2ff45c524ed66d4bdb0f /litmus | |
parent | 5864d409a8e756d191b048b66b63ddb98a575452 (diff) |
LITMUS^RT: split task admission into two functions
Diffstat (limited to 'litmus')
-rw-r--r-- | litmus/litmus.c | 54 |
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 | ||
348 | long litmus_admit_task(struct task_struct* tsk) | 348 | static 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 | |||
381 | long 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 | |||
396 | out: | 404 | out: |
397 | if (retval) { | 405 | if (retval) { |
398 | if (tsk_rt(tsk)->heap_node) | 406 | if (tsk_rt(tsk)->heap_node) |