aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNamhoon Kim <namhoonk@cs.unc.edu>2016-05-03 16:15:07 -0400
committerNamhoon Kim <namhoonk@cs.unc.edu>2016-05-03 16:15:07 -0400
commitfe82d5295af5552936d5bb2497fbf4dc27d77d81 (patch)
treea5eb54bd54e532b9ce7d28843c5acbd573164cbc
parenta8cda9d6f58a3074875c09c97001207985960a2f (diff)
add pgm signal api
-rw-r--r--src/kernel_iface.c55
1 files changed, 55 insertions, 0 deletions
diff --git a/src/kernel_iface.c b/src/kernel_iface.c
index a2c2104..5460594 100644
--- a/src/kernel_iface.c
+++ b/src/kernel_iface.c
@@ -140,6 +140,61 @@ int requested_to_preempt(void)
140 return (likely(ctrl_page != NULL) && ctrl_page->sched.np.preempt); 140 return (likely(ctrl_page != NULL) && ctrl_page->sched.np.preempt);
141} 141}
142 142
143void enter_pgm_wait(void)
144{
145 if (likely(ctrl_page != NULL) || init_kernel_iface() == 0) {
146 assert(!ctrl_page->pgm_waiting);
147 ctrl_page->pgm_waiting = 1;
148 __sync_synchronize();
149 }
150 else {
151 fprintf(stderr, "enter_pgm_wait: control page not mapped!\n");
152 }
153}
154
155void exit_pgm_wait(void)
156{
157 if (likely(ctrl_page != NULL)) {
158 assert(ctrl_page->pgm_waiting);
159 ctrl_page->pgm_waiting = 0;
160 __sync_synchronize();
161 }
162 else {
163 fprintf(stderr, "exit_pgm_wait: control page not mapped!\n");
164 }
165}
166
167void enter_pgm_send(void)
168{
169 if (likely(ctrl_page != NULL) || init_kernel_iface() == 0) {
170 assert(!ctrl_page->pgm_sending);
171 ctrl_page->pgm_sending = 1; /* we will become boosted if
172 anyone tries to preempt us. */
173 __sync_synchronize();
174 }
175 else {
176 fprintf(stderr, "enter_pgm_send: control page not mapped!\n");
177 }
178}
179
180void exit_pgm_send(void)
181{
182 if (likely(ctrl_page != NULL)) {
183 assert(ctrl_page->pgm_sending);
184
185 ctrl_page->pgm_satisfied = 1;
186 __sync_synchronize();
187
188 /* re-eval priority. Should clear pgm_sending and pgm_satisfied. */
189 sched_yield();
190
191 /* double check that Litmus is doing its job */
192 assert(!ctrl_page->pgm_sending && !ctrl_page->pgm_satisfied);
193 }
194 else {
195 fprintf(stderr, "exit_pgm_send: control page not mapped!\n");
196 }
197}
143/* init and return a ptr to the control page for 198/* init and return a ptr to the control page for
144 * preemption and migration overhead analysis 199 * preemption and migration overhead analysis
145 * 200 *