aboutsummaryrefslogtreecommitdiffstats
path: root/litmus/budget.c
diff options
context:
space:
mode:
Diffstat (limited to 'litmus/budget.c')
-rw-r--r--litmus/budget.c45
1 files changed, 32 insertions, 13 deletions
diff --git a/litmus/budget.c b/litmus/budget.c
index 75f4b5156947..7d94f7e61b27 100644
--- a/litmus/budget.c
+++ b/litmus/budget.c
@@ -5,6 +5,7 @@
5#include <litmus/litmus.h> 5#include <litmus/litmus.h>
6#include <litmus/preempt.h> 6#include <litmus/preempt.h>
7#include <litmus/budget.h> 7#include <litmus/budget.h>
8#include <litmus/sched_trace.h>
8 9
9struct enforcement_timer { 10struct enforcement_timer {
10 /* The enforcement timer is used to accurately police 11 /* The enforcement timer is used to accurately police
@@ -63,7 +64,7 @@ static void arm_enforcement_timer(struct enforcement_timer* et,
63 64
64 /* Calling this when there is no budget left for the task 65 /* Calling this when there is no budget left for the task
65 * makes no sense, unless the task is non-preemptive. */ 66 * makes no sense, unless the task is non-preemptive. */
66 BUG_ON(budget_exhausted(t) && (!is_np(t))); 67 /* BUG_ON(budget_exhausted(t) && (!is_np(t))); */
67 68
68 /* __hrtimer_start_range_ns() cancels the timer 69 /* __hrtimer_start_range_ns() cancels the timer
69 * anyway, so we don't have to check whether it is still armed */ 70 * anyway, so we don't have to check whether it is still armed */
@@ -109,20 +110,38 @@ static int __init init_budget_enforcement(void)
109 return 0; 110 return 0;
110} 111}
111 112
113void task_release(struct task_struct *t)
114{
115 t->rt_param.job_params.real_release = t->rt_param.job_params.deadline;
116 t->rt_param.job_params.real_deadline += get_rt_period(t);
117 t->rt_param.job_params.job_no++;
118 TRACE_TASK(t, "Releasing task, rr=%llu rd=%llu\n",
119 t->rt_param.job_params.real_release,
120 t->rt_param.job_params.real_deadline);
121 sched_trace_task_release(t);
122}
123
124void server_release(struct task_struct *t)
125{
126 lt_t now = litmus_clock();
127 t->rt_param.job_params.exec_time = 0;
128 t->rt_param.job_params.release = t->rt_param.job_params.deadline;
129 t->rt_param.job_params.deadline += get_rt_period(t);
130 TRACE_TASK(t, "Releasing server, r=%llu d=%llu\n",
131 t->rt_param.job_params.release,
132 t->rt_param.job_params.deadline);
133 /* don't confuse linux */
134 t->rt.time_slice = 1;
135}
136
112void prepare_for_next_server(struct task_struct *t, int forced) 137void prepare_for_next_server(struct task_struct *t, int forced)
113{ 138{
114 if (!job_behind(t)) { 139 if (forced || job_behind(t)) {
115 t->rt_param.job_params.release = t->rt_param.job_params.deadline; 140 server_release(t);
116 t->rt_param.job_params.deadline += get_rt_period(t); 141 }
117 t->rt_param.job_params.exec_time = 0; 142
118 /* update job sequence number */ 143 if (!forced) {
119 t->rt_param.job_params.job_no++; 144 task_release(t);
120 } else if (forced) {
121 t->rt_param.job_params.release = t->rt_param.job_params.deadline;
122 t->rt_param.job_params.exec_time = 0;
123 } else /* behind */{
124 t->rt_param.job_params.deadline += get_rt_period(t);
125 t->rt_param.job_params.job_no++;
126 } 145 }
127} 146}
128 147