eBPF Talk: XDP on Mellanox
文章目录
为了更高的性能,需要将 XDP 程序下沉到网卡驱动里去运行。
因为服务器使用的物理网卡是 Mellanox,所以就研究一下 Mellanox 驱动里是怎么运行 XDP 程序的。
XDP on Mellanox
直接在内核源代码里的 /drivers/net/ethernet/mellanox
目录下搜索 XDP_REDIRECT
,就能找到如下代码片段:
|
|
bpf_prog_run_xdp()
就是真实运行 XDP 程序的函数。
XDP_PASS on Mellanox
如果 XDP 程序里 XDP_PASS
该网络包到内核,Mellanox 网卡驱动还做了哪些处理呢?
有 3 个地方调了 mlx5e_xdp_handle()
函数。
|
|
从上面代码片段可以看出,在执行 XDP 程序之后,都调用 mlx5e_build_linear_skb()
函数来构建 skb
。
XDP_TX on Mellanox
如果 XDP 程序里 XDP_TX
该网络包发送出去,Mellanox 网卡驱动还做了哪些处理呢?
|
|
直接在驱动内部调 mlx5e_xdpi_fifo_push()
函数发送出去了。
XDP_REDIRECT on Mellanox
如果 XDP 程序里 XDP_REDIRECT
转发该网络包,Mellanox 网卡驱动还做了哪些处理呢?
驱动里调 xdp_do_redirect()
进行了转发处理。
|
|
以上代码片段的主要处理逻辑:
- 将
xdp_buff
转为xdp_frame
。 - 最后调目标设备的
ndo_xdp_xmit()
函数将xdp_frame
发送出去。
关于 XDP_REDIRECT 的更多讲解,请看:
XDP_ABORTED and XDP_DROP on Mellanox
Mellanox 驱动对它们没有复杂的处理逻辑:
|
|
只是递增了 xdp_drop
统计。
bpf_xdp_adjust_head()
|
|
注意其中一个细节:如果有 metadata,metadata 会被 memmove 而不会被覆盖。
bpf_xdp_adjust_meta()
|
|
更详细的讲解请看:
bpf_xdp_adjust_tail()
|
|
Q&A
Q:经过 XDP adjust 后的网络包,能否 PASS 到内核?
A:可以。回头看 XDP_PASS on Mellanox
的处理逻辑,在调 mlx5e_build_linear_skb()
构建 skb
时便处理好了 head
、meta
和 tail
。
Q:经过 XDP adjust 后的网络包,在 REDIRECT 时会失去 meta
吗?
A:不会。以 veth 虚拟设备为例,veth 网卡驱动在将 xdp_frame
转为 skb
时,调 skb_metadata_set()
设置 meta
信息(意即,meta
信息可以跨设备传递):
|
|
总结
将 XDP on Mellanox 研究透彻后,就不再害怕将 XDP 程序下发到 Mellanox 驱动去运行的各种 corner case。
文章作者 Leon Hwang
上次更新 2024-03-31