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);
    	}
    }
    
  • 相关阅读:
    Redis基础学习(三)—Key操作
    Redis基础学习(二)—数据类型
    Redis基础学习(一)—Redis的安装
    Bootstrap基础学习(二)—表单
    Bootstrap基础学习(一)—表格与按钮
    List去除重复的元素
    jQuery 将表单序列化为Json对象
    SpringMVC基础学习(三)—参数绑定
    CentOS 7.1安装Elasticsearch和Storm
    Python多线程中join函数与setDaemon函数使用说明
  • 原文地址:https://www.cnblogs.com/JamesLi/p/11525931.html
Copyright © 2011-2022 走看看