From 800375b4a1569cf244596630b0c3fd1438f8d930 Mon Sep 17 00:00:00 2001 From: Namhoon Kim Date: Tue, 19 Apr 2016 21:01:22 +0000 Subject: add support for pgm --- Makefile | 2 +- bin/mttest.c | 2 +- include/color_shm.h | 6 +++--- include/litmus.h | 12 +++++++++++ src/kernel_iface.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 5 files changed, 74 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index c1aecde..5ceaedf 100644 --- a/Makefile +++ b/Makefile @@ -20,7 +20,7 @@ LITMUS_KERNEL ?= ../litmus-rt # compiler flags flags-debug = -O0 -Wall -g -Wdeclaration-after-statement -flags-api = -D_XOPEN_SOURCE=600 -D_GNU_SOURCE +flags-api = -D_XOPEN_SOURCE=600 -D_GNU_SOURCE -DCONFIG_PGMRT_SUPPORT # architecture-specific flags flags-i386 = -m32 diff --git a/bin/mttest.c b/bin/mttest.c index 3f1f655..7d573cc 100644 --- a/bin/mttest.c +++ b/bin/mttest.c @@ -77,7 +77,7 @@ int main(int argc, char** argv) struct thread_context ctx[NUM_THREADS]; pthread_t task[NUM_THREADS]; char *shm; - struct ioctl_cmd shm_info; + struct color_ioctl_cmd shm_info; /* The task is in background mode upon startup. */ diff --git a/include/color_shm.h b/include/color_shm.h index a95ffde..f6ad8a5 100644 --- a/include/color_shm.h +++ b/include/color_shm.h @@ -1,13 +1,13 @@ #include #include -#define SHM_MAJOR 240 +#define SHM_MAJOR (240) -struct ioctl_cmd { +struct color_ioctl_cmd { unsigned int color; unsigned int bank; }; #define SET_COLOR_SHM_CMD \ - _IOW(SHM_MAJOR, 0x1, struct ioctl_cmd) + _IOW(SHM_MAJOR, 0x1, struct color_ioctl_cmd) diff --git a/include/litmus.h b/include/litmus.h index e96a4a6..aaa8d1c 100644 --- a/include/litmus.h +++ b/include/litmus.h @@ -148,6 +148,12 @@ int sporadic_clustered(lt_t e_ns, lt_t p_ns, int cluster); /** Convert microseconds to nanoseconds * @param us Time units in microseconds */ #define us2ns(us) ((us)*1000LL) +#define ns2s(ns) ((ns)/1000000000LL) +#define ns2ms(ns) ((ns)/1000000LL) +#define ns2us(ns) ((ns)/1000LL) +#define us2ms(us) ((us)/1000LL) +#define us2s(us) ((us)/1000000LL) +#define ms2s(ms) ((ms)/1000LL) /** * Locking protocols for allocated shared objects @@ -288,6 +294,12 @@ void exit_np(void); */ 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 *****/ /** * Wait until task master releases all real-time tasks diff --git a/src/kernel_iface.c b/src/kernel_iface.c index ca874ff..49cef2a 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 @@ -140,6 +140,62 @@ 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