aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZelin Tong <ztong@ludwig.cs.unc.edu>2020-09-23 16:57:41 -0400
committerZelin Tong <ztong@ludwig.cs.unc.edu>2020-09-23 16:57:41 -0400
commit5903638399a1f983cfacf3a62355bec594757d4f (patch)
tree3222fb7bf2c5b6e67b52e90b47238422719d5f5b
parentc98651d6dfdee7eba0134354583919dd9d2afbcf (diff)
Fixed Period Skipping Issue on Tasks that Overrun WCET
-rw-r--r--litmus/reservations/gedf_reservation.c20
1 files changed, 13 insertions, 7 deletions
diff --git a/litmus/reservations/gedf_reservation.c b/litmus/reservations/gedf_reservation.c
index 95bc1bab28f4..5951963e03ec 100644
--- a/litmus/reservations/gedf_reservation.c
+++ b/litmus/reservations/gedf_reservation.c
@@ -229,15 +229,21 @@ static void gedf_task_replenish_budget(
229 int cpu) 229 int cpu)
230{ 230{
231 struct task_struct* t = ((struct gedf_task_reservation*)res)->task; 231 struct task_struct* t = ((struct gedf_task_reservation*)res)->task;
232 sched_trace_task_completion(t, !is_completed(t)); 232 if (is_completed(t)) {
233 BUG_ON(get_exec_time(t) > 110000000); 233 sched_trace_task_completion(t, 0);
234 tsk_rt(t)->completed = 0; 234 prepare_for_next_period(t);
235 prepare_for_next_period(t); 235 tsk_rt(t)->completed = 0;
236 sched_trace_task_release(t); 236 sched_trace_task_release(t);
237 res->priority = get_deadline(t);
238 res->replenishment_time = get_release(t);
239 } else {
240 sched_trace_task_completion(t, 1);
241 res->replenishment_time += get_rt_period(t);
242 res->priority = res->replenishment_time + get_rt_relative_deadline(t);
243 TRACE_TASK(t, "overrun budget!\n");
244 }
237 res->budget_consumed = 0; 245 res->budget_consumed = 0;
238 res->cur_budget = get_exec_cost(t); 246 res->cur_budget = get_exec_cost(t);
239 res->priority = get_deadline(t);
240 res->replenishment_time = get_release(t);
241} 247}
242 248
243static void gedf_drain_budget( 249static void gedf_drain_budget(