SPDK-nvmf与不同传输类型的公共接口
SPDK-nvmf与不同传输类型的公共接口
不同类型的传输层到nvmf的公共命令请求接口
nvmf_fc_hwqp_handle_request() -->cmd_iu = buffer->virt; /* struct spdk_nvmf_request req所用内存已经在struct spdk_nvmf_fc_request结构体中申请*/ -->fc_req = nvmf_fc_hwqp_alloc_fc_request(hwqp); -->fc_req->req.qpair = &fc_conn->qpair; /*qpair的id为0时表示Admin队列*/ -->nvmf_fc_request_execute(fc_req) /* 接收数据和处理纯命令分开 */ -->nvmf_fc_recv_data(fc_req); /* 接收数据 */ -->spdk_nvmf_request_exec(&fc_req->req); /* 处理命令请求 */ |
void spdk_nvmf_request_exec(struct spdk_nvmf_request *req) |
spdk_nvmf_rdma_request_process() -->spdk_nvmf_request_exec(&rdma_req->req); |
|
tcp_req = spdk_nvmf_tcp_req_get(tqpair); spdk_nvmf_tcp_req_process() -->spdk_nvmf_request_exec(&tcp_req->req); |
NVMF请求处理公共接口按命令类型分类处理
void spdk_nvmf_request_exec(struct spdk_nvmf_request *req) { //...... if (spdk_unlikely(req->cmd->nvmf_cmd.opcode == SPDK_NVME_OPC_FABRIC)) { status = spdk_nvmf_ctrlr_process_fabrics_cmd(req); } else if (spdk_unlikely(spdk_nvmf_qpair_is_admin_queue(qpair))) { status = spdk_nvmf_ctrlr_process_admin_cmd(req); } else { status = spdk_nvmf_ctrlr_process_io_cmd(req); } if (status == SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE) { spdk_nvmf_request_complete(req); } }