aboutsummaryrefslogtreecommitdiffstats
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
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.
-rw-r--r--include/litmus/jobs.h2
-rw-r--r--litmus/jobs.c21
2 files changed, 23 insertions, 0 deletions
diff --git a/include/litmus/jobs.h b/include/litmus/jobs.h
index 1770e21b97c9..7033393148df 100644
--- a/include/litmus/jobs.h
+++ b/include/litmus/jobs.h
@@ -4,6 +4,8 @@
4void prepare_for_next_period(struct task_struct *t); 4void prepare_for_next_period(struct task_struct *t);
5void release_at(struct task_struct *t, lt_t start); 5void release_at(struct task_struct *t, lt_t start);
6 6
7void inferred_sporadic_job_release_at(struct task_struct *t, lt_t when);
8
7long default_wait_for_release_at(lt_t release_time); 9long default_wait_for_release_at(lt_t release_time);
8long complete_job(void); 10long complete_job(void);
9long complete_job_oneshot(void); 11long complete_job_oneshot(void);
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;