diff options
author | Glenn Elliott <gelliott@cs.unc.edu> | 2013-01-08 18:19:43 -0500 |
---|---|---|
committer | Glenn Elliott <gelliott@cs.unc.edu> | 2013-01-09 18:09:00 -0500 |
commit | 29496770fea3c801553b0dc5a2a8e295e490a915 (patch) | |
tree | 974d2ed0a53be72592383de33bd89f797c5f3ef4 | |
parent | c158b5fbe42dacd34393082b6b8f9f6573ab8c5c (diff) |
Extend non-rt support to sync-releases.
Note that non-rt tasks are released immediately. That is,
the 'delay' provided to the release_ts() system-call is ignored
for non-rt tasks.
Conflicts:
litmus/sync.c
-rw-r--r-- | litmus/sync.c | 32 |
1 files changed, 20 insertions, 12 deletions
diff --git a/litmus/sync.c b/litmus/sync.c index 873b3ffb2e7e..a796c20f0e9f 100644 --- a/litmus/sync.c +++ b/litmus/sync.c | |||
@@ -50,12 +50,14 @@ static long do_wait_for_ts_release(void) | |||
50 | ret = wait_for_completion_interruptible(&wait.completion); | 50 | ret = wait_for_completion_interruptible(&wait.completion); |
51 | 51 | ||
52 | if (!ret) { | 52 | if (!ret) { |
53 | /* Completion succeeded, setup release. */ | 53 | if (is_realtime(current)) { |
54 | litmus->release_at(current, wait.ts_release_time | 54 | /* Completion succeeded, setup release. */ |
55 | + current->rt_param.task_params.phase | 55 | litmus->release_at(current, wait.ts_release_time |
56 | - current->rt_param.task_params.period); | 56 | + current->rt_param.task_params.phase |
57 | /* trigger advance to next job release at the programmed time */ | 57 | - current->rt_param.task_params.period); |
58 | ret = complete_job(); | 58 | /* trigger advance to next job release at the programmed time */ |
59 | ret = complete_job(); | ||
60 | } | ||
59 | } else { | 61 | } else { |
60 | /* We were interrupted, must cleanup list. */ | 62 | /* We were interrupted, must cleanup list. */ |
61 | mutex_lock(&task_release_lock); | 63 | mutex_lock(&task_release_lock); |
@@ -106,6 +108,9 @@ static long do_release_ts(lt_t start) | |||
106 | list_entry(pos, struct ts_release_wait, list); | 108 | list_entry(pos, struct ts_release_wait, list); |
107 | 109 | ||
108 | task_count++; | 110 | task_count++; |
111 | |||
112 | /* RT tasks can be delayed. Non-RT tasks are released | ||
113 | immediately. */ | ||
109 | wait->ts_release_time = start; | 114 | wait->ts_release_time = start; |
110 | complete(&wait->completion); | 115 | complete(&wait->completion); |
111 | } | 116 | } |
@@ -123,10 +128,8 @@ out: | |||
123 | asmlinkage long sys_wait_for_ts_release(void) | 128 | asmlinkage long sys_wait_for_ts_release(void) |
124 | { | 129 | { |
125 | long ret = -EPERM; | 130 | long ret = -EPERM; |
126 | struct task_struct *t = current; | ||
127 | 131 | ||
128 | if (is_realtime(t)) | 132 | ret = do_wait_for_ts_release(); |
129 | ret = do_wait_for_ts_release(); | ||
130 | 133 | ||
131 | return ret; | 134 | return ret; |
132 | } | 135 | } |
@@ -135,16 +138,21 @@ asmlinkage long sys_wait_for_ts_release(void) | |||
135 | 138 | ||
136 | asmlinkage long sys_release_ts(lt_t __user *__delay) | 139 | asmlinkage long sys_release_ts(lt_t __user *__delay) |
137 | { | 140 | { |
138 | long ret; | 141 | long ret = 0; |
139 | lt_t delay; | 142 | lt_t delay = 0; |
140 | lt_t start_time; | 143 | lt_t start_time; |
141 | 144 | ||
142 | /* FIXME: check capabilities... */ | 145 | /* FIXME: check capabilities... */ |
143 | 146 | ||
144 | ret = copy_from_user(&delay, __delay, sizeof(delay)); | 147 | if (__delay) |
148 | ret = copy_from_user(&delay, __delay, sizeof(delay)); | ||
149 | |||
145 | if (ret == 0) { | 150 | if (ret == 0) { |
146 | /* round up to next larger integral millisecond */ | 151 | /* round up to next larger integral millisecond */ |
147 | start_time = ((litmus_clock() / ONE_MS) + 1) * ONE_MS; | 152 | start_time = ((litmus_clock() / ONE_MS) + 1) * ONE_MS; |
153 | |||
154 | /* Note: Non-rt tasks that participate in a sync release cannot be | ||
155 | delayed. They will be released immediately. */ | ||
148 | ret = do_release_ts(start_time + delay); | 156 | ret = do_release_ts(start_time + delay); |
149 | } | 157 | } |
150 | 158 | ||