2

我想实现 XDP_SHARED_UMEM:https ://www.kernel.org/doc/html/latest/networking/af_xdp.html#xdp-shared-umem-bind-flag

libbpf函数xsk_socket__create( https://github.com/libbpf/libbpf/blob/master/src/xsk.c ) 检查该xsk_umem->refcount值。如果它大于 1,则设置XDP_SHARED_UMEMa 的选项struct sockaddr_xdp

因此,据我正确理解,我“只”需要传递要与之共享 umem 的套接字的原始 umem 结构,其余的由libbpf.

我尝试这样做的方法是让第一个进程将其umem-struct 复制到第二个进程可以从中加载它的共享内存区域。但是因为它struct xsk_umem被定义在xsk.c用户面前是隐藏的,所以我不能做这样的事情:

memcpy(shdm_ptr, umem, sizeof(struct xsk_umem))

我不知道他们如何期望有人使用共享的 umem 功能?

4

1 回答 1

3

所以这在 xdp-newbies邮件列表上进行了讨论。在此报告以作记录。

不建议您尝试进行多进程设置。比约恩 说:

请注意,如果您想使用共享 umem 进行多进程设置,您:需要有一个控制进程来管理填充/完成环,并在进程之间同步,或者重新映射填充/完成环在多个进程中拥有 umem 的套接字 同步对它们的访问。两者都不愉快。

老实说,不是我推荐的设置。

他补充说:

只是为了完整性;要设置共享 umem:

  1. 创建套接字 0 并将 umem 注册到此。
  2. 使用套接字 0 映射 fr/cr
  3. 创建套接字 1、2、n 并为 umem 引用套接字 0。

因此,在多进程解决方案中,步骤 3 将在单独的进程中完成,步骤 2 取决于您的应用程序。您需要将套接字 0 传递给其他进程,并从创建套接字 0 的进程共享 umem 内存。考虑到所有共享状态,这几乎是一个线程解决方案。

我建议不要走这条路。

(归功于比约恩。)

于 2020-03-12T16:24:08.990 回答