diff options
| -rw-r--r-- | include/litmus/jobs.h | 2 | ||||
| -rw-r--r-- | litmus/jobs.c | 21 |
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 @@ | |||
| 4 | void prepare_for_next_period(struct task_struct *t); | 4 | void prepare_for_next_period(struct task_struct *t); |
| 5 | void release_at(struct task_struct *t, lt_t start); | 5 | void release_at(struct task_struct *t, lt_t start); |
| 6 | 6 | ||
| 7 | void inferred_sporadic_job_release_at(struct task_struct *t, lt_t when); | ||
| 8 | |||
| 7 | long default_wait_for_release_at(lt_t release_time); | 9 | long default_wait_for_release_at(lt_t release_time); |
| 8 | long complete_job(void); | 10 | long complete_job(void); |
| 9 | long complete_job_oneshot(void); | 11 | long 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 | ||
| 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; |
