
包的有效数据放置在图中mbuf的红色部分。当CPU想要读取数据包中的数据时,它将访问图中mbuf的红色部分。因此,我想知道DPDK如何预取mbuf,它将预取整个mbuf以缓存或只预取数据部分(图中的红色部分)。
此外,如果您能够详细介绍DPDK的预取机制(预取mbuf或RX描述符)的代码,将会更好。
发布于 2022-08-30 15:35:10
DPDK使用特定于体系结构的预取指令将数据预取到缓存层次结构中.为了方便编程,它还提供了一个统一的接口(例如rte_prefetch0)。
您可以在特定于arch的目录中找到预取函数的定义:
通用接口定义:https://elixir.bootlin.com/dpdk/latest/source/lib/eal/include/generic/rte_prefetch.h
预取函数只接受一个参数:预取数据的内存地址。注意,预取指令的效果也是特定于体系结构的。在x86 (我更熟悉)中,预取指令只是提示,硬件可能会忽略它们。预取的数据量也是不确定的,但在我的经验中,它通常是一条基线(64字节)。
rte_mbuf结构的字段,它通常会直接(rte_preftch0(mbuf))预取结构。例子:https://elixir.bootlin.com/dpdk/latest/source/drivers/net/i40e/i40e_rxtx.c#L598rte_prefetch0(rte_pktmbuf_mtod(mbuf)))的起始地址。例子:https://elixir.bootlin.com/dpdk/latest/source/examples/l3fwd/l3fwd_em.h#L134在实践中,DPDK (和DPDK应用程序)很少预取整个mbuf或整个数据部分。它们只预取实际访问的单身汉,通常是包含最常用字段的rte_mbuf结构的第一条记录线,以及有效数据的第一条缓存行,后者通常包含网络数据包的报头。
https://stackoverflow.com/questions/72960358
复制相似问题