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 | ||
