Commit 0801877b authored by Ziye Yang's avatar Ziye Yang Committed by Daniel Verkamp
Browse files

nvmf,direct: add AER support in direct mode.



After checking the code, aerl in our session is 0,
so there will be only 1 AER. So currently,
we will only handle 1 AER case.

When the AER event is triggered by real NVMe device owned
by the subsystem, it notifies all sessions belonging to
the subsystem.

Change-Id: Ia80fb0f03e893c20d8dd14afbed8db10db38301c
Signed-off-by: default avatarZiye Yang <ziye.yang@intel.com>
parent fde30412
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -125,6 +125,7 @@ fi

timing_enter host

run_test test/nvmf/host/aer.sh
run_test test/nvmf/host/identify.sh
run_test test/nvmf/host/perf.sh
run_test test/nvmf/host/identify_kernel_nvmf.sh
+5 −0
Original line number Diff line number Diff line
@@ -84,6 +84,11 @@ struct spdk_nvmf_host {
};

struct spdk_nvmf_ctrlr_ops {
	/**
	 * Set NVMe ctrlr AER.
	 */
	void (*set_aer_callback)(struct spdk_nvmf_subsystem *subsys);

	/**
	 * Get NVMe identify controller data.
	 */
+25 −3
Original line number Diff line number Diff line
@@ -177,9 +177,9 @@ nvmf_direct_ctrlr_process_admin_cmd(struct spdk_nvmf_request *req)
		break;
	case SPDK_NVME_OPC_ASYNC_EVENT_REQUEST:
		SPDK_TRACELOG(SPDK_TRACE_NVMF, "Async Event Request\n");
		/* TODO: Just release the request as consumed. AER events will never
		 * be triggered. */
		return SPDK_NVMF_REQUEST_EXEC_STATUS_RELEASE;
		session->aer_req = req;

		return SPDK_NVMF_REQUEST_EXEC_STATUS_ASYNCHRONOUS;
	case SPDK_NVME_OPC_KEEP_ALIVE:
		SPDK_TRACELOG(SPDK_TRACE_NVMF, "Keep Alive\n");
		/*
@@ -249,7 +249,29 @@ nvmf_direct_ctrlr_detach(struct spdk_nvmf_subsystem *subsystem)
	}
}

static void
nvmf_direct_ctrlr_complete_aer(void *arg, const struct spdk_nvme_cpl *cpl)
{
	struct spdk_nvmf_subsystem *subsystem = (struct spdk_nvmf_subsystem *) arg;
	struct spdk_nvmf_session *session;

	TAILQ_FOREACH(session, &subsystem->sessions, link) {
		if (session->aer_req) {
			nvmf_direct_ctrlr_complete_cmd(session->aer_req, cpl);
			session->aer_req = NULL;
		}
	}
}

static void
nvmf_direct_ctrlr_set_aer_callback(struct spdk_nvmf_subsystem *subsys)
{
	spdk_nvme_ctrlr_register_aer_callback(subsys->dev.direct.ctrlr,
					      nvmf_direct_ctrlr_complete_aer, subsys);
}

const struct spdk_nvmf_ctrlr_ops spdk_nvmf_direct_ctrlr_ops = {
	.set_aer_callback		= nvmf_direct_ctrlr_set_aer_callback,
	.ctrlr_get_data			= nvmf_direct_ctrlr_get_data,
	.process_admin_cmd		= nvmf_direct_ctrlr_process_admin_cmd,
	.process_io_cmd			= nvmf_direct_ctrlr_process_io_cmd,
+1 −0
Original line number Diff line number Diff line
@@ -91,6 +91,7 @@ struct spdk_nvmf_session {
			uint8_t fw_activation_notice : 1;
		} bits;
	} async_event_config;
	struct spdk_nvmf_request *aer_req;
	uint8_t hostid[16];
	const struct spdk_nvmf_transport	*transport;

+2 −0
Original line number Diff line number Diff line
@@ -311,6 +311,8 @@ nvmf_subsystem_add_ctrlr(struct spdk_nvmf_subsystem *subsystem,
		SPDK_ERRLOG("spdk_nvme_ctrlr_alloc_io_qpair() failed\n");
		return -1;
	}

	subsystem->ops->set_aer_callback(subsystem);
	return 0;
}

Loading