-
Notifications
You must be signed in to change notification settings - Fork 51
Description
isert-scst has a dedicated workqueue where RDMA completion handler (isert_cq_comp_work_cb) runs. New commands arrive to isert_cq_comp_work_cb() that eventually checks (in scst_translate_lun()) if SCST is suspended:
isert_cq_comp_work_cb ->
isert_poll_cq ->
isert_pdu_rx ->
cmnd_rx_start ->
scsi_cmnd_start ->
scst_cmd_init_stage1_done ->
scst_cmd_init_done ->
scst_init_cmd ->
__scst_init_cmd ->
scst_translate_lun
If SCST is suspended, scst_init_cmd() sleeps 50ms in order to "keep initiator away from too many BUSY commands".
The problem is that this sleep sticks the workqueue thread, that is responsible also to complete "old" requests, that were received before scst_suspend_activity(). As a result suspend itself may take much time, because "old" commands do not get thread context to be finished.
For example in my environment with ~80 outstanding commands suspend takes ~3sec. If I comment out msleep(50) in scst_init_cmd(), it takes just ~100ms.