nvme: Don't pass admin qpair through timeout callback

Instead, pass NULL when an ADMIN command times out.
We don't expose the admin queue to the user.

Change-Id: If0768d329a689f6f7c3734c9d419e680d7378ed1
Signed-off-by: Ben Walker <benjamin.walker@intel.com>
This commit is contained in:
Ben Walker 2017-03-30 09:29:11 -07:00
parent b9feeb03c1
commit ee460db71f
3 changed files with 19 additions and 2 deletions

View File

@ -421,6 +421,8 @@ struct spdk_nvme_qpair;
/**
* Signature for the callback function invoked when a timeout is
* detected on a request.
* For timeouts detected on the admin queue pair, the qpair returned
* here will be NULL.
*/
typedef void (*spdk_nvme_timeout_cb)(void *cb_arg,
struct spdk_nvme_ctrlr *ctrlr,
@ -592,6 +594,7 @@ int spdk_nvme_ctrlr_cmd_get_log_page(struct spdk_nvme_ctrlr *ctrlr,
*
* \param ctrlr NVMe controller to which the command was submitted.
* \param qpair NVMe queue pair to which the command was submitted.
* For admin commands, pass NULL for the qpair.
* \param cid Command ID of the command to abort.
* \param cb_fn Callback function to invoke when the abort has completed.
* \param cb_arg Argument to pass to the callback function.\

View File

@ -399,7 +399,13 @@ spdk_nvme_ctrlr_cmd_abort(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_qpair
int rc;
struct nvme_request *req;
struct spdk_nvme_cmd *cmd;
uint16_t sqid = qpair->id;
uint16_t sqid;
if (qpair) {
sqid = qpair->id;
} else {
sqid = ctrlr->adminq->id; /* 0 */
}
nvme_robust_mutex_lock(&ctrlr->ctrlr_lock);
req = nvme_allocate_request_null(cb_fn, cb_arg);

View File

@ -1823,13 +1823,21 @@ nvme_pcie_qpair_check_timeout(struct spdk_nvme_qpair *qpair)
struct nvme_pcie_qpair *pqpair = nvme_pcie_qpair(qpair);
struct spdk_nvme_ctrlr *ctrlr = qpair->ctrlr;
/* We don't want to expose the admin queue to the user,
* so when we're timing out admin commands set the
* qpair to NULL.
*/
if (qpair == ctrlr->adminq) {
qpair = NULL;
}
t02 = spdk_get_ticks();
TAILQ_FOREACH_SAFE(tr, &pqpair->outstanding_tr, tq_list, tmp) {
if (tr->timed_out) {
continue;
}
if (qpair == ctrlr->adminq &&
if (qpair == NULL &&
tr->req->cmd.opc == SPDK_NVME_OPC_ASYNC_EVENT_REQUEST) {
continue;
}