aboutsummaryrefslogtreecommitdiffstats
path: root/litmus
diff options
context:
space:
mode:
Diffstat (limited to 'litmus')
-rw-r--r--litmus/reservations/gedf_reservation.c21
1 files changed, 11 insertions, 10 deletions
diff --git a/litmus/reservations/gedf_reservation.c b/litmus/reservations/gedf_reservation.c
index c5dd7032ab42..395852076773 100644
--- a/litmus/reservations/gedf_reservation.c
+++ b/litmus/reservations/gedf_reservation.c
@@ -1165,6 +1165,9 @@ static int gedf_env_omlp_access_fz_check(struct litmus_lock* l, lt_t fz_len, lt_
1165 spin_unlock_irqrestore(&gedf_env->fz_waiters[0].lock, flags); 1165 spin_unlock_irqrestore(&gedf_env->fz_waiters[0].lock, flags);
1166 spin_lock_irqsave(&gedf_env->fz_waiters[cpu].lock, flags); 1166 spin_lock_irqsave(&gedf_env->fz_waiters[cpu].lock, flags);
1167 1167
1168 BUG_ON(!tsk_rt(t)->ctrl_page);
1169 tsk_rt(t)->ctrl_page->fz_progress = FZ_DONE;
1170
1168 /* cancel fz police timer */ 1171 /* cancel fz police timer */
1169 hrtimer_try_to_cancel(&sem->police_timer); 1172 hrtimer_try_to_cancel(&sem->police_timer);
1170 1173
@@ -1173,8 +1176,6 @@ static int gedf_env_omlp_access_fz_check(struct litmus_lock* l, lt_t fz_len, lt_
1173 remaining_component_budget = timeslice_end - litmus_clock(); 1176 remaining_component_budget = timeslice_end - litmus_clock();
1174 1177
1175 if (remaining_component_budget < fz_len) { 1178 if (remaining_component_budget < fz_len) {
1176 if (likely(tsk_rt(t)->ctrl_page))
1177 tsk_rt(t)->ctrl_page->fz_progress = 0;
1178 /* go on a wait queue to be woken up when the parent reservation 1179 /* go on a wait queue to be woken up when the parent reservation
1179 * is next scheduled */ 1180 * is next scheduled */
1180 init_waitqueue_entry(&wait, t); 1181 init_waitqueue_entry(&wait, t);
@@ -1193,8 +1194,6 @@ static int gedf_env_omlp_access_fz_check(struct litmus_lock* l, lt_t fz_len, lt_
1193 } else 1194 } else
1194 spin_unlock_irqrestore(&gedf_env->fz_waiters[cpu].lock, flags); 1195 spin_unlock_irqrestore(&gedf_env->fz_waiters[cpu].lock, flags);
1195 1196
1196 BUG_ON(!tsk_rt(t)->ctrl_page);
1197
1198 tsk_rt(t)->ctrl_page->sched.np.flag = 1; 1197 tsk_rt(t)->ctrl_page->sched.np.flag = 1;
1199 tsk_rt(t)->ctrl_page->fz_progress = FZ_PRE_GPU_LAUNCH; 1198 tsk_rt(t)->ctrl_page->fz_progress = FZ_PRE_GPU_LAUNCH;
1200 hrtimer_start(&sem->police_timer, 1199 hrtimer_start(&sem->police_timer,
@@ -1293,13 +1292,16 @@ static enum hrtimer_restart omlp_fz_police(struct hrtimer *timer)
1293 unsigned long flags; 1292 unsigned long flags;
1294 struct kernel_siginfo info; 1293 struct kernel_siginfo info;
1295 1294
1295 spin_lock_irqsave(&sem->fifo_wait.lock, flags);
1296 if (t != sem->owner) {
1297 spin_unlock_irqrestore(&sem->fifo_wait.lock, flags);
1298 return HRTIMER_NORESTART;
1299 }
1300
1296 BUG_ON(!tsk_rt(t)->ctrl_page); 1301 BUG_ON(!tsk_rt(t)->ctrl_page);
1297 1302
1298 if (tsk_rt(t)->ctrl_page->fz_progress) { 1303 if (tsk_rt(t)->ctrl_page->fz_progress) {
1299 /* we try to unlock for the task that violated fz */ 1304 /* we try to unlock for the task that violated fz */
1300 spin_lock_irqsave(&sem->fifo_wait.lock, flags);
1301
1302 BUG_ON(sem->owner != t);
1303 1305
1304 __gedf_env_omlp_unlock(sem, t); 1306 __gedf_env_omlp_unlock(sem, t);
1305 1307
@@ -1310,11 +1312,10 @@ static enum hrtimer_restart omlp_fz_police(struct hrtimer *timer)
1310 info.si_int = -(int)tsk_rt(t)->ctrl_page->fz_progress; 1312 info.si_int = -(int)tsk_rt(t)->ctrl_page->fz_progress;
1311 send_sig_info(SIGTERM, &info, t); 1313 send_sig_info(SIGTERM, &info, t);
1312 1314
1313 tsk_rt(t)->ctrl_page->fz_progress = FZ_DONE; 1315 //tsk_rt(t)->ctrl_page->fz_progress = FZ_DONE;
1314 tsk_rt(t)->ctrl_page->sched.np.flag = 0; 1316 tsk_rt(t)->ctrl_page->sched.np.flag = 0;
1315
1316 spin_unlock_irqrestore(&sem->fifo_wait.lock, flags);
1317 } 1317 }
1318 spin_unlock_irqrestore(&sem->fifo_wait.lock, flags);
1318 1319
1319 return HRTIMER_NORESTART; 1320 return HRTIMER_NORESTART;
1320} 1321}