From 54ab0e29794e9f22aacd206102d9e4d643e28efe Mon Sep 17 00:00:00 2001 From: Bjoern Brandenburg Date: Thu, 12 Jun 2014 13:32:21 +0200 Subject: Add test cases for enforcement of periods of periodic tasks --- tests/sched.c | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) (limited to 'tests') diff --git a/tests/sched.c b/tests/sched.c index 6fd6d89..a91e736 100644 --- a/tests/sched.c +++ b/tests/sched.c @@ -1,6 +1,7 @@ #include /* for waitpid() */ #include #include +#include #include "tests.h" #include "litmus.h" @@ -76,4 +77,86 @@ TESTCASE(preempt_on_resume, P_FP | PSN_EDF, ASSERT( status == SIGUSR2); } +#define PERIOD 100 /* in ms */ +#define JOBS 10 +#define ACCEPTABLE_MARGIN 5 /* in ms --- must be largish for QEMU */ +TESTCASE(jobs_are_rate_limited, LITMUS, + "periodic jobs are rate-limited (w/o synchronous release)") +{ + struct rt_task params; + double start, end, actual_delta_ms; + int i; + + init_rt_task_param(¶ms); + params.cpu = 0; + params.exec_cost = ms2ns(40); + params.period = ms2ns(PERIOD); + params.release_policy = TASK_PERIODIC; + + SYSCALL( set_rt_task_param(gettid(), ¶ms) ); + SYSCALL( be_migrate_to_cpu(params.cpu) ); + SYSCALL( task_mode(LITMUS_RT_TASK) ); + + start = wctime(); + for (i = 0; i < JOBS; i++) + SYSCALL( sleep_next_period() ); + end = wctime(); + + SYSCALL( task_mode(BACKGROUND_TASK) ); + + actual_delta_ms = (end - start) * 1000.0; + if (fabs(JOBS * PERIOD - actual_delta_ms) > ACCEPTABLE_MARGIN) + fprintf(stderr, "actual_delta_ms:%.4f expected:%.4f\n", + actual_delta_ms, (double) (JOBS * PERIOD)); + ASSERT( fabs(JOBS * PERIOD - actual_delta_ms) <= ACCEPTABLE_MARGIN); +} + +TESTCASE(jobs_are_rate_limited_synch, LITMUS, + "periodic jobs are rate-limited (w/ synchronous release)") +{ + struct rt_task params; + double start, end, actual_delta_ms; + int i; + int child, status, waiters; + lt_t delay = ms2ns(100); + + child = FORK_TASK( + init_rt_task_param(¶ms); + params.cpu = 0; + params.exec_cost = ms2ns(5); + params.period = ms2ns(PERIOD); + params.release_policy = TASK_PERIODIC; + + SYSCALL( set_rt_task_param(gettid(), ¶ms) ); + SYSCALL( be_migrate_to_cpu(params.cpu) ); + SYSCALL( task_mode(LITMUS_RT_TASK) ); + + SYSCALL( wait_for_ts_release() ); + + start = wctime(); + for (i = 0; i < JOBS; i++) + SYSCALL( sleep_next_period() ); + end = wctime(); + + SYSCALL( task_mode(BACKGROUND_TASK) ); + + actual_delta_ms = (end - start) * 1000.0; + if (fabs(JOBS * PERIOD - actual_delta_ms) > ACCEPTABLE_MARGIN) + fprintf(stderr, "actual_delta_ms:%.4f expected:%.4f\n", + actual_delta_ms, (double) (JOBS * PERIOD)); + ASSERT( fabs(JOBS * PERIOD - actual_delta_ms) <= ACCEPTABLE_MARGIN); + ); + + do { + waiters = get_nr_ts_release_waiters(); + ASSERT( waiters >= 0 ); + } while (waiters != 1); + + waiters = release_ts(&delay); + + + /* wait for child to exit */ + SYSCALL( waitpid(child, &status, 0) ); + ASSERT( status == 0 ); +} -- cgit v1.2.2