我想实现 XDP_SHARED_UMEM:https://www.kernel.org/doc/html/latest/networking/af_xdp.html#xdp-shared-umem-bind-flag https://www.kernel.org/doc/html/latest/networking/af_xdp.html#xdp-shared-umem-bind-flag
The libbpf
库函数xsk_socket__create
(https://github.com/libbpf/libbpf/blob/master/src/xsk.c https://github.com/libbpf/libbpf/blob/master/src/xsk.c)检查xsk_umem->refcount
价值。如果大于 1,则XDP_SHARED_UMEM
的选项struct sockaddr_xdp
is set.
因此,据我正确理解,我“只”需要传递我想要与之共享 umem 的套接字的原始 umem 结构,其余部分由libbpf
.
我尝试的方法是让第一个进程复制它的umem
-struct 到共享内存区域,第二个进程可以从中加载它。但是因为struct xsk_umem
定义于xsk.c
它对用户隐藏,我无法执行以下操作:
memcpy(shdm_ptr, umem, sizeof(struct xsk_umem))
我不知道他们如何期望有人使用共享umem功能?
于是就讨论了这个问题邮件列表。在此报告以作记录。
不建议像您尝试那样采用多进程设置。比约恩 说:
请注意,如果您愿意
做一个多process使用共享 umem 设置,您: 需要有
管理填充/完成环的控制过程,以及
在进程之间同步,或重新映射填充/完成
从多个进程中拥有 umem 的套接字发出响铃and同步对它们的访问。两者都不令人愉快。
老实说,我不推荐这种设置。
他补充道:
只是为了完整性;设置共享 umem:
- 创建套接字 0 并将 umem 注册到此。
- 使用套接字 0 映射 fr/cr
- 创建套接字 1、2、n 并为 umem 引用套接字 0。
因此,在多进程解决方案中,步骤 3 将单独完成
流程和步骤 2(具体取决于您的应用程序)。你需要
将套接字 0 传递给其他进程and共享 umem 内存
创建套接字 0 的进程。这几乎是一个线程
给定所有共享状态的解决方案。
我建议不要走这条路。
(归功于比约恩。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)