Skip to content

SCST suspend takes much time on iser target #185

@lvainblat

Description

@lvainblat

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions