From fe82d5295af5552936d5bb2497fbf4dc27d77d81 Mon Sep 17 00:00:00 2001 From: Namhoon Kim Date: Tue, 3 May 2016 20:15:07 +0000 Subject: add pgm signal api --- src/kernel_iface.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/src/kernel_iface.c b/src/kernel_iface.c index a2c2104..5460594 100644 --- a/src/kernel_iface.c +++ b/src/kernel_iface.c @@ -140,6 +140,61 @@ 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) { + assert(!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)) { + assert(ctrl_page->pgm_waiting); + ctrl_page->pgm_waiting = 0; + __sync_synchronize(); + } + else { + fprintf(stderr, "exit_pgm_wait: control page not mapped!\n"); + } +} + +void enter_pgm_send(void) +{ + if (likely(ctrl_page != NULL) || init_kernel_iface() == 0) { + assert(!ctrl_page->pgm_sending); + ctrl_page->pgm_sending = 1; /* we will become boosted if + anyone tries to preempt us. */ + __sync_synchronize(); + } + else { + fprintf(stderr, "enter_pgm_send: control page not mapped!\n"); + } +} + +void exit_pgm_send(void) +{ + if (likely(ctrl_page != NULL)) { + assert(ctrl_page->pgm_sending); + + ctrl_page->pgm_satisfied = 1; + __sync_synchronize(); + + /* re-eval priority. Should clear pgm_sending and pgm_satisfied. */ + sched_yield(); + + /* double check that Litmus is doing its job */ + assert(!ctrl_page->pgm_sending && !ctrl_page->pgm_satisfied); + } + else { + fprintf(stderr, "exit_pgm_send: control page not mapped!\n"); + } +} /* init and return a ptr to the control page for * preemption and migration overhead analysis * -- cgit v1.2.2