Commit 2e550d51 authored by Daniel Verkamp's avatar Daniel Verkamp
Browse files

nvmf: factor out RDMA-specific request completion



Move toward making request.c transport agnostic.

Change-Id: I25fbe74fff21a5c23138e1a6e2d40bc6a4a984ec
Signed-off-by: default avatarDaniel Verkamp <daniel.verkamp@intel.com>
parent e067f330
Loading
Loading
Loading
Loading
+38 −7
Original line number Diff line number Diff line
@@ -326,13 +326,13 @@ nvmf_post_rdma_read(struct spdk_nvmf_conn *conn,
	return (rc);
}

int
static int
nvmf_post_rdma_write(struct spdk_nvmf_conn *conn,
		     struct nvme_qp_tx_desc *tx_desc)
		     struct nvmf_request *req)
{
	struct ibv_send_wr wr, *bad_wr = NULL;
	struct nvme_qp_rx_desc *rx_desc = tx_desc->req_state.rx_desc;
	struct nvmf_request *req = &tx_desc->req_state;
	struct nvme_qp_tx_desc *tx_desc = req->tx_desc;
	struct nvme_qp_rx_desc *rx_desc = req->rx_desc;
	int rc;

	if (rx_desc == NULL) {
@@ -354,12 +354,12 @@ nvmf_post_rdma_write(struct spdk_nvmf_conn *conn,
	return (rc);
}

int
static int
nvmf_post_rdma_send(struct spdk_nvmf_conn *conn,
		    struct nvme_qp_tx_desc *tx_desc)
		    struct nvmf_request *req)
{
	struct ibv_send_wr wr, *bad_wr = NULL;
	struct nvmf_request *req = &tx_desc->req_state;
	struct nvme_qp_tx_desc *tx_desc = req->tx_desc;
	struct nvme_qp_rx_desc *rx_desc = req->rx_desc;
	int rc;

@@ -388,6 +388,37 @@ nvmf_post_rdma_send(struct spdk_nvmf_conn *conn,
	return (rc);
}

int
spdk_nvmf_rdma_request_complete(struct spdk_nvmf_conn *conn, struct nvmf_request *req)
{
	struct nvme_qp_tx_desc *tx_desc = req->tx_desc;
	struct spdk_nvme_cpl *rsp = &req->rsp->nvme_cpl;
	int ret;

	/* Was the command successful? */
	if (rsp->status.sc == SPDK_NVME_SC_SUCCESS &&
	    req->xfer == SPDK_NVME_DATA_CONTROLLER_TO_HOST) {
		/* Need to transfer data via RDMA Write */
		ret = nvmf_post_rdma_write(conn, req);
		if (ret) {
			SPDK_ERRLOG("Unable to post rdma write tx descriptor\n");
			goto command_fail;
		}
	}

	ret = nvmf_post_rdma_send(conn, req);
	if (ret) {
		SPDK_ERRLOG("Unable to send response capsule\n");
		goto command_fail;
	}

	return 0;

command_fail:
	nvmf_deactive_tx_desc(tx_desc);
	return -1;
}

int
nvmf_post_rdma_recv(struct spdk_nvmf_conn *conn,
		    struct nvme_qp_rx_desc *rx_desc)
+2 −4
Original line number Diff line number Diff line
@@ -81,12 +81,10 @@ struct nvme_qp_tx_desc {

int nvmf_post_rdma_read(struct spdk_nvmf_conn *conn,
			struct nvmf_request *req);
int nvmf_post_rdma_write(struct spdk_nvmf_conn *conn,
			 struct nvme_qp_tx_desc *tx_desc);
int nvmf_post_rdma_recv(struct spdk_nvmf_conn *conn,
			struct nvme_qp_rx_desc *rx_desc);
int nvmf_post_rdma_send(struct spdk_nvmf_conn *conn,
			struct nvme_qp_tx_desc *tx_desc);
int spdk_nvmf_rdma_request_complete(struct spdk_nvmf_conn *conn,
				    struct nvmf_request *req);
int nvmf_process_pending_rdma(struct spdk_nvmf_conn *conn);
int nvmf_rdma_init(void);
void nvmf_rdma_conn_cleanup(struct spdk_nvmf_conn *conn);
+7 −29
Original line number Diff line number Diff line
@@ -50,29 +50,13 @@
int
spdk_nvmf_request_complete(struct nvmf_request *req)
{
	struct nvme_qp_tx_desc *tx_desc = req->tx_desc;
	struct spdk_nvme_cpl *response;
	int ret;

	response = &req->rsp->nvme_cpl;

	/* Was the command successful */
	if (response->status.sc == SPDK_NVME_SC_SUCCESS &&
	    req->xfer == SPDK_NVME_DATA_CONTROLLER_TO_HOST) {
		/* data to be copied to host via memory RDMA */
		ret = nvmf_post_rdma_write(tx_desc->conn, tx_desc);
		if (ret) {
			SPDK_ERRLOG("Unable to post rdma write tx descriptor\n");
			goto command_fail;
		}
	}
	struct spdk_nvme_cpl *response = &req->rsp->nvme_cpl;

	/* Now send back the response */
	SPDK_TRACELOG(SPDK_TRACE_DEBUG, "send nvme cmd capsule response\n");

	response->sqid = 0;
	response->status.p = 0;
	response->sqhd = tx_desc->conn->sq_head;
	response->sqhd = req->conn->sq_head;
	response->cid = req->cid;

	SPDK_TRACELOG(SPDK_TRACE_NVMF,
@@ -80,17 +64,12 @@ spdk_nvmf_request_complete(struct nvmf_request *req)
		      response->cdw0, response->rsvd1, response->sqhd, response->sqid, response->cid,
		      *(uint16_t *)&response->status);

	ret = nvmf_post_rdma_send(tx_desc->conn, req->tx_desc);
	if (ret) {
		SPDK_ERRLOG("Unable to send aq qp tx descriptor\n");
		goto command_fail;
	if (spdk_nvmf_rdma_request_complete(req->conn, req)) {
		SPDK_ERRLOG("Transport request completion error!\n");
		return -1;
	}

	return ret;

command_fail:
	nvmf_deactive_tx_desc(tx_desc);
	return ret;
	return 0;
}

static int
@@ -658,8 +637,7 @@ spdk_nvmf_request_prep_data(struct nvmf_request *req,
			    void *in_cap_data, uint32_t in_cap_len,
			    void *bb, uint32_t bb_len)
{
	struct nvme_qp_tx_desc *tx_desc = req->tx_desc;
	struct spdk_nvmf_conn *conn = tx_desc->conn;
	struct spdk_nvmf_conn *conn = req->conn;
	struct spdk_nvme_cmd *cmd = &req->cmd->nvme_cmd;
	enum spdk_nvme_data_transfer xfer;
	int ret;