From e01b6a8b49bf5c8f3a53b260b9d625a2321e4f42 Mon Sep 17 00:00:00 2001 From: Glenn Elliott Date: Fri, 27 Sep 2013 13:33:03 -0400 Subject: PGM support in GSN-EDF. Patch enables PGM support by GSN-EDF. GSN-EDF boosts the priority of a job waiting for inbound tokens. Likewise, boosting is removed when inbound tokens have been received. --- litmus/sched_gsn_edf.c | 41 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) (limited to 'litmus') diff --git a/litmus/sched_gsn_edf.c b/litmus/sched_gsn_edf.c index 34e6cff9753e..b819b62915f1 100644 --- a/litmus/sched_gsn_edf.c +++ b/litmus/sched_gsn_edf.c @@ -28,10 +28,13 @@ #ifdef CONFIG_SCHED_CPU_AFFINITY #include #endif - /* to set up domain/cpu mappings */ #include +#ifdef CONFIG_SCHED_PGM +#include +#endif + #include /* Overview of GSN-EDF operations. @@ -461,6 +464,42 @@ static struct task_struct* gsnedf_schedule(struct task_struct * prev) TRACE_TASK(prev, "will be preempted by %s/%d\n", entry->linked->comm, entry->linked->pid); +#ifdef CONFIG_SCHED_PGM + if (exists && is_pgm_waiting(entry->scheduled)) { + if (!is_priority_boosted(entry->scheduled)) { + TRACE_TASK(entry->scheduled, "is waiting for PGM tokens.\n"); + BUG_ON(is_pgm_satisfied(entry->scheduled)); + + /* Boost priority so we'll be scheduled immediately + when needed tokens arrive. */ + tsk_rt(entry->scheduled)->priority_boosted = 1; + tsk_rt(entry->scheduled)->boost_start_time = litmus_clock(); + + if (unlikely(!blocks)) { + /* Task has probably blocked on an inbound token socket, but + if not, re-evaluate scheduling decisions */ + unlink(entry->scheduled); + gsnedf_job_arrival(entry->scheduled); + } + } + else if (is_pgm_satisfied(entry->scheduled)) { + TRACE_TASK(entry->scheduled, "is done waiting for PGM tokens.\n"); + BUG_ON(!is_priority_boosted(entry->scheduled)); + + /* clear any boosting */ + tsk_rt(entry->scheduled)->priority_boosted = 0; + setup_pgm_release(entry->scheduled); + + if (likely(!blocks)) { + /* Task has probably called sched_yield(), so blocking is + unlikely. Re-evaluate scheduling decisions because we + still want to run. */ + unlink(entry->scheduled); + gsnedf_job_arrival(entry->scheduled); + } + } + } +#endif /* If a task blocks we have no choice but to reschedule. */ -- cgit v1.2.2