DPDK的进程间通信机制

本文以 DPDK 20.05为例,其他版本适用。

1、初始化全局socket

(1)生成进程间通信共享文件过滤变量mp_filter,值为” mp_socket_* “。
(2)生成进程间通信共享文件所在的目录mp_dir_path,值为”/var/run/dpdk/rte”。
(3)调用open_socket_fd()函数创建SOCK_DGRAM类型的socket, 保存在全局变量mp_fd中,并用bind()函数将mp_fd 与通信文件进行绑定。
如果是主进程,则通信文件为:

如果是次进程,则通信文件为:

如果是次进程,则根据通信文件/var/run/dpdk/rte/mp_socket 向主进程发送消息,
而主进程通过通信文件

向所有次进程发送消息。

次进程之间没有消息通信。

(4)创建消息处理线程,线程名为”rte_mp_handle”,线程处理函数为mp_handle()函数

每个DPDK进程启动后,都会启动一个进程间消息处理的线程,进行DPDK进程间的消息处理。

2、消息读取函数read_msg()

该函数是对recvmsg()函数的封装,该函数对消息传递的各项结构进行赋值与封装,
函数也会得到struct sockaddr_un 结构的通信沟通文件路径。
之后将接收到的消息赋值到msg中,并由process_msg()函数处理。

3、消息处理函数process_msg()

该函数用来处理接收到的消息。
(1)函数首先判断消息的类型,如果是响应的消息MP_REP,或要求忽略的消息MP_IGN,
则去pending列表pending_requests中查找被挂起的消息,根据消息类型对消息做同步或异步处理。
(2)之后,根据消息的msg->name,即地址,从action_entry_list列表中查找对应的entry。
如果没有找到,则判断如果消息是一个请求消息,且DPDK初始化还没有完成,则发送一个空消息,告诉请求者忽略当前进程的存在。
如果找到了,就调用对应的消息处理回调函数,对消息做对应的处理。

4、发送消息

最终的消息发送函数为sendmsg()函数,被封装在send_msg()函数中。
调用路径为:

在send_msg()函数中,首先封装了struct msghdr msgh 和struct cmsghdr *cmsg 结构。
之后调用

函数,直到发送完毕。

5、注册消息处理函数rte_mp_action_register()

函数定义:

rte_mp_t 是一个函数指针,定义如下:

当为主进程、次进程之间创建了一个socket通道时,使用该函数为消息处理注册处理函数。
需要注意的是,在处理IPC请求回调时,即使在处理错误的情况下,也需要发送回复,简单地返回成功或失败将不会向请求者发送响应。
另外,不要在回调函数中分配内存。

struct rte_mp_msg 定义如下:

rte_mp_action_register() 函数流程如下:

(1)函数首先判断当前注册的action名称是否有效,即非空,长度大于0且小于64。

(2)之后为action entry分配一块内存:

并用函数的参数对该entry初始化:

(3)判断对应action_name的entry是否已经存在,
如果存在,则将已经分配的entry释放并返回错误。

(4)如果不存在,则插入到action_entry_list中:

(5)函数的调用路径为:

6、注册的消息处理函数

在lib/librte_eal/common/malloc_mp.c文件的register_mp_requests()函数中,调用了该函数
如果是主进程,则调用:

如果是次进程,则调用:

6.1 主进程中的消息处理函数

主进程中只注册了一个消息处理函数:

注册的消息名字为

6.2 次进程中的消息处理函数

次进程中注册了三个消息处理函数

(1)MP_ACTION_SYNC

主进程中有两个地方向次进程发送该类型的消息:
一个是在处理完次进程的请求之后,向次进程异步地发送该请求消息。
一个是在主进程初始化完成内存分配之后,向次进程同步地发送内存映射同步请求。一般这种情况是发生在,当无法从本地socket分配内存,向其他socket分配内存时,会同步内存映射相关信息。

(2)MP_ACTION_ROLLBACK

该消息的调用路径:

如果主进程接收到的消息为REQ_TYPE_ALLOC 且执行失败,则会向次进程发送该消息,

(3)MP_ACTION_RESPONSE

主进程向次进程发送响应消息时,使用该消息类型。

————————————————————

原创文章,转载请注明: 转载自孙希栋的博客

本文链接地址: 《DPDK的进程间通信机制》

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Scroll Up