diff options
author | Bjoern Brandenburg <bbb@mpi-sws.org> | 2013-06-08 14:05:29 -0400 |
---|---|---|
committer | Bjoern Brandenburg <bbb@mpi-sws.org> | 2013-06-08 18:13:43 -0400 |
commit | 4928cb8f9b596dde0f977bd8924a28dd38541f5f (patch) | |
tree | 9d56efc55b291a8fe353bf84e29b2fbbdbfa0343 /tests | |
parent | d671324496bed1cd10fbdf425f049eae11efde14 (diff) |
Add testcase for admission of suspended tasks
The kernel needs to be able to deal with tasks that do not make
themselves a real-time task, but get configured by some other task
instead.
Diffstat (limited to 'tests')
-rw-r--r-- | tests/core_api.c | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/tests/core_api.c b/tests/core_api.c index fc4deb9..42529ce 100644 --- a/tests/core_api.c +++ b/tests/core_api.c | |||
@@ -1,6 +1,8 @@ | |||
1 | #include <sys/wait.h> /* for waitpid() */ | 1 | #include <sys/wait.h> /* for waitpid() */ |
2 | #include <unistd.h> | 2 | #include <unistd.h> |
3 | #include <stdio.h> | 3 | #include <stdio.h> |
4 | #include <stdlib.h> | ||
5 | #include <sched.h> | ||
4 | 6 | ||
5 | #include "tests.h" | 7 | #include "tests.h" |
6 | #include "litmus.h" | 8 | #include "litmus.h" |
@@ -169,3 +171,61 @@ TESTCASE(ctrl_page_writable, ALL, | |||
169 | 171 | ||
170 | ctrl_page[32] = 0x12345678; | 172 | ctrl_page[32] = 0x12345678; |
171 | } | 173 | } |
174 | |||
175 | |||
176 | TESTCASE(suspended_admission, LITMUS, | ||
177 | "admission control handles suspended tasks correctly") | ||
178 | { | ||
179 | int child_rt, status; | ||
180 | struct sched_param param; | ||
181 | |||
182 | int pipefd[2], err, token = 0; | ||
183 | struct rt_task params; | ||
184 | |||
185 | SYSCALL( pipe(pipefd) ); | ||
186 | |||
187 | child_rt = FORK_TASK( | ||
188 | child_rt = gettid(); | ||
189 | /* make sure we are on the right CPU */ | ||
190 | be_migrate_to_cpu(0); | ||
191 | |||
192 | /* carry out a blocking read to suspend */ | ||
193 | err = read(pipefd[0], &token, sizeof(token)); | ||
194 | ASSERT(err = sizeof(token)); | ||
195 | ASSERT(token == 1234); | ||
196 | |||
197 | /* when we wake up, we should be a real-time task */ | ||
198 | ASSERT( sched_getscheduler(child_rt) == SCHED_LITMUS ); | ||
199 | |||
200 | SYSCALL( sleep_next_period() ); | ||
201 | SYSCALL( sleep_next_period() ); | ||
202 | |||
203 | exit(0); | ||
204 | ); | ||
205 | |||
206 | /* give child some time to suspend */ | ||
207 | SYSCALL( lt_sleep(ms2ns(100)) ); | ||
208 | |||
209 | init_rt_task_param(¶ms); | ||
210 | params.cpu = 0; | ||
211 | params.exec_cost = ms2ns(10); | ||
212 | params.period = ms2ns(100); | ||
213 | |||
214 | /* configure parameters of child */ | ||
215 | SYSCALL( set_rt_task_param(child_rt, ¶ms) ); | ||
216 | |||
217 | /* make it a real-time task */ | ||
218 | param.sched_priority = 0; | ||
219 | SYSCALL( sched_setscheduler(child_rt, SCHED_LITMUS, ¶m) ); | ||
220 | |||
221 | /* should be a real-time task now */ | ||
222 | ASSERT( sched_getscheduler(child_rt) == SCHED_LITMUS ); | ||
223 | |||
224 | /* unblock it */ | ||
225 | token = 1234; | ||
226 | ASSERT( write(pipefd[1], &token, sizeof(token)) == sizeof(token) ); | ||
227 | |||
228 | /* wait for child to exit */ | ||
229 | SYSCALL( waitpid(child_rt, &status, 0) ); | ||
230 | ASSERT( status == 0 ); | ||
231 | } | ||