aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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;