From 83057ba7c2d4916e54c71efe80f086adfab08f13 Mon Sep 17 00:00:00 2001 From: Glenn Elliott Date: Fri, 27 Sep 2013 13:19:57 -0400 Subject: PGM release/deadline adjustment. Adds code that adjusts a jobs release and deadline according to when the job receives the necessary PGM tokens. --- include/litmus/pgm.h | 11 +++++++++++ litmus/Makefile | 1 + litmus/pgm.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 66 insertions(+) create mode 100644 include/litmus/pgm.h create mode 100644 litmus/pgm.c diff --git a/include/litmus/pgm.h b/include/litmus/pgm.h new file mode 100644 index 000000000000..1e87e170e8c3 --- /dev/null +++ b/include/litmus/pgm.h @@ -0,0 +1,11 @@ +#ifndef _LITMUS_PGM_H_ +#define _LITMUS_PGM_H_ + +#include + +#define is_pgm_waiting(t) (tsk_rt(t)->ctrl_page && tsk_rt(t)->ctrl_page->pgm_waiting) +#define is_pgm_satisfied(t) (tsk_rt(t)->ctrl_page && tsk_rt(t)->ctrl_page->pgm_satisfied) + +void setup_pgm_release(struct task_struct* t); + +#endif diff --git a/litmus/Makefile b/litmus/Makefile index 2bddc94a399f..52f407cad77c 100644 --- a/litmus/Makefile +++ b/litmus/Makefile @@ -26,6 +26,7 @@ obj-y = sched_plugin.o litmus.o \ obj-$(CONFIG_PLUGIN_CEDF) += sched_cedf.o obj-$(CONFIG_PLUGIN_PFAIR) += sched_pfair.o obj-$(CONFIG_SCHED_CPU_AFFINITY) += affinity.o +obj-$(CONFIG_SCHED_PGM) += pgm.o obj-$(CONFIG_FEATHER_TRACE) += ft_event.o ftdev.o obj-$(CONFIG_SCHED_TASK_TRACE) += sched_task_trace.o diff --git a/litmus/pgm.c b/litmus/pgm.c new file mode 100644 index 000000000000..f8b857de8118 --- /dev/null +++ b/litmus/pgm.c @@ -0,0 +1,54 @@ +/* litmus/pgm.c - common pgm control code + */ + +#include +#include +#include + +/* Only readjust release/deadline if difference is over a given threshold. + It's a weak method for accounting overheads. Ideally, we'd know the last + time t was woken up by its last predecessor, rather than having to look + at 'now'. */ +#define ADJUSTMENT_THRESH_US 200 + +void setup_pgm_release(struct task_struct* t) +{ + /* approximate time last predecessor gave us tokens */ + lt_t now = litmus_clock(); + + TRACE_TASK(t, "is starting a new PGM job: waiting:%d satisfied:%d\n", + tsk_rt(t)->ctrl_page->pgm_waiting, tsk_rt(t)->ctrl_page->pgm_satisfied); + + BUG_ON(!tsk_rt(t)->ctrl_page->pgm_waiting || !tsk_rt(t)->ctrl_page->pgm_satisfied); + + tsk_rt(t)->ctrl_page->pgm_waiting = 0; + tsk_rt(t)->ctrl_page->pgm_satisfied = 0; + + /* Adjust release time if we got the last tokens after release of this job. + This is possible since PGM jobs are early-released. Don't shift our + deadline if we got the tokens earlier than expected. */ + if (now > tsk_rt(t)->job_params.release) { + long long diff = now - tsk_rt(t)->job_params.release; + if (diff > ADJUSTMENT_THRESH_US) { + lt_t adj_deadline = now + get_rt_relative_deadline(t); + + TRACE_TASK(t, "adjusting PGM release time from (r = %llu, d = %llu) " + "to (r = %llu, d = %llu)\n", + tsk_rt(t)->job_params.release, tsk_rt(t)->job_params.deadline, + now, adj_deadline); + + tsk_rt(t)->job_params.release = now; + tsk_rt(t)->job_params.deadline = adj_deadline; + tsk_rt(t)->job_params.exec_time = 0; /* reset budget */ + } + else { + TRACE_TASK(t, "adjustment falls below threshold. %lld < %lld\n", + diff, ADJUSTMENT_THRESH_US); + } + } + else { + TRACE_TASK(t, "got tokens early--no need to adjust release. " + "cur time = %llu, release time = %llu\n", + now, tsk_rt(t)->job_params.release); + } +} -- cgit v1.2.2