Commit ee460db7 authored by Ben Walker's avatar Ben Walker
Browse files

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: default avatarBen Walker <benjamin.walker@intel.com>
parent b9feeb03
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -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.\
+7 −1
Original line number Diff line number Diff line
@@ -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);
+9 −1
Original line number Diff line number Diff line
@@ -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;
		}