写点什么

详细讲解 spdk 里的 examples/nvmf/nvmf/nvmf.c 文件

作者:linux大本营
  • 2023-04-24
    湖南
  • 本文字数:1177 字

    阅读完需:约 4 分钟

首先,nvmf.c 是 SPDK(Storage Performance Development Kit)中 nvmf(Non-Volatile Memory Express over Fabrics)的示例代码。它用于演示如何使用 SPDK 实现 NVMf 的服务器端代码。该文件实现了一个 NVMf Target(即服务器端)应用程序,以提供 NVMf 命名空间(例如某种存储设备)的访问,并等待来自 NVMf Initiator(即客户端)的连接请求。

下面是代码解释及主要函数及其作用:

  1. static void nvmf_tgt_remove_namespaces:

这个函数用于删除命名空间。主要是 nvmf_tgt_create_namespaces 函数的逆操作,用于删除目前已经创建的命名空间。

  1. static int nvmf_tgt_create_namespaces:

这个函数用于创建命名空间。它初始化了一个 SPDK 的“g_ns_ctx”命名空间上下文。在这个上下文中,它定义了一个名为“g_nsid”的变量,用于存储 NVMf 命名空间的当前编号。还定义了一个名为“g_bdev”的变量,用于存储 NVMf 命名空间的信息。它还调用了一个名为“spdk_nvme_transport_id_populate”的函数来填充命名空间的传输 ID 信息的数据结构。最后,它在命名空间上下文中定义了一个名为“g_ns”的变量,用于存储 SPDK 库中所有命名空间的指针数组。

  1. static void nvmf_tgt_listen(void *arg1, void *arg2):

这个函数用于侦听来自 NVMf Initiator 的连接请求。它通过定义一个名为“trid”的结构体,填充一个 SPDK 传输 ID 上下文的参数,并调用“spdk_nvmf_tgt_listen”函数,并指定了一个名为“nvmf_tgt_listen_done”的回调函数。在该回调函数中,它记录服务器已经开始监听连接请求。

  1. static voidnvmf_tgt_accept(struct spdk_nvmf_conn *conn):

这个函数用于接受来自 NVMf Initiator 的连接。它首先通过调用“spdk_nvmf_conn_get_id”函数获取连接的 ID,然后通过调用“spdk_nvmf_tgt_find_subsystem”函数查找已在 NVMf Target 中定义的 NVMf 子系统。如果找到了一个子系统,则通过调用“spdk_nvmf_subsystem_attach”函数将连接附加到该子系统,并设置连接的状态为“已附加”;否则它将连接错误标记为无效。

  1. static void nvmf_tgt_subsystem_property_set( struct spdk_io_channel_iter *i, int status):

此函数用于设置新的 NVMf 命名空间名称和分配 ID。它首先获取 IO 通道中的命名空间数量,并调用“spdk_nvmf_subsystem_add_ns”的函数来为每个命名空间分配 ID,并设置命名空间的名称。最后,它调用“spdk_nvmf_subsystem_start”的函数启动 NVMf 子系统。

  1. int main(int argc, char **argv):

这是代码的主函数。它首先调用几个 SPDK 库的初始化函数,例如“spdk_log_set_facility”,“spdk_log_set_level”等,以运行代码的初始化,为后续的操作做好准备。然后,它调用了这些函数来创建命名空间和启动子系统,最后通过调用“nvmf_tgt_listen”函数开始侦听来自 NVMf Initiator 的连接请求。

以上就是 nvmf.c 的主要函数及其作用。


相关技术视频教程:c/c++ linux服务器开发/后台架构师免费学习地址

用户头像

还未添加个人签名 2020-11-26 加入

C/C++linux服务器开发群 812855908

评论

发布
暂无评论
详细讲解spdk里的examples/nvmf/nvmf/nvmf.c文件_nvme_linux大本营_InfoQ写作社区