我有一块定制主板,运行启用了 SMP 的 Marvell 3700。由于驱动程序定制,我不得不在驱动程序的 ndo_start_xmit 函数(TX 函数)中实现自旋锁,以避免 2 个内核竞争。(我的驱动程序定制使用了一些无法避免的共享变量)。
使用 iperf3 和 TCP 进行测试时,我经常看到接口挂起并且不再发送。这种情况并不总是发生,但只有在持续使用 iperfs 后才会发生。当我尝试在该接口上 ping 主机时,接口的 ifconfig TX 统计信息不会增加。我认为发生的事情是 skbs 没有在 2 个核心之间的竞争条件下释放,这导致 skbs 最终耗尽。
我尝试通过为所有接口和 TX-Q 设置 echo 1 > /sys/class/net/ethX/queues/txN/xps_cpus 来执行 XPS。我的理解是,每个 TX-Q 都将由 CPU #1 提供服务,这应该可以防止出现竞争条件。对吗?任何其他建议/指示都会有所帮助。
谢谢。