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);
    	}
    }
    
  • 相关阅读:
    Python之旅的第19天(类的初识)
    Python之旅的第18天(configparser、hashlib模块)
    Python之旅的第17天(re模块、logging模块)
    第二阶段个人冲刺博客1
    注释
    第十五周学习进度博客
    第十四周学习进度博客
    12-用户体验评价
    11-找水王
    第十三周学习进度博客
  • 原文地址:https://www.cnblogs.com/JamesLi/p/11525931.html
Copyright © 2011-2022 走看看