4249 ilu->ilu_flags |= ILU_STALL_DEREGISTER;
4250 mutex_exit(&stmf_state.stmf_lock);
4251 stmf_task_lu_check_freelist(ilu);
4252 /*
4253 * we do not care about the accuracy of
4254 * ilu_ntasks_min_free, so we don't lock here
4255 */
4256 ilu->ilu_ntasks_min_free = ilu->ilu_ntasks_free;
4257 mutex_enter(&stmf_state.stmf_lock);
4258 ilu->ilu_flags &= ~ILU_STALL_DEREGISTER;
4259 cv_broadcast(&stmf_state.stmf_cv);
4260 if (ddi_get_lbolt() >= endtime)
4261 break;
4262 }
4263 }
4264
4265 void
4266 stmf_do_ilu_timeouts(stmf_i_lu_t *ilu)
4267 {
4268 clock_t l = ddi_get_lbolt();
4269 clock_t ps = drv_usectohz(1000000);
4270 stmf_i_scsi_task_t *itask;
4271 scsi_task_t *task;
4272 uint32_t to;
4273
4274 mutex_enter(&ilu->ilu_task_lock);
4275 for (itask = ilu->ilu_tasks; itask != NULL;
4276 itask = itask->itask_lu_next) {
4277 if (itask->itask_flags & (ITASK_IN_FREE_LIST |
4278 ITASK_BEING_ABORTED)) {
4279 continue;
4280 }
4281 task = itask->itask_task;
4282 if (task->task_timeout == 0)
4283 to = stmf_default_task_timeout;
4284 else
4285 to = task->task_timeout;
4286 if ((itask->itask_start_time + (to * ps)) > l)
4287 continue;
4288 stmf_abort(STMF_QUEUE_TASK_ABORT, task,
4289 STMF_TIMEOUT, NULL);
|
4249 ilu->ilu_flags |= ILU_STALL_DEREGISTER;
4250 mutex_exit(&stmf_state.stmf_lock);
4251 stmf_task_lu_check_freelist(ilu);
4252 /*
4253 * we do not care about the accuracy of
4254 * ilu_ntasks_min_free, so we don't lock here
4255 */
4256 ilu->ilu_ntasks_min_free = ilu->ilu_ntasks_free;
4257 mutex_enter(&stmf_state.stmf_lock);
4258 ilu->ilu_flags &= ~ILU_STALL_DEREGISTER;
4259 cv_broadcast(&stmf_state.stmf_cv);
4260 if (ddi_get_lbolt() >= endtime)
4261 break;
4262 }
4263 }
4264
4265 void
4266 stmf_do_ilu_timeouts(stmf_i_lu_t *ilu)
4267 {
4268 clock_t l = ddi_get_lbolt();
4269 clock_t ps = drv_sectohz(1);
4270 stmf_i_scsi_task_t *itask;
4271 scsi_task_t *task;
4272 uint32_t to;
4273
4274 mutex_enter(&ilu->ilu_task_lock);
4275 for (itask = ilu->ilu_tasks; itask != NULL;
4276 itask = itask->itask_lu_next) {
4277 if (itask->itask_flags & (ITASK_IN_FREE_LIST |
4278 ITASK_BEING_ABORTED)) {
4279 continue;
4280 }
4281 task = itask->itask_task;
4282 if (task->task_timeout == 0)
4283 to = stmf_default_task_timeout;
4284 else
4285 to = task->task_timeout;
4286 if ((itask->itask_start_time + (to * ps)) > l)
4287 continue;
4288 stmf_abort(STMF_QUEUE_TASK_ABORT, task,
4289 STMF_TIMEOUT, NULL);
|