From 99b223a2c7185cabe274af63eec6dfcbec83c6db Mon Sep 17 00:00:00 2001 From: Glenn Elliott Date: Fri, 27 Sep 2013 14:13:45 -0400 Subject: Add PGM support. Adds routines for userspace tasks to use to communicate their state to the Litmus kernel. --- include/litmus.h | 4 ++++ src/kernel_iface.c | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/include/litmus.h b/include/litmus.h index dc0d0bf..2817373 100644 --- a/include/litmus.h +++ b/include/litmus.h @@ -123,6 +123,10 @@ void enter_np(void); void exit_np(void); int requested_to_preempt(void); +/* pgm support */ +void enter_pgm_wait(void); +void exit_pgm_wait(void); + /* task system support */ int wait_for_ts_release(void); int release_ts(lt_t *delay); diff --git a/src/kernel_iface.c b/src/kernel_iface.c index ca874ff..3fe4f60 100644 --- a/src/kernel_iface.c +++ b/src/kernel_iface.c @@ -140,6 +140,42 @@ int requested_to_preempt(void) return (likely(ctrl_page != NULL) && ctrl_page->sched.np.preempt); } + +void enter_pgm_wait(void) +{ + if (likely(ctrl_page != NULL) || init_kernel_iface() == 0) { + if (!ctrl_page->pgm_waiting) { + ctrl_page->pgm_waiting = 1; + __sync_synchronize(); + } + } + else { + fprintf(stderr, "enter_pgm_wait: control page not mapped!\n"); + } +} + +void exit_pgm_wait(void) +{ + if (likely(ctrl_page != NULL)) { + if (ctrl_page->pgm_waiting) { + ctrl_page->pgm_satisfied = 1; + __sync_synchronize(); + + /* re-eval priority. Should clear pgm_waiting and pgm_satisfied */ + sched_yield(); + + if (ctrl_page->pgm_waiting || ctrl_page->pgm_satisfied) { + fprintf(stderr, "exit_pgm_wait: pgm flags not cleared! " + "waiting:%d satisfied:%d\n", + ctrl_page->pgm_waiting, ctrl_page->pgm_satisfied); + } + } + } + else { + fprintf(stderr, "exit_pgm_wait: control page not mapped!\n"); + } +} + /* init and return a ptr to the control page for * preemption and migration overhead analysis * -- cgit v1.2.2