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>2013-11-19 14:10:33 -0500
commit6ec2bbce01c4d4287504d4d6b1df7c4d3870abce (patch)
tree40f9b8238f588836976bc93eaa64cb7cdca4358d
parent99b223a2c7185cabe274af63eec6dfcbec83c6db (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 2817373..0f4566a 100644
--- a/include/litmus.h
+++ b/include/litmus.h
@@ -126,6 +126,8 @@ int requested_to_preempt(void);
126/* pgm support */ 126/* pgm support */
127void enter_pgm_wait(void); 127void enter_pgm_wait(void);
128void exit_pgm_wait(void); 128void exit_pgm_wait(void);
129void enter_pgm_send(void);
130void exit_pgm_send(void);
129 131
130/* task system support */ 132/* task system support */
131int wait_for_ts_release(void); 133int 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