zoukankan      html  css  js  c++  java
  • 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);
    	}
    }
    
  • 相关阅读:
    汇编14:端口
    汇编13:int指令
    整个软件开发的流程
    css grid 布局
    socket粘包处理
    如何做好需求变更管理?——需求变更流程规范
    软件工程需求分析文档模板
    使用layui的form.on绑定select选中事件, form.on()不执行的原因分析
    ID4收藏
    ASP.NET MVC5中View-Controller间数据的传递
  • 原文地址:https://www.cnblogs.com/JamesLi/p/11525931.html
Copyright © 2011-2022 走看看