From 6ec2bbce01c4d4287504d4d6b1df7c4d3870abce Mon Sep 17 00:00:00 2001 From: Glenn Elliott Date: Tue, 19 Nov 2013 14:10:33 -0500 Subject: Update PGM interface with kernel This patch updates the PGM interface with the kernel. Producers now boost their priority when generating tokens, not consumers while waiting for tokens. --- Makefile | 2 +- include/litmus.h | 2 ++ src/kernel_iface.c | 55 +++++++++++++++++++++++++++++++++++++----------------- 3 files changed, 41 insertions(+), 18 deletions(-) diff --git a/Makefile b/Makefile index e8003e8..39a79a7 100644 --- a/Makefile +++ b/Makefile @@ -19,7 +19,7 @@ LITMUS_KERNEL ?= ../litmus-rt # Internal configuration. # compiler flags -flags-debug = -O2 -Wall -Werror -g -Wdeclaration-after-statement +flags-debug = -Os -march=native -Wall -Werror -Wdeclaration-after-statement flags-api = -D_XOPEN_SOURCE=600 -D_GNU_SOURCE # architecture-specific flags diff --git a/include/litmus.h b/include/litmus.h index 2817373..0f4566a 100644 --- a/include/litmus.h +++ b/include/litmus.h @@ -126,6 +126,8 @@ int requested_to_preempt(void); /* pgm support */ void enter_pgm_wait(void); void exit_pgm_wait(void); +void enter_pgm_send(void); +void exit_pgm_send(void); /* task system support */ int wait_for_ts_release(void); diff --git a/src/kernel_iface.c b/src/kernel_iface.c index 3fe4f60..1aa941d 100644 --- a/src/kernel_iface.c +++ b/src/kernel_iface.c @@ -2,7 +2,7 @@ #include /* for O_RDWR */ #include #include /* for sched_yield() */ - +#include #include @@ -144,10 +144,9 @@ int requested_to_preempt(void) 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(); - } + assert(!ctrl_page->pgm_waiting); + ctrl_page->pgm_waiting = 1; + __sync_synchronize(); } else { fprintf(stderr, "enter_pgm_wait: control page not mapped!\n"); @@ -157,22 +156,44 @@ void enter_pgm_wait(void) void exit_pgm_wait(void) { if (likely(ctrl_page != NULL)) { - if (ctrl_page->pgm_waiting) { - ctrl_page->pgm_satisfied = 1; - __sync_synchronize(); + assert(ctrl_page->pgm_waiting); + ctrl_page->pgm_waiting = 0; + __sync_synchronize(); + } + else { + fprintf(stderr, "exit_pgm_wait: control page not mapped!\n"); + } +} - /* re-eval priority. Should clear pgm_waiting and pgm_satisfied */ - sched_yield(); +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"); + } +} - 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); - } - } +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_wait: control page not mapped!\n"); + fprintf(stderr, "exit_pgm_send: control page not mapped!\n"); } } -- cgit v1.2.2