aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGlenn Elliott <gelliott@cs.unc.edu>2013-11-19 14:10:33 -0500
committerGlenn Elliott <gelliott@cs.unc.edu>2014-02-19 15:51:25 -0500
commit6a76ccc5091bd352860b7d74946c99d9d6e83369 (patch)
tree7441f2c0cb8c23c178321ba42d93e7e18ed2889a
parent63ef21c366a47d27fe3a43175a3224d368083529 (diff)
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.
-rw-r--r--Makefile2
-rw-r--r--include/litmus.h2
-rw-r--r--src/kernel_iface.c55
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
19# Internal configuration. 19# Internal configuration.
20 20
21# compiler flags 21# compiler flags
22flags-debug = -O2 -Wall -Werror -g -Wdeclaration-after-statement 22flags-debug = -Os -march=native -Wall -Werror -Wdeclaration-after-statement
23flags-api = -D_XOPEN_SOURCE=600 -D_GNU_SOURCE 23flags-api = -D_XOPEN_SOURCE=600 -D_GNU_SOURCE
24 24
25# architecture-specific flags 25# architecture-specific flags
diff --git a/include/litmus.h b/include/litmus.h
index 70a1e9a..2b0d5c2 100644
--- a/include/litmus.h
+++ b/include/litmus.h
@@ -119,6 +119,8 @@ int requested_to_preempt(void);
119/* pgm support */ 119/* pgm support */
120void enter_pgm_wait(void); 120void enter_pgm_wait(void);
121void exit_pgm_wait(void); 121void exit_pgm_wait(void);
122void enter_pgm_send(void);
123void exit_pgm_send(void);
122 124
123/* task system support */ 125/* task system support */
124int wait_for_ts_release(void); 126int 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 @@
2#include <sys/fcntl.h> /* for O_RDWR */ 2#include <sys/fcntl.h> /* for O_RDWR */
3#include <sys/unistd.h> 3#include <sys/unistd.h>
4#include <sched.h> /* for sched_yield() */ 4#include <sched.h> /* for sched_yield() */
5 5#include <assert.h>
6 6
7#include <stdio.h> 7#include <stdio.h>
8 8
@@ -144,10 +144,9 @@ int requested_to_preempt(void)
144void enter_pgm_wait(void) 144void enter_pgm_wait(void)
145{ 145{
146 if (likely(ctrl_page != NULL) || init_kernel_iface() == 0) { 146 if (likely(ctrl_page != NULL) || init_kernel_iface() == 0) {
147 if (!ctrl_page->pgm_waiting) { 147 assert(!ctrl_page->pgm_waiting);
148 ctrl_page->pgm_waiting = 1; 148 ctrl_page->pgm_waiting = 1;
149 __sync_synchronize(); 149 __sync_synchronize();
150 }
151 } 150 }
152 else { 151 else {
153 fprintf(stderr, "enter_pgm_wait: control page not mapped!\n"); 152 fprintf(stderr, "enter_pgm_wait: control page not mapped!\n");
@@ -157,22 +156,44 @@ void enter_pgm_wait(void)
157void exit_pgm_wait(void) 156void exit_pgm_wait(void)
158{ 157{
159 if (likely(ctrl_page != NULL)) { 158 if (likely(ctrl_page != NULL)) {
160 if (ctrl_page->pgm_waiting) { 159 assert(ctrl_page->pgm_waiting);
161 ctrl_page->pgm_satisfied = 1; 160 ctrl_page->pgm_waiting = 0;
162 __sync_synchronize(); 161 __sync_synchronize();
162 }
163 else {
164 fprintf(stderr, "exit_pgm_wait: control page not mapped!\n");
165 }
166}
163 167
164 /* re-eval priority. Should clear pgm_waiting and pgm_satisfied */ 168void enter_pgm_send(void)
165 sched_yield(); 169{
170 if (likely(ctrl_page != NULL) || init_kernel_iface() == 0) {
171 assert(!ctrl_page->pgm_sending);
172 ctrl_page->pgm_sending = 1; /* we will become boosted if
173 anyone tries to preempt us. */
174 __sync_synchronize();
175 }
176 else {
177 fprintf(stderr, "enter_pgm_send: control page not mapped!\n");
178 }
179}
166 180
167 if (ctrl_page->pgm_waiting || ctrl_page->pgm_satisfied) { 181void exit_pgm_send(void)
168 fprintf(stderr, "exit_pgm_wait: pgm flags not cleared! " 182{
169 "waiting:%d satisfied:%d\n", 183 if (likely(ctrl_page != NULL)) {
170 ctrl_page->pgm_waiting, ctrl_page->pgm_satisfied); 184 assert(ctrl_page->pgm_sending);
171 } 185
172 } 186 ctrl_page->pgm_satisfied = 1;
187 __sync_synchronize();
188
189 /* re-eval priority. Should clear pgm_sending and pgm_satisfied. */
190 sched_yield();
191
192 /* double check that Litmus is doing its job */
193 assert(!ctrl_page->pgm_sending && !ctrl_page->pgm_satisfied);
173 } 194 }
174 else { 195 else {
175 fprintf(stderr, "exit_pgm_wait: control page not mapped!\n"); 196 fprintf(stderr, "exit_pgm_send: control page not mapped!\n");
176 } 197 }
177} 198}
178 199