nvmf/fc: Handle out of order fused commands.
For FC, Fused commands ordering is not gauranteed but nvmf layer expects strict ordering. FC LLD layer can reorder this out of order commands based on FC header CSN. Introduce a new FUSED_WAITING state that can be used by LLD to keep waiting the out of order data. Signed-off-by: Naresh Gottumukkala <raju.gottumukkala@broadcom.com> Change-Id: I85eba0059f75ff3775f664e85ed2e4dc258d27a6 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/5811 Community-CI: Broadcom CI Community-CI: Mellanox Build Bot Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Reviewed-by: Jim Harris <james.r.harris@intel.com> Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
This commit is contained in:
parent
e3c78a6453
commit
cfc716feb8
@ -84,7 +84,8 @@ static char *fc_req_state_strs[] = {
|
||||
"SPDK_NVMF_FC_REQ_FAILED",
|
||||
"SPDK_NVMF_FC_REQ_ABORTED",
|
||||
"SPDK_NVMF_FC_REQ_BDEV_ABORTED",
|
||||
"SPDK_NVMF_FC_REQ_PENDING"
|
||||
"SPDK_NVMF_FC_REQ_PENDING",
|
||||
"SPDK_NVMF_FC_REQ_FUSED_WAITING"
|
||||
};
|
||||
|
||||
#define OBJECT_NVMF_FC_IO 0xA0
|
||||
@ -105,6 +106,7 @@ static char *fc_req_state_strs[] = {
|
||||
#define TRACE_FC_REQ_ABORTED SPDK_TPOINT_ID(TRACE_GROUP_NVMF_FC, 0x0D)
|
||||
#define TRACE_FC_REQ_BDEV_ABORTED SPDK_TPOINT_ID(TRACE_GROUP_NVMF_FC, 0x0E)
|
||||
#define TRACE_FC_REQ_PENDING SPDK_TPOINT_ID(TRACE_GROUP_NVMF_FC, 0x0F)
|
||||
#define TRACE_FC_REQ_FUSED_WAITING SPDK_TPOINT_ID(TRACE_GROUP_NVMF_FC, 0x10)
|
||||
|
||||
#define HWQP_CONN_TABLE_SIZE 8192
|
||||
#define HWQP_RPI_TABLE_SIZE 4096
|
||||
@ -157,6 +159,9 @@ SPDK_TRACE_REGISTER_FN(nvmf_fc_trace, "nvmf_fc", TRACE_GROUP_NVMF_FC)
|
||||
spdk_trace_register_description("FC_REQ_PENDING",
|
||||
TRACE_FC_REQ_PENDING,
|
||||
OWNER_NONE, OBJECT_NONE, 0, 1, "");
|
||||
spdk_trace_register_description("FC_REQ_FUSED_WAITING",
|
||||
TRACE_FC_REQ_FUSED_WAITING,
|
||||
OWNER_NONE, OBJECT_NONE, 0, 1, "");
|
||||
}
|
||||
|
||||
/**
|
||||
@ -299,6 +304,9 @@ nvmf_fc_record_req_trace_point(struct spdk_nvmf_fc_request *fc_req,
|
||||
case SPDK_NVMF_FC_REQ_PENDING:
|
||||
tpoint_id = TRACE_FC_REQ_PENDING;
|
||||
break;
|
||||
case SPDK_NVMF_FC_REQ_FUSED_WAITING:
|
||||
tpoint_id = TRACE_FC_REQ_FUSED_WAITING;
|
||||
break;
|
||||
default:
|
||||
assert(0);
|
||||
break;
|
||||
@ -1351,6 +1359,9 @@ nvmf_fc_request_abort(struct spdk_nvmf_fc_request *fc_req, bool send_abts,
|
||||
/* Remove from pending */
|
||||
nvmf_fc_request_remove_from_pending(fc_req);
|
||||
goto complete;
|
||||
case SPDK_NVMF_FC_REQ_FUSED_WAITING:
|
||||
TAILQ_REMOVE(&fc_req->fc_conn->fused_waiting_queue, fc_req, fused_link);
|
||||
goto complete;
|
||||
default:
|
||||
SPDK_ERRLOG("Request in invalid state.\n");
|
||||
goto complete;
|
||||
@ -1532,6 +1543,7 @@ nvmf_fc_hwqp_handle_request(struct spdk_nvmf_fc_hwqp *hwqp, struct spdk_nvmf_fc_
|
||||
fc_req->req.xfer = xfer;
|
||||
fc_req->s_id = s_id;
|
||||
fc_req->d_id = d_id;
|
||||
fc_req->csn = from_be32(&cmd_iu->cmnd_seq_num);
|
||||
|
||||
nvmf_fc_record_req_trace_point(fc_req, SPDK_NVMF_FC_REQ_INIT);
|
||||
|
||||
|
@ -355,6 +355,7 @@ nvmf_fc_ls_new_connection(struct spdk_nvmf_fc_association *assoc, uint16_t qid,
|
||||
fc_conn->max_queue_depth = sq_size + 1;
|
||||
fc_conn->conn_state = SPDK_NVMF_FC_OBJECT_CREATED;
|
||||
TAILQ_INIT(&fc_conn->in_use_reqs);
|
||||
TAILQ_INIT(&fc_conn->fused_waiting_queue);
|
||||
|
||||
/* save target port trid in connection (for subsystem
|
||||
* listener validation in fabric connect command)
|
||||
|
@ -104,6 +104,7 @@ enum spdk_nvmf_fc_request_state {
|
||||
SPDK_NVMF_FC_REQ_ABORTED,
|
||||
SPDK_NVMF_FC_REQ_BDEV_ABORTED,
|
||||
SPDK_NVMF_FC_REQ_PENDING,
|
||||
SPDK_NVMF_FC_REQ_FUSED_WAITING,
|
||||
SPDK_NVMF_FC_REQ_MAX_STATE,
|
||||
};
|
||||
|
||||
@ -240,6 +241,8 @@ struct spdk_nvmf_fc_conn {
|
||||
/* number of read/write requests that are outstanding */
|
||||
uint16_t cur_fc_rw_depth;
|
||||
|
||||
TAILQ_HEAD(, spdk_nvmf_fc_request) fused_waiting_queue;
|
||||
|
||||
struct spdk_nvmf_fc_association *fc_assoc;
|
||||
|
||||
uint16_t rpi;
|
||||
@ -376,8 +379,10 @@ struct spdk_nvmf_fc_request {
|
||||
uint32_t magic;
|
||||
uint32_t s_id;
|
||||
uint32_t d_id;
|
||||
uint32_t csn;
|
||||
TAILQ_ENTRY(spdk_nvmf_fc_request) link;
|
||||
TAILQ_ENTRY(spdk_nvmf_fc_request) conn_link;
|
||||
TAILQ_ENTRY(spdk_nvmf_fc_request) fused_link;
|
||||
TAILQ_HEAD(, spdk_nvmf_fc_caller_ctx) abort_cbs;
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user