diff options
Diffstat (limited to 'litmus')
-rw-r--r-- | litmus/reservations/gedf_reservation.c | 21 |
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 | } |