aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/litmus/budget.h4
-rw-r--r--litmus/budget.c18
-rw-r--r--litmus/jobs.c1
-rw-r--r--litmus/sched_mc.c5
4 files changed, 26 insertions, 2 deletions
diff --git a/include/litmus/budget.h b/include/litmus/budget.h
index 732530e63491..559cfcdda61a 100644
--- a/include/litmus/budget.h
+++ b/include/litmus/budget.h
@@ -5,4 +5,8 @@
5 * the next task. */ 5 * the next task. */
6void update_enforcement_timer(struct task_struct* t); 6void update_enforcement_timer(struct task_struct* t);
7 7
8void prepare_for_next_server(struct task_struct* t,int forced);
9
10#define job_behind(t) (lt_before_eq((t)->rt_param.job_params.deadline, \
11 (t)->rt_param.job_params.release))
8#endif 12#endif
diff --git a/litmus/budget.c b/litmus/budget.c
index 310e9a3d4172..75f4b5156947 100644
--- a/litmus/budget.c
+++ b/litmus/budget.c
@@ -4,6 +4,7 @@
4 4
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 8
8struct enforcement_timer { 9struct enforcement_timer {
9 /* The enforcement timer is used to accurately police 10 /* The enforcement timer is used to accurately police
@@ -108,4 +109,21 @@ static int __init init_budget_enforcement(void)
108 return 0; 109 return 0;
109} 110}
110 111
112void prepare_for_next_server(struct task_struct *t, int forced)
113{
114 if (!job_behind(t)) {
115 t->rt_param.job_params.release = t->rt_param.job_params.deadline;
116 t->rt_param.job_params.deadline += get_rt_period(t);
117 t->rt_param.job_params.exec_time = 0;
118 /* update job sequence number */
119 t->rt_param.job_params.job_no++;
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 }
127}
128
111module_init(init_budget_enforcement); 129module_init(init_budget_enforcement);
diff --git a/litmus/jobs.c b/litmus/jobs.c
index 36e314625d86..669a3df5fcc1 100644
--- a/litmus/jobs.c
+++ b/litmus/jobs.c
@@ -10,6 +10,7 @@ void prepare_for_next_period(struct task_struct *t)
10{ 10{
11 BUG_ON(!t); 11 BUG_ON(!t);
12 /* prepare next release */ 12 /* prepare next release */
13
13 t->rt_param.job_params.release = t->rt_param.job_params.deadline; 14 t->rt_param.job_params.release = t->rt_param.job_params.deadline;
14 t->rt_param.job_params.deadline += get_rt_period(t); 15 t->rt_param.job_params.deadline += get_rt_period(t);
15 t->rt_param.job_params.exec_time = 0; 16 t->rt_param.job_params.exec_time = 0;
diff --git a/litmus/sched_mc.c b/litmus/sched_mc.c
index 53c24ac2172c..baded0d58cb9 100644
--- a/litmus/sched_mc.c
+++ b/litmus/sched_mc.c
@@ -24,6 +24,7 @@
24#include <litmus/domain.h> 24#include <litmus/domain.h>
25#include <litmus/bheap.h> 25#include <litmus/bheap.h>
26#include <litmus/event_group.h> 26#include <litmus/event_group.h>
27#include <litmus/budget.h>
27 28
28#include <litmus/sched_mc.h> 29#include <litmus/sched_mc.h>
29#include <litmus/ce_domain.h> 30#include <litmus/ce_domain.h>
@@ -592,7 +593,7 @@ static void job_completion(struct task_struct *task, int forced)
592 now = litmus_clock(); 593 now = litmus_clock();
593 594
594 /* If it's not a ghost job, do ghost job conversion */ 595 /* If it's not a ghost job, do ghost job conversion */
595 if (!is_ghost(task)) { 596 if (!is_ghost(task) && !job_behind(task)) {
596 TRACE_MC_TASK(task, "is not a ghost task\n"); 597 TRACE_MC_TASK(task, "is not a ghost task\n");
597 tsk_mc_data(task)->mc_job.ghost_budget = budget_remaining(task); 598 tsk_mc_data(task)->mc_job.ghost_budget = budget_remaining(task);
598 tsk_mc_data(task)->mc_job.is_ghost = 1; 599 tsk_mc_data(task)->mc_job.is_ghost = 1;
@@ -605,7 +606,7 @@ static void job_completion(struct task_struct *task, int forced)
605 if (tsk_mc_data(task)->mc_job.ghost_budget == 0) { 606 if (tsk_mc_data(task)->mc_job.ghost_budget == 0) {
606 TRACE_MC_TASK(task, "has zero ghost budget\n"); 607 TRACE_MC_TASK(task, "has zero ghost budget\n");
607 tsk_mc_data(task)->mc_job.is_ghost = 0; 608 tsk_mc_data(task)->mc_job.is_ghost = 0;
608 prepare_for_next_period(task); 609 prepare_for_next_server(task, forced);
609 if (is_released(task, litmus_clock())) 610 if (is_released(task, litmus_clock()))
610 sched_trace_task_release(task); 611 sched_trace_task_release(task);
611 } 612 }