aboutsummaryrefslogtreecommitdiffstats
path: root/litmus
diff options
context:
space:
mode:
authorBjoern Brandenburg <bbb@mpi-sws.org>2016-07-20 11:41:05 -0400
committerBjoern Brandenburg <bbb@mpi-sws.org>2016-07-20 11:46:36 -0400
commit4c8cb1fa2ee076fc6d2ab8cdfbe8482202bff2e4 (patch)
treebe4d74ac3e16f996ddb94747d7ec5bd97a2d09fa /litmus
parentbbef912ffe78f50d2df598939c0aee2bcfb663d9 (diff)
LITMUS^RT core: add generic handler for sporadic job arrivals
In particular, check if a job arrival is triggered from a clock_nanosleep() call.
Diffstat (limited to 'litmus')
-rw-r--r--litmus/jobs.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/litmus/jobs.c b/litmus/jobs.c
index 250ee8dfd68b..1c700f9acd24 100644
--- a/litmus/jobs.c
+++ b/litmus/jobs.c
@@ -58,6 +58,27 @@ void release_at(struct task_struct *t, lt_t start)
58 tsk_rt(t)->completed = 0; 58 tsk_rt(t)->completed = 0;
59} 59}
60 60
61void inferred_sporadic_job_release_at(struct task_struct *t, lt_t when)
62{
63 /* new sporadic release */
64 sched_trace_last_suspension_as_completion(t);
65 /* check if this task is resuming from a clock_nanosleep() call */
66 if (tsk_rt(t)->doing_abs_nanosleep &&
67 lt_after_eq(tsk_rt(t)->nanosleep_wakeup,
68 get_release(t) + get_rt_period(t))) {
69 /* clock_nanosleep() is supposed to wake up the task
70 * at a time that is a valid release time. Use that time
71 * rather than guessing the intended release time from the
72 * current time. */
73 TRACE_TASK(t, "nanosleep: backdating release "
74 "to %llu instead of %llu\n",
75 tsk_rt(t)->nanosleep_wakeup, when);
76 when = tsk_rt(t)->nanosleep_wakeup;
77 }
78 release_at(t, when);
79 sched_trace_task_release(t);
80}
81
61long default_wait_for_release_at(lt_t release_time) 82long default_wait_for_release_at(lt_t release_time)
62{ 83{
63 struct task_struct *t = current; 84 struct task_struct *t = current;