diff options
-rw-r--r-- | include/litmus/litmus.h | 6 | ||||
-rw-r--r-- | litmus/sched_gsn_edf.c | 6 | ||||
-rw-r--r-- | litmus/sched_litmus.c | 3 |
3 files changed, 11 insertions, 4 deletions
diff --git a/include/litmus/litmus.h b/include/litmus/litmus.h index 28fb7b331cf3..31ac72eddef7 100644 --- a/include/litmus/litmus.h +++ b/include/litmus/litmus.h | |||
@@ -178,6 +178,7 @@ static inline int take_np(struct task_struct *t) | |||
178 | static inline int request_exit_np_atomic(struct task_struct *t) | 178 | static inline int request_exit_np_atomic(struct task_struct *t) |
179 | { | 179 | { |
180 | union np_flag old, new; | 180 | union np_flag old, new; |
181 | int ok; | ||
181 | 182 | ||
182 | if (tsk_rt(t)->ctrl_page) { | 183 | if (tsk_rt(t)->ctrl_page) { |
183 | old.raw = tsk_rt(t)->ctrl_page->sched.raw; | 184 | old.raw = tsk_rt(t)->ctrl_page->sched.raw; |
@@ -186,17 +187,20 @@ static inline int request_exit_np_atomic(struct task_struct *t) | |||
186 | return 0; | 187 | return 0; |
187 | } else if (old.np.preempt) { | 188 | } else if (old.np.preempt) { |
188 | /* already set, nothing for us to do */ | 189 | /* already set, nothing for us to do */ |
190 | TRACE_TASK(t, "not setting np.preempt flag again\n"); | ||
189 | return 1; | 191 | return 1; |
190 | } else { | 192 | } else { |
191 | /* non preemptive and flag not set */ | 193 | /* non preemptive and flag not set */ |
192 | new.raw = old.raw; | 194 | new.raw = old.raw; |
193 | new.np.preempt = 1; | 195 | new.np.preempt = 1; |
194 | /* if we get old back, then we atomically set the flag */ | 196 | /* if we get old back, then we atomically set the flag */ |
195 | return cmpxchg(&tsk_rt(t)->ctrl_page->sched.raw, old.raw, new.raw) == old.raw; | 197 | ok = cmpxchg(&tsk_rt(t)->ctrl_page->sched.raw, old.raw, new.raw) == old.raw; |
196 | /* If we raced with a concurrent change, then so be | 198 | /* If we raced with a concurrent change, then so be |
197 | * it. Deliver it by IPI. We don't want an unbounded | 199 | * it. Deliver it by IPI. We don't want an unbounded |
198 | * retry loop here since tasks might exploit that to | 200 | * retry loop here since tasks might exploit that to |
199 | * keep the kernel busy indefinitely. */ | 201 | * keep the kernel busy indefinitely. */ |
202 | TRACE_TASK(t, "request_exit_np => %d\n", ok); | ||
203 | return ok; | ||
200 | } | 204 | } |
201 | } else | 205 | } else |
202 | return 0; | 206 | return 0; |
diff --git a/litmus/sched_gsn_edf.c b/litmus/sched_gsn_edf.c index dffea128739f..9debea981419 100644 --- a/litmus/sched_gsn_edf.c +++ b/litmus/sched_gsn_edf.c | |||
@@ -266,8 +266,8 @@ static void check_for_preemptions(void) | |||
266 | last = lowest_prio_cpu()) { | 266 | last = lowest_prio_cpu()) { |
267 | /* preemption necessary */ | 267 | /* preemption necessary */ |
268 | task = __take_ready(&gsnedf); | 268 | task = __take_ready(&gsnedf); |
269 | TRACE("check_for_preemptions: attempting to link task %d to %d\n", | 269 | TRACE_TASK(task, "attempting to link to P%d\n", |
270 | task->pid, last->cpu); | 270 | last->cpu); |
271 | if (last->linked) | 271 | if (last->linked) |
272 | requeue(last->linked); | 272 | requeue(last->linked); |
273 | link_task_to_cpu(task, last); | 273 | link_task_to_cpu(task, last); |
@@ -409,7 +409,7 @@ static struct task_struct* gsnedf_schedule(struct task_struct * prev) | |||
409 | "state:%d sig:%d\n", | 409 | "state:%d sig:%d\n", |
410 | blocks, out_of_time, np, sleep, preempt, | 410 | blocks, out_of_time, np, sleep, preempt, |
411 | prev->state, signal_pending(prev)); | 411 | prev->state, signal_pending(prev)); |
412 | if (entry->linked && preempt) | 412 | if (entry->linked && preempt && !np) |
413 | TRACE_TASK(prev, "will be preempted by %s/%d\n", | 413 | TRACE_TASK(prev, "will be preempted by %s/%d\n", |
414 | entry->linked->comm, entry->linked->pid); | 414 | entry->linked->comm, entry->linked->pid); |
415 | 415 | ||
diff --git a/litmus/sched_litmus.c b/litmus/sched_litmus.c index 0687be0c8a78..faf2312b762e 100644 --- a/litmus/sched_litmus.c +++ b/litmus/sched_litmus.c | |||
@@ -197,6 +197,9 @@ static void yield_task_litmus(struct rq *rq) | |||
197 | TS_SYSCALL_IN_START; | 197 | TS_SYSCALL_IN_START; |
198 | 198 | ||
199 | TS_SYSCALL_OUT_END; | 199 | TS_SYSCALL_OUT_END; |
200 | |||
201 | TRACE_CUR("yields\n"); | ||
202 | |||
200 | BUG_ON(rq->curr != current); | 203 | BUG_ON(rq->curr != current); |
201 | /* sched_yield() is called to trigger delayed preemptions. | 204 | /* sched_yield() is called to trigger delayed preemptions. |
202 | * Thus, mark the current task as needing to be rescheduled. | 205 | * Thus, mark the current task as needing to be rescheduled. |