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%左右。 大功告成。

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM