/* litmus/jobs.c - common job control code */ #include #include #include //static inline void setup_release(struct task_struct *t, lt_t release) void setup_release(struct task_struct *t, lt_t release) { /* prepare next release */ t->rt_param.job_params.release = release; t->rt_param.job_params.deadline = release + get_rt_relative_deadline(t); t->rt_param.job_params.exec_time = 0; /* kludge - TODO: Move this to budget.h/.c */ if (t->rt_param.budget.ops) bt_flags_reset(t); /* update job sequence number */ t->rt_param.job_params.job_no++; /* don't confuse Linux */ t->rt.time_slice = 1; TRACE_TASK(t, "preparing for next job: %d\n", t->rt_param.job_params.job_no); } void prepare_for_next_period(struct task_struct *t) { BUG_ON(!t); /* Record lateness before we set up the next job's * release and deadline. Lateness may be negative. */ t->rt_param.job_params.lateness = (long long)litmus_clock() - (long long)t->rt_param.job_params.deadline; setup_release(t, get_release(t) + get_rt_period(t)); } void release_at(struct task_struct *t, lt_t start) { BUG_ON(!t); setup_release(t, start); t->rt_param.completed = 0; } /* * Deactivate current task until the beginning of the next period. */ long complete_job(void) { /* Mark that we do not excute anymore */ tsk_rt(current)->completed = 1; /* call schedule, this will return when a new job arrives * it also takes care of preparing for the next release */ schedule(); return 0; } #if defined(CONFIG_REALTIME_AUX_TASKS) || defined(CONFIG_LITMUS_NVIDIA) void hide_from_workers(struct task_struct *t, worker_visibility_t *wv) { #ifdef CONFIG_REALTIME_AUX_TASKS if (tsk_rt(t)->has_aux_tasks) { if (wv) { wv->aux_hide = tsk_rt(t)->hide_from_aux_tasks; wv->do_aux_restore = 1; } tsk_rt(t)->hide_from_aux_tasks = 1; } #endif #ifdef CONFIG_LITMUS_NVIDIA if (tsk_rt(t)->held_gpus) { if (wv) { wv->gpu_hide = tsk_rt(t)->hide_from_gpu; wv->do_gpu_restore = 1; } tsk_rt(t)->hide_from_gpu = 1; } #endif } void show_to_workers(struct task_struct *t, worker_visibility_t *wv) { if (wv) { #ifdef CONFIG_REALTIME_AUX_TASKS if (wv->do_aux_restore) tsk_rt(t)->hide_from_aux_tasks = wv->aux_hide; #endif #ifdef CONFIG_LITMUS_NVIDIA if (wv->do_gpu_restore) tsk_rt(t)->hide_from_gpu = wv->gpu_hide; #endif } else { #ifdef CONFIG_REALTIME_AUX_TASKS if (tsk_rt(t)->has_aux_tasks) tsk_rt(t)->hide_from_aux_tasks = 0; #endif #ifdef CONFIG_LITMUS_NVIDIA if (tsk_rt(t)->held_gpus) tsk_rt(t)->hide_from_gpu = 0; #endif } } #endif