aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZelin Tong <ztong@ludwig.cs.unc.edu>2020-10-24 00:17:10 -0400
committerZelin Tong <ztong@ludwig.cs.unc.edu>2020-10-24 00:17:10 -0400
commit9e0f6ba040ab9f9a6d1e2b1dbd0beca8ef4754cc (patch)
treea7b54e4e88e81f718d2338175afce9f059b0e484
parent4786ef1a164fd94b402968afa1955aedf41de304 (diff)
Added support for early releasing
-rw-r--r--include/litmus/reservations/gedf_reservation.h1
-rw-r--r--litmus/reservations/gedf_reservation.c5
2 files changed, 5 insertions, 1 deletions
diff --git a/include/litmus/reservations/gedf_reservation.h b/include/litmus/reservations/gedf_reservation.h
index 578b9cad5838..17965c89846c 100644
--- a/include/litmus/reservations/gedf_reservation.h
+++ b/include/litmus/reservations/gedf_reservation.h
@@ -15,6 +15,7 @@ struct gedf_reservation {
15 lt_t cur_budget; 15 lt_t cur_budget;
16 int will_remove; 16 int will_remove;
17 int blocked; 17 int blocked;
18 int allow_early_release;
18}; 19};
19 20
20struct gedf_cpu_entry { 21struct gedf_cpu_entry {
diff --git a/litmus/reservations/gedf_reservation.c b/litmus/reservations/gedf_reservation.c
index 1649eaf026d7..deb0c9e6e3ef 100644
--- a/litmus/reservations/gedf_reservation.c
+++ b/litmus/reservations/gedf_reservation.c
@@ -92,7 +92,8 @@ static void requeue(
92 BUG_ON(!gedf_res); 92 BUG_ON(!gedf_res);
93 BUG_ON(is_queued_res(&gedf_res->res)); 93 BUG_ON(is_queued_res(&gedf_res->res));
94 94
95 if (lt_before_eq(gedf_res->res.replenishment_time, litmus_clock())) 95 if (gedf_res->allow_early_release ||
96 lt_before_eq(gedf_res->res.replenishment_time, litmus_clock()))
96 __add_ready_res(&gedf_env->domain, &gedf_res->res); 97 __add_ready_res(&gedf_env->domain, &gedf_res->res);
97 else 98 else
98 __add_release_res(&gedf_env->domain, &gedf_res->res); 99 __add_release_res(&gedf_env->domain, &gedf_res->res);
@@ -331,6 +332,7 @@ long alloc_gedf_task_reservation(
331 gedf_task_res->task = task; 332 gedf_task_res->task = task;
332 gedf_task_res->gedf_res.res.priority = ULLONG_MAX - get_rt_relative_deadline(task); 333 gedf_task_res->gedf_res.res.priority = ULLONG_MAX - get_rt_relative_deadline(task);
333 gedf_task_res->gedf_res.res.cur_budget = get_exec_cost(task); 334 gedf_task_res->gedf_res.res.cur_budget = get_exec_cost(task);
335 gedf_task_res->gedf_res.allow_early_release = is_early_releasing(task);
334 336
335 *_res = gedf_task_res; 337 *_res = gedf_task_res;
336 return 0; 338 return 0;
@@ -353,6 +355,7 @@ long alloc_gedf_container_reservation(
353 gedf_cont_res->max_budget = max_budget; 355 gedf_cont_res->max_budget = max_budget;
354 gedf_cont_res->period = period; 356 gedf_cont_res->period = period;
355 gedf_cont_res->relative_deadline = relative_deadline; 357 gedf_cont_res->relative_deadline = relative_deadline;
358 gedf_cont_res->gedf_res.allow_early_release = 0;
356 359
357 *_res = gedf_cont_res; 360 *_res = gedf_cont_res;
358 return 0; 361 return 0;