Skip to content

Commit

Permalink
nvmf: duplicate qid retry fix
Browse files Browse the repository at this point in the history
Signed-off-by: Dmitry Savitskiy <[email protected]>
Signed-off-by: Tiago Castro <[email protected]>
  • Loading branch information
dsavitskiy authored and tiagolobocastro committed Oct 14, 2024
1 parent e5f7aa4 commit be50d2e
Showing 1 changed file with 16 additions and 5 deletions.
21 changes: 16 additions & 5 deletions lib/nvmf/ctrlr.c
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@

#define NVMF_CTRLR_RESET_SHN_TIMEOUT_IN_MS (NVMF_CC_RESET_SHN_TIMEOUT_IN_MS + 5000)

#define DUPLICATE_QID_RETRY_US 1000
#define DUPLICATE_QID_RETRY_US 10000

/*
* Report the SPDK version as the firmware revision.
Expand Down Expand Up @@ -302,15 +302,16 @@ nvmf_ctrlr_add_qpair(struct spdk_nvmf_qpair *qpair,

if (spdk_bit_array_get(ctrlr->qpair_mask, qpair->qid)) {
if (qpair->connect_req != NULL) {
SPDK_ERRLOG("Got I/O connect with duplicate QID %u\n", qpair->qid);
SPDK_ERRLOG("Got I/O connect with duplicate QID %u on ctrlr %p [%s]\n",
qpair->qid, ctrlr, ctrlr->hostnqn);
rsp->status.sct = SPDK_NVME_SCT_COMMAND_SPECIFIC;
rsp->status.sc = SPDK_NVME_SC_INVALID_QUEUE_IDENTIFIER;
qpair->connect_req = NULL;
qpair->ctrlr = NULL;
spdk_nvmf_request_complete(req);
} else {
SPDK_WARNLOG("Duplicate QID detected, re-check in %dus\n",
DUPLICATE_QID_RETRY_US);
SPDK_WARNLOG("Duplicate QID %u detected on ctrlr %p [%s], re-check in %dus\n",
qpair->qid, ctrlr, ctrlr->hostnqn, DUPLICATE_QID_RETRY_US);
qpair->connect_req = req;
/* Set qpair->ctrlr here so that we'll have it when the poller expires. */
nvmf_qpair_set_ctrlr(qpair, ctrlr);
Expand All @@ -320,6 +321,15 @@ nvmf_ctrlr_add_qpair(struct spdk_nvmf_qpair *qpair,
return;
}

/* Reset `connect_req` after a retry.
* (Note it shares the union with `first_fused_req`).
*/
if (qpair->connect_req != NULL) {
SPDK_WARNLOG("Added QID %u on ctrlr %p [%s] after duplicate QID retry\n",
qpair->qid, ctrlr, ctrlr->hostnqn);
qpair->connect_req = NULL;
}

SPDK_DTRACE_PROBE4_TICKS(nvmf_ctrlr_add_qpair, qpair, qpair->qid, ctrlr->subsys->subnqn,
ctrlr->hostnqn);
nvmf_qpair_set_ctrlr(qpair, ctrlr);
Expand Down Expand Up @@ -4409,7 +4419,8 @@ nvmf_ctrlr_process_io_cmd(struct spdk_nvmf_request *req)
} else if (spdk_unlikely(req->qpair->first_fused_req != NULL)) {
struct spdk_nvme_cpl *fused_response = &req->qpair->first_fused_req->rsp->nvme_cpl;

SPDK_ERRLOG("Expected second of fused commands - failing first of fused commands\n");
SPDK_ERRLOG("Ctrlr %p [%s]: Expected second of fused commands - failing first of fused commands: qpair id %u\n",
req->qpair->ctrlr, req->qpair->ctrlr ? req->qpair->ctrlr->hostnqn : "<null>", req->qpair->qid);

/* abort req->qpair->first_fused_request and continue with new command */
fused_response->status.sc = SPDK_NVME_SC_ABORTED_MISSING_FUSED;
Expand Down

0 comments on commit be50d2e

Please sign in to comment.