diff options
author | Glenn Elliott <gelliott@cs.unc.edu> | 2013-11-19 14:10:33 -0500 |
---|---|---|
committer | Glenn Elliott <gelliott@cs.unc.edu> | 2013-11-19 14:10:33 -0500 |
commit | 6ec2bbce01c4d4287504d4d6b1df7c4d3870abce (patch) | |
tree | 40f9b8238f588836976bc93eaa64cb7cdca4358d | |
parent | 99b223a2c7185cabe274af63eec6dfcbec83c6db (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-- | Makefile | 2 | ||||
-rw-r--r-- | include/litmus.h | 2 | ||||
-rw-r--r-- | src/kernel_iface.c | 55 |
3 files changed, 41 insertions, 18 deletions
@@ -19,7 +19,7 @@ LITMUS_KERNEL ?= ../litmus-rt | |||
19 | # Internal configuration. | 19 | # Internal configuration. |
20 | 20 | ||
21 | # compiler flags | 21 | # compiler flags |
22 | flags-debug = -O2 -Wall -Werror -g -Wdeclaration-after-statement | 22 | flags-debug = -Os -march=native -Wall -Werror -Wdeclaration-after-statement |
23 | flags-api = -D_XOPEN_SOURCE=600 -D_GNU_SOURCE | 23 | flags-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 */ |
127 | void enter_pgm_wait(void); | 127 | void enter_pgm_wait(void); |
128 | void exit_pgm_wait(void); | 128 | void exit_pgm_wait(void); |
129 | void enter_pgm_send(void); | ||
130 | void exit_pgm_send(void); | ||
129 | 131 | ||
130 | /* task system support */ | 132 | /* task system support */ |
131 | int wait_for_ts_release(void); | 133 | 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 @@ | |||
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) | |||
144 | void enter_pgm_wait(void) | 144 | void 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) | |||
157 | void exit_pgm_wait(void) | 156 | void 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 */ | 168 | void 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) { | 181 | void 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 | ||