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队列*/
  -->fc_req->req.cmd = (union nvmf_h2c_msg *)&cmd_iu->cmd;
  -->fc_req->req.rsp = (union nvmf_c2h_msg *)&fc_req->ersp.rsp;

  -->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);
	}
}

 

转载于:https://www.cnblogs.com/JamesLi/p/11525931.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值