scsi: qedf: Cleanup rrq_work after QEDF_CMD_OUTSTANDING is cleared
Here is the relevant logs for the problem we are solving: qedf_flush_active_ios:1707]:3: Flush active i/o's num=0x17 fcport=0xffff948168fbcc80 port_id=0x550200 scsi_id=0. qedf_flush_active_ios:1708]:3: Locking flush mutex. qedf_flush_active_ios:1758]:3: Not outstanding, xid=0xaaf, cmd_type=3 refcount=1. qedf_flush_active_ios:1896]:3: Flushed 0x16 I/Os, active=0x1. qedf_flush_active_ios:1901]:3: Flushed 0x16 I/Os, active=0x1 cnt=60. qedf_send_rrq:295]:3: Sending RRQ orig io = ffffb48b8f7d7158, orig_xid = 0xaaf qedf_initiate_els:37]:3: Sending ELS qedf_initiate_els:68]:3: initiate_els els_req = 0xffffb48b8f6d3098 cb_arg = ffff948fd5e4de80 xid = 4c6 qedf_init_mp_req:2172]:3: Entered. qedf_init_mp_task:727]:3: Initializing MP task for cmd_type=4 qedf_initiate_els:134]:3: Ringing doorbell for ELS req qedf_flush_active_ios:1901]:3: Flushed 0x16 I/Os, active=0x2 cnt=20. qedf_cmd_timeout:96]:3: ELS timeout, xid=0x4c6. qedf_rrq_compl:186]:3: Entered. qedf_rrq_compl:204]:3: rrq_compl: orig io = ffffb48b8f7d7158, orig xid = 0xaaf, rrq_xid = 0x4c6, refcount=1 qedf_flush_active_ios:1935]:3: Unlocking flush mutex. qedf_upload_connection:1579]:3: Uploading connection port_id=550200. We found an ABTS command for which CMD_OUTSTANDING was cleared (line 3). For this command, delayed send_rrq was queued, but would take 10 secs to execute. Adding capability to detect that (based on io_req->state that is being introduced), and attempt to cancel rrq_work. If we succeed, we drop the reference and free the io_req. If we cannot, then the els will get sent out and we will wait for 10 secs for it to complete. Signed-off-by: Shyam Sundar <ssundar@marvell.com> Signed-off-by: Saurav Kashyap <skashyap@marvell.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:

committed by
Martin K. Petersen

parent
f2c98af4a2
commit
faea5719d3
@@ -119,9 +119,26 @@ struct qedf_ioreq {
|
||||
u8 io_req_flags;
|
||||
uint8_t tm_flags;
|
||||
struct qedf_rport *fcport;
|
||||
#define QEDF_CMD_ST_INACTIVE 0
|
||||
#define QEDFC_CMD_ST_IO_ACTIVE 1
|
||||
#define QEDFC_CMD_ST_ABORT_ACTIVE 2
|
||||
#define QEDFC_CMD_ST_ABORT_ACTIVE_EH 3
|
||||
#define QEDFC_CMD_ST_CLEANUP_ACTIVE 4
|
||||
#define QEDFC_CMD_ST_CLEANUP_ACTIVE_EH 5
|
||||
#define QEDFC_CMD_ST_RRQ_ACTIVE 6
|
||||
#define QEDFC_CMD_ST_RRQ_WAIT 7
|
||||
#define QEDFC_CMD_ST_OXID_RETIRE_WAIT 8
|
||||
#define QEDFC_CMD_ST_TMF_ACTIVE 9
|
||||
#define QEDFC_CMD_ST_DRAIN_ACTIVE 10
|
||||
#define QEDFC_CMD_ST_CLEANED 11
|
||||
#define QEDFC_CMD_ST_ELS_ACTIVE 12
|
||||
atomic_t state;
|
||||
unsigned long flags;
|
||||
enum qedf_ioreq_event event;
|
||||
size_t data_xfer_len;
|
||||
/* ID: 001: Alloc cmd (qedf_alloc_cmd) */
|
||||
/* ID: 002: Initiate ABTS (qedf_initiate_abts) */
|
||||
/* ID: 003: For RRQ (qedf_process_abts_compl) */
|
||||
struct kref refcount;
|
||||
struct qedf_cmd_mgr *cmd_mgr;
|
||||
struct io_bdt *bd_tbl;
|
||||
|
Reference in New Issue
Block a user