From 4ffefb822b9d65d4efbedb60e3c9a0e76895cc5b Mon Sep 17 00:00:00 2001 From: Jonathan Herman Date: Fri, 12 Apr 2013 15:17:26 -0400 Subject: Changed completion flag use to remove race condition in Cedf,Gedf. --- litmus/sync.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) (limited to 'litmus/sync.c') diff --git a/litmus/sync.c b/litmus/sync.c index 3e79e0a12a5a..88a050e10ee7 100644 --- a/litmus/sync.c +++ b/litmus/sync.c @@ -50,12 +50,20 @@ static long do_wait_for_ts_release(void) ret = wait_for_completion_interruptible(&wait.completion); if (!ret) { + /* Setting this flag before releasing ensures that this CPU + * will be the next CPU to requeue the task on a ready or + * release queue. + */ + tsk_rt(current)->completed = 1; + mb(); + /* Completion succeeded, setup release. */ litmus->release_at(current, wait.ts_release_time + current->rt_param.task_params.phase - current->rt_param.task_params.period); - /* trigger advance to next job release at the programmed time */ - ret = complete_job(); + + schedule(); + ret = 0; } else { /* We were interrupted, must cleanup list. */ mutex_lock(&task_release_lock); -- cgit v1.2.2