diff options
author | Bjoern B. Brandenburg <bbb@cs.unc.edu> | 2010-09-21 23:25:14 -0400 |
---|---|---|
committer | Bjoern B. Brandenburg <bbb@cs.unc.edu> | 2010-09-21 23:25:14 -0400 |
commit | c157675b9d4ceb268e38cc80e99c46d73042d409 (patch) | |
tree | 948f98e4e2abf0a083855c8ae7884a59c2bdbaf3 | |
parent | 7b4a10031257415b0ff1c03a77ac33555eeed8fe (diff) |
EDF-WM: add parameter checking to wm_admit_task
-rw-r--r-- | include/litmus/rt_param.h | 1 | ||||
-rw-r--r-- | litmus/sched_edf_wm.c | 60 |
2 files changed, 59 insertions, 2 deletions
diff --git a/include/litmus/rt_param.h b/include/litmus/rt_param.h index f0b7b1c54134..65d2d7c7b783 100644 --- a/include/litmus/rt_param.h +++ b/include/litmus/rt_param.h | |||
@@ -40,6 +40,7 @@ typedef enum { | |||
40 | * is called a 'slice'. | 40 | * is called a 'slice'. |
41 | */ | 41 | */ |
42 | #define MAX_EDF_WM_SLICES NR_CPUS | 42 | #define MAX_EDF_WM_SLICES NR_CPUS |
43 | #define MIN_EDF_WM_SLICE_SIZE 1000000 /* 1 millisecond */ | ||
43 | 44 | ||
44 | struct edf_wm_slice { | 45 | struct edf_wm_slice { |
45 | /* on which CPU is this slice allocated */ | 46 | /* on which CPU is this slice allocated */ |
diff --git a/litmus/sched_edf_wm.c b/litmus/sched_edf_wm.c index 135f618db6b3..4700c77a886a 100644 --- a/litmus/sched_edf_wm.c +++ b/litmus/sched_edf_wm.c | |||
@@ -400,9 +400,65 @@ static void wm_task_exit(struct task_struct * t) | |||
400 | raw_spin_unlock_irqrestore(&dom->slock, flags); | 400 | raw_spin_unlock_irqrestore(&dom->slock, flags); |
401 | } | 401 | } |
402 | 402 | ||
403 | static long wm_admit_task(struct task_struct* tsk) | 403 | static long wm_check_params(struct task_struct *t) |
404 | { | 404 | { |
405 | return task_cpu(tsk) == tsk->rt_param.task_params.cpu ? 0 : -EINVAL; | 405 | struct rt_param* p = tsk_rt(t); |
406 | struct edf_wm_params* wm = &p->task_params.semi_part.wm; | ||
407 | int i; | ||
408 | lt_t tmp; | ||
409 | |||
410 | if (!is_sliced_task(t)) | ||
411 | /* regular task; nothing to check */ | ||
412 | return 0; | ||
413 | |||
414 | /* (1) Either not sliced, or more than 1 slice. */ | ||
415 | if (wm->count == 1 || wm->count > MAX_EDF_WM_SLICES) | ||
416 | return -EINVAL; | ||
417 | |||
418 | /* (2) The partition has to agree with the first slice. */ | ||
419 | if (get_partition(t) != wm->slices[0].cpu) | ||
420 | return -EINVAL; | ||
421 | |||
422 | /* (3) The total budget must agree. */ | ||
423 | for (i = 0, tmp = 0; i < wm->count; i++) | ||
424 | tmp += wm->slices[i].budget; | ||
425 | if (get_exec_cost(t) != tmp) | ||
426 | return -EINVAL; | ||
427 | |||
428 | /* (4) The release of each slice must not precede the previous | ||
429 | * deadline. */ | ||
430 | for (i = 0; i < wm->count - 1; i++) | ||
431 | if (wm->slices[i].deadline > wm->slices[i + 1].offset) | ||
432 | return -EINVAL; | ||
433 | |||
434 | /* (5) The budget of each slice must fit within [offset, deadline] */ | ||
435 | for (i = 0; i < wm->count; i++) | ||
436 | if (lt_before(wm->slices[i].deadline, wm->slices[i].offset) || | ||
437 | wm->slices[i].deadline - wm->slices[i].offset < | ||
438 | wm->slices[i].budget) | ||
439 | return -EINVAL; | ||
440 | |||
441 | /* (6) The budget of each slice must exceed the minimum budget size. */ | ||
442 | for (i = 0; i < wm->count; i++) | ||
443 | if (wm->slices[i].budget < MIN_EDF_WM_SLICE_SIZE) | ||
444 | return -EINVAL; | ||
445 | |||
446 | /* (7) The CPU of each slice must be different from the previous CPU. */ | ||
447 | for (i = 0; i < wm->count - 1; i++) | ||
448 | if (wm->slices[i].cpu == wm->slices[i + 1].cpu) | ||
449 | return -EINVAL; | ||
450 | |||
451 | /* (8) The CPU of each slice must be online. */ | ||
452 | for (i = 0; i < wm->count; i++) | ||
453 | if (!cpu_online(wm->slices[i].cpu)) | ||
454 | return -EINVAL; | ||
455 | |||
456 | return 0; | ||
457 | } | ||
458 | |||
459 | static long wm_admit_task(struct task_struct* t) | ||
460 | { | ||
461 | return task_cpu(t) == get_partition(t) ? wm_check_params(t) : -EINVAL; | ||
406 | } | 462 | } |
407 | 463 | ||
408 | /* Plugin object */ | 464 | /* Plugin object */ |