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 /src | |
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.
Diffstat (limited to 'src')
-rw-r--r-- | src/kernel_iface.c | 55 |
1 files changed, 38 insertions, 17 deletions
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 | ||