ZYNQ xilinx_axienet CPU软中断占用过高问题解决记录
Vivado:2016.4
Linux:Ubuntu16.4
ZYNQ:xc7z020
题主最近在做ZYNQ的网络接收,需求是4路百兆网输入,PS自带的两个网口肯定不够用,于是在PL侧外扩了3个百兆以太网(参见之前博文:ZYNQ Linux 下 AXI Ethernet使用记录),一切运行正常后测试带宽,发现百兆以太网再接收到50Mb/s的时候已经出现了CPU占用过高的现象,进一步发现是进程ksoftirqd/0占用了30%的CPU,这显然不合理。于是从头研究xilinx AXI Ehernet的驱动程序,研究以太网卡的驱动框架,发现了一篇好文:https://www.jianshu.com/p/6292b3f4c5c0 ;
研究了2016.4对应的linux内核中drivers/net/ethernet/xilinx/xilinx_axienet_main.c 中刚好使用的就是NAPI机制,本应该是优化网络接收,减少中断的一种机制,结果在这个版本中既然导致CPU占用过高,猜测是内核中某个地方的bug,无奈没这本事深入到内核中去定位,于是尝试了将kernel和uboot同时升级到高版本(2018.3),结果发现高版本中好多内容有变化(FPGA配置/dev/xdevcfg等内容变化),导致要跑起来整个kernel和uboot很繁琐,于是行到一半放弃了。
其实解决思路无非两种:1. 升级到高版本的内核,解决NAPI占用CPU过高的问题; 2. 不适用NAPI机制,因为目前是百兆网,带宽不是很高,采用中断方式足够使用;
回过头来继续寻找不使用NAPI的方式,先去github上去撸一下看看历史记录,以前的版本是否有不使用NAPI机制的驱动,这一看还真发现历史版本中存在不使用NAPI机制的驱动:https://github.com/Xilinx/linux-xlnx/tree/xilinx-v2015.1/drivers/net/ethernet/xilinx ; 2015.1是最后一个不使用NAPI机制的网卡驱动。于是down下来重新编译(只需要xilinx_axienet.h xilinx_axienet_main.c xilinx_axienet_mdio.c这三个文件,编译过程中报xilinx_axienet_mdio.c某一行错误,注释掉即可)。系统运行起来后加载驱动(insmod xilinx_emac.ko),运行程序发现ksoftirqd/0这个占用CPU高的进程找不到了,同样的测试程序CPU idle从替换驱动前的30% 上升到了70%左右。 大功告成。