int main(int argc, char *argv[]) { int nrun = 0; pid_t tid; struct timespec next; struct sched_param2 param2; int runtime_ns = 20*1000*1000; int period_ns = 100*1000*1000; struct timespec t; tid = getpid(); t.tv_sec = 0; t.tv_nsec = period_ns; param2.sched_priority = 0; param2.sched_runtime = runtime_ns; param2.sched_deadline = param2.sched_period = period_ns; if (sched_setscheduler2(tid, SCHED_DEADLINE, ¶m2) < 0) { perror("scheduler"); exit(1); } clock_gettime(CLOCK_MONOTONIC, &next); next.tv_sec++; while (1) { // clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &next, NULL); nrun++; // printf("task: running cycle %d\n", nrun); next.tv_sec ++; } }
void *t_1(void *thread_params) { struct sched_param2 dl_params; struct timespec t_next, t_period, t_start, t_stop, ran_for, t_now, t_crit, t_exec; long tid = gettid(); int retval, i; cpu_set_t mask; __u64 crit, run1, runtime, deadline, period; /* * t_1 should go in budget overflow while in critical section */ run1 = 8U * NSEC_PER_MSEC; crit = 12U * NSEC_PER_MSEC; runtime = run1 + crit + (8U * NSEC_PER_MSEC); deadline = 40U * NSEC_PER_MSEC; period = deadline; t_period = nsec_to_timespec(&period); t_crit = nsec_to_timespec(&crit); signal(SIGHUP, sighandler); signal(SIGINT, sighandler); signal(SIGQUIT, sighandler); CPU_ZERO(&mask); CPU_SET(0, &mask); retval = sched_setaffinity(0, sizeof(mask), &mask); if (retval) { fprintf(stderr, "WARNING: could not set task affinity\n"); exit(-1); } memset(&dl_params, 0, sizeof(dl_params)); dl_params.sched_priority = 0; dl_params.sched_runtime = runtime; dl_params.sched_deadline = deadline; dl_params.sched_period = period; ftrace_write(marker_fd, "[thread %ld (t_1)]: setting rt=%llums dl=%llums\n", tid, runtime/NSEC_PER_MSEC, deadline/NSEC_PER_MSEC); retval = sched_setscheduler2(0, SCHED_DEADLINE, &dl_params); if (retval) { fprintf(stderr, "WARNING: could not set SCHED_DEADLINE" " policy!\n"); exit(-1); } clock_gettime(CLOCK_MONOTONIC, &t_next); for (i = 0; i < NRUN; i++) { ftrace_write(marker_fd, "[t_1] run starts\n"); clock_gettime(CLOCK_MONOTONIC, &t_start); ftrace_write(marker_fd, "[t_1] exec for %lluns\n", run1); busywait(run1); ftrace_write(marker_fd, "[t_1] locks mutex\n"); pthread_mutex_lock(&my_mutex); ftrace_write(marker_fd, "[t_1] exec for %lluns\n", crit); busywait(crit); ftrace_write(marker_fd, "[t_1] unlocks mutex\n"); pthread_mutex_unlock(&my_mutex); clock_gettime(CLOCK_MONOTONIC, &t_stop); t_next = timespec_add(&t_next, &t_period); ran_for = timespec_sub(&t_stop, &t_start); printf("[thread %ld]: run %d for %lluus\n", tid, i, timespec_to_usec(&ran_for)); ftrace_write(marker_fd, "[t_1] run ends\n"); clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &t_next, NULL); } retval = sched_setscheduler2(0, SCHED_OTHER, &dl_params); if (retval) { fprintf(stderr, "WARNING: could not set SCHED_OTHER" "policy!\n"); exit(-1); } }