diff options
Diffstat (limited to 'litmus')
-rw-r--r-- | litmus/jobs.c | 21 |
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 | ||
61 | void 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 | |||
61 | long default_wait_for_release_at(lt_t release_time) | 82 | long default_wait_for_release_at(lt_t release_time) |
62 | { | 83 | { |
63 | struct task_struct *t = current; | 84 | struct task_struct *t = current; |