【问题标题】:AF-XDP: Implement Shared Umem socketsAF-XDP:实现共享 Umem 套接字
【发布时间】:2020-03-10 09:59:43
【问题描述】:

我要实现 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,则设置 struct sockaddr_xdpXDP_SHARED_UMEM 选项。

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

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

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

我不知道他们希望别人如何使用共享 umem 功能?

【问题讨论】:

  • kernel samples 中的示例在这里有用吗?
  • 据我了解,umem->buffer 只是指向内存区域的指针,但我没有得到struct xsk_umem 的其他变量,例如fdrefcount 这是必要的对于xsk_socket__create 相应地设置XDP_SHARED_UMEM。我可能错了,但我看不出这个功能对我有什么帮助
  • 对,对不起。那时我不知道:/。可能是 libbpf 还没有这些助手。
  • 我看到libbpf中有xsk_umem__fd(),你能用它来获取文件描述符并将其传递给其他进程吗? (我没试过,不知道这是否应该工作)
  • 我可以这样做,但 xsk_socket__create 再次期待 struct xsk_umem *umem。为了能够将fd 直接传递给xsk_socket__create 我必须更改库(我认为)

标签: c linux xdp-bpf


【解决方案1】:

所以这是在on the xdp-newbies 邮件列表中讨论的。在此报告记录。

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

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

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

他补充道:

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

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

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

我建议不要走这条路。

(归功于比约恩。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-18
    • 1970-01-01
    • 2013-07-24
    • 2018-05-13
    • 2011-07-25
    相关资源
    最近更新 更多