aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorRoy Spliet <rspliet@mpi-sws.org>2014-03-17 06:49:40 -0400
committerBjoern Brandenburg <bbb@mpi-sws.org>2014-03-19 05:08:27 -0400
commit5eea6c90c3f71b94ac83c021d783b81dadfc44dd (patch)
treea857d499d9905bfb25412590cf812102c5727ee4 /tests
parent1f323b00f95c4704cdeea7918853f1e9e8d26c2e (diff)
liblitmus/tests: Add PCP-DPCP interleaving test
Diffstat (limited to 'tests')
-rw-r--r--tests/pcp.c106
1 files changed, 104 insertions, 2 deletions
diff --git a/tests/pcp.c b/tests/pcp.c
index 19009a3..ed1920a 100644
--- a/tests/pcp.c
+++ b/tests/pcp.c
@@ -2,11 +2,12 @@
2#include <unistd.h> 2#include <unistd.h>
3#include <stdio.h> 3#include <stdio.h>
4#include <sys/wait.h> /* for waitpid() */ 4#include <sys/wait.h> /* for waitpid() */
5 5#include <sys/mman.h>
6#include <sched.h>
6 7
7#include "tests.h" 8#include "tests.h"
8#include "litmus.h" 9#include "litmus.h"
9 10static int *volatile mutex;
10 11
11TESTCASE(lock_pcp, P_FP, 12TESTCASE(lock_pcp, P_FP,
12 "PCP acquisition and release") 13 "PCP acquisition and release")
@@ -278,6 +279,107 @@ TESTCASE(lock_dpcp, P_FP,
278 SYSCALL( remove(".pcp_locks") ); 279 SYSCALL( remove(".pcp_locks") );
279} 280}
280 281
282TESTCASE(lock_dpcp_pcp, P_FP,
283 "DPCP-PCP interleaved priority")
284{
285 int fd, od_dpcp, od_pcp, child_hi, child_lo, status, waiters, cpu;
286 lt_t delay = ms2ns(100);
287 struct rt_task params;
288 double start;
289
290 /* tasks may not unlock resources they don't own */
291 SYSCALL( be_migrate_to_cpu(2) );
292
293 init_rt_task_param(&params);
294 params.cpu = 0;
295 params.exec_cost = ms2ns(300);
296 params.period = ms2ns(300);
297 params.relative_deadline = params.period;
298 params.phase = 0;
299 params.cls = RT_CLASS_HARD;
300 params.budget_policy = NO_ENFORCEMENT;
301
302 mutex = mmap(NULL, sizeof(*mutex), PROT_READ | PROT_WRITE,
303 MAP_SHARED | MAP_ANONYMOUS, -1, 0);
304 *mutex = 0;
305
306 SYSCALL( fd = open(".pcp_locks", O_RDONLY | O_CREAT, S_IRUSR) );
307
308 child_lo = FORK_TASK(
309 params.priority = LITMUS_LOWEST_PRIORITY;
310 params.phase = ms2ns(50);
311 params.cpu = partition_to_cpu(1);
312
313 SYSCALL( be_migrate_to_cpu(params.cpu) );
314 SYSCALL( init_rt_thread() );
315 SYSCALL( set_rt_task_param(gettid(), &params) );
316 SYSCALL( task_mode(LITMUS_RT_TASK) );
317
318 SYSCALL( od_dpcp = open_dpcp_sem(fd, 0, partition_to_cpu(0)) );
319
320 SYSCALL( wait_for_ts_release() );
321
322 SYSCALL( litmus_lock(od_dpcp) );
323 cpu = sched_getcpu();
324 *mutex = 1;
325 SYSCALL( litmus_unlock(od_dpcp) );
326
327 /* Agent: Have I migrated? */
328 ASSERT( cpu == partition_to_cpu(0) );
329
330 SYSCALL(sleep_next_period() );
331 );
332
333 child_hi = FORK_TASK(
334 int preempted;
335 params.priority = LITMUS_HIGHEST_PRIORITY;
336 params.phase = 0;
337 params.cpu = partition_to_cpu(0);
338
339 SYSCALL( be_migrate_to_cpu(params.cpu) );
340 SYSCALL( init_rt_thread() );
341 SYSCALL( set_rt_task_param(gettid(), &params) );
342 SYSCALL( task_mode(LITMUS_RT_TASK) );
343
344 SYSCALL( od_pcp = open_pcp_sem(fd, 1, params.cpu) );
345
346 SYSCALL( wait_for_ts_release() );
347
348 /* block on semaphore */
349 SYSCALL( litmus_lock(od_pcp) );
350 start = cputime();
351 while (cputime() - start < 0.25)
352 ;
353
354 preempted = *mutex;
355 SYSCALL( litmus_unlock(od_pcp) );
356
357 SYSCALL( od_close(od_pcp) );
358 ASSERT( preempted == 1 );
359
360 SYSCALL( kill(child_lo, SIGUSR2) );
361 );
362
363 do {
364 waiters = get_nr_ts_release_waiters();
365 ASSERT( waiters >= 0 );
366 } while (waiters != 2);
367
368 waiters = release_ts(&delay);
369
370 SYSCALL( waitpid(child_hi, &status, 0) );
371 ASSERT( status == 0 );
372
373 SYSCALL( waitpid(child_lo, &status, 0) );
374 ASSERT( status == SIGUSR2);
375
376 SYSCALL( close(fd) );
377
378 SYSCALL( remove(".pcp_locks") );
379
380 munmap(mutex, sizeof(*mutex));
381}
382
281TESTCASE(not_lock_pcp_be, P_FP, 383TESTCASE(not_lock_pcp_be, P_FP,
282 "don't let best-effort tasks lock (D|M-)PCP semaphores") 384 "don't let best-effort tasks lock (D|M-)PCP semaphores")
283{ 385{