From e9c900fae35e4e4730469e189ff17bf30518346a Mon Sep 17 00:00:00 2001 From: Glenn Elliott Date: Thu, 20 May 2010 14:17:58 -0400 Subject: Support budget enforcement policies. Allows tasks to specify how their execution budgets should be enforced: NO_ENFORCEMENT, QUANTUM_ENFORCEMENT, and PRECISE_ENFORCEMENT (unsupported). NOTE: Users of NO_ENFORCEMENT must call sleep_next_period() at the end of every job to signal to the kernel that its job is complete. --- bin/rtspin.c | 2 +- include/litmus.h | 19 +++++++++++++------ src/litmus.c | 10 +++++++--- src/task.c | 3 +++ 4 files changed, 24 insertions(+), 10 deletions(-) diff --git a/bin/rtspin.c b/bin/rtspin.c index aa97745..f291869 100644 --- a/bin/rtspin.c +++ b/bin/rtspin.c @@ -221,7 +221,7 @@ int main(int argc, char** argv) bail_out("could not migrate to target partition"); } - ret = sporadic_task_ns(wcet, period, 0, cpu, class, migrate); + ret = sporadic_task_ns(wcet, period, 0, cpu, class, NO_ENFORCEMENT, migrate); if (ret < 0) bail_out("could not setup rt task params"); diff --git a/include/litmus.h b/include/litmus.h index e0f16d3..b798c92 100644 --- a/include/litmus.h +++ b/include/litmus.h @@ -27,18 +27,24 @@ int set_rt_task_param(pid_t pid, struct rt_task* param); int get_rt_task_param(pid_t pid, struct rt_task* param); /* setup helper */ + /* times are given in ms */ -int sporadic_task(lt_t e, lt_t p, lt_t phase, - int partition, task_class_t cls, int set_cpu_set); +int sporadic_task( + lt_t e, lt_t p, lt_t phase, + int partition, task_class_t cls, + budget_policy_t budget_policy, int set_cpu_set); /* times are given in ns */ -int sporadic_task_ns(lt_t e, lt_t p, lt_t phase, - int cpu, task_class_t cls, int set_cpu_set); +int sporadic_task_ns( + lt_t e, lt_t p, lt_t phase, + int cpu, task_class_t cls, + budget_policy_t budget_policy, int set_cpu_set); +/* budget enforcement off by default in these macros */ #define sporadic_global(e, p) \ - sporadic_task(e, p, 0, 0, RT_CLASS_SOFT, 0) + sporadic_task(e, p, 0, 0, RT_CLASS_SOFT, NO_ENFORCEMENT, 0) #define sporadic_partitioned(e, p, cpu) \ - sporadic_task(e, p, 0, cpu, RT_CLASS_SOFT, 1) + sporadic_task(e, p, 0, cpu, RT_CLASS_SOFT, NO_ENFORCEMENT, 1) /* file descriptor attached shared objects support */ typedef enum { @@ -75,6 +81,7 @@ void exit_litmus(void); /* A real-time program. */ typedef int (*rt_fn_t)(void*); +/* These two functions configure the RT task to use enforced exe budgets */ int create_rt_task(rt_fn_t rt_prog, void *arg, int cpu, int wcet, int period); int __create_rt_task(rt_fn_t rt_prog, void *arg, int cpu, int wcet, int period, task_class_t cls); diff --git a/src/litmus.c b/src/litmus.c index 5f98b97..f71f337 100644 --- a/src/litmus.c +++ b/src/litmus.c @@ -42,14 +42,16 @@ int be_migrate_to(int target_cpu) } int sporadic_task(lt_t e, lt_t p, lt_t phase, - int cpu, task_class_t cls, int set_cpu_set) + int cpu, task_class_t cls, + budget_policy_t budget_policy, int set_cpu_set) { return sporadic_task_ns(e * NS_PER_MS, p * NS_PER_MS, phase * NS_PER_MS, - cpu, cls, set_cpu_set); + cpu, cls, budget_policy, set_cpu_set); } int sporadic_task_ns(lt_t e, lt_t p, lt_t phase, - int cpu, task_class_t cls, int set_cpu_set) + int cpu, task_class_t cls, + budget_policy_t budget_policy, int set_cpu_set) { struct rt_task param; int ret; @@ -58,6 +60,8 @@ int sporadic_task_ns(lt_t e, lt_t p, lt_t phase, param.cpu = cpu; param.cls = cls; param.phase = phase; + param.budget_policy = budget_policy; + if (set_cpu_set) { ret = be_migrate_to(cpu); check("migrate to cpu"); diff --git a/src/task.c b/src/task.c index f9e4ccf..4d237bd 100644 --- a/src/task.c +++ b/src/task.c @@ -49,6 +49,9 @@ int __create_rt_task(rt_fn_t rt_prog, void *arg, int cpu, int wcet, int period, params.exec_cost = wcet; params.cls = class; params.phase = 0; + /* enforce budget for tasks that might not use sleep_next_period() */ + params.budget_policy = QUANTUM_ENFORCEMENT; + return __launch_rt_task(rt_prog, arg, (rt_setup_fn_t) set_rt_task_param, ¶ms); } -- cgit v1.2.2