DPDK開發雜記

注意,本文的示例是基於Linux x86_64環境。如果你的環境不一樣,應當將文中的x86_64-native-linuxapp-gcc 換成實際的值。
例如,32位linux環境,則換成i686-native-linuxapp-gcc


DPDK環境變量

編譯DPDK自帶的應用程序,總是需要用到兩個環境變量。

可以在 ~/.bash_profile中追加如下兩行內容。
這樣以後每次登陸,就會自動設置好。

export RTE_SDK=/opt/dpdk-2.2.0
export RTE_TARGET=x86_64-native-linuxapp-gcc



DPDK編譯安裝

dpdk的編譯腳本很複雜。
以個人經驗,最好通過如下一條命令完成。
那就是cd到dpdk源碼目錄,然後執行 
make install T=x86_64-native-linuxapp-gcc DESTDIR=/usr/local



dpdk運行前的配置

dpdk應用程序運行前,需要通過一序列命令準備運行環境。
可以將相關命令寫到 ~/run_dpdk_prepair.sh 中,以方便運行。
run_dpdk_prepair.sh示例內容如下。


[root@localhost dpdk-2.2.0]# cat ~/run_dpdk_prepair.sh     
#!/bin/sh

bind_nic(){
    ifconfig $1 down  
    ${RTE_SDK}/tools/dpdk_nic_bind.py --bind=igb_uio  $1 
}

modprobe uio    
insmod ${RTE_SDK}/${RTE_TARGET}/kmod/igb_uio.ko     
echo 256 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages  
  
if [ ! -d /mnt/huge_page_fs ]; then  
    mkdir /mnt/huge_page_fs    
fi  
mount -t hugetlbfs none /mnt/huge_page_fs    
  
bind_nic eth1
bind_nic eth2

注意:dpdk程序中,端口的編號(即portid)從0開始。
portid與物理口的對應關係爲:物理口按pci總線地址排序,地址越小,portid就越小。


項目makefile的修改

使用dpdk庫的項目,無須將makefile修改爲dpdk自帶的應用程序的makefile風格,可以繼續使用項目自己的makefile。
但是,需要對項目的makefile做出如下修改。


編譯選項,增加如下內容。

-march=native -DRTE_CACHE_LINE_SIZE=64\
-I/usr/local/include/dpdk/  -include rte_config.h

鏈接選項,增加如下內容。

-L/usr/local/lib -Wl,--whole-archive \
-lrte_distributor -lrte_reorder -lrte_pipeline -lrte_table -lrte_port \
-lrte_timer -lrte_hash -lrte_jobstats -lrte_lpm -lrte_power \
-lrte_acl -lrte_meter -lrte_sched -lm -lrt -lrte_vhost \
-Wl,--start-group -lrte_kvargs -lrte_mbuf -lrte_mbuf_offload -lrte_ip_frag \
-lethdev -lrte_cryptodev -lrte_mempool -lrte_ring -lrte_eal \
-lrte_cmdline -lrte_cfgfile -lrte_pmd_bond -lrte_pmd_vmxnet3_uio \
-lrte_pmd_virtio -lrte_pmd_cxgbe -lrte_pmd_enic -lrte_pmd_i40e \
-lrte_pmd_fm10k -lrte_pmd_ixgbe -lrte_pmd_e1000 \
-lrte_pmd_ring -lrte_pmd_af_packet -lrte_pmd_null -lrt -lm -ldl \
-Wl,--end-group -Wl,--no-whole-archive   


升級Linux內核

對於高於dpdk-2.2.0的dpdk版本,使用2.6.32及更低版本的Linux內核可能是不行的。故障現象是,無法綁定網卡到igb_uio驅動。
實際測試發現,2.6.38及以上的內核是可以的。
注意,升級內核後,需要重新編譯dpdk。因爲igb_uio的編譯是依賴於內核的。
內核升級的方法可以參考:http://blog.csdn.net/crazycoder8848/article/details/44131735


VMware虛擬機相關

1. 虛擬機網卡類型不是dpdk支持的類型
例如,在32位centos 6.5中,通過ethtool -i eth3查看網卡類型,發現driver是pcnet32。
那就需要修改虛擬機配置文件,文件名爲 虛擬機名稱.vmx。例如,共有4塊網卡,都想換成dpdk支持的e1000類型。
那就增加如下內容即可。
ethernet0.virtualDev = "e1000"
ethernet1.virtualDev = "e1000"
ethernet2.virtualDev = "e1000"
ethernet3.virtualDev = "e1000"


2. 修改dpdk源碼,讓虛擬網卡能夠收發包。
注意,這是個獨立問題,和前一問題沒有聯繫。
修改lib/librte_eal/linuxapp/igb_uio/igb_uio.c中igbuio_pci_probe函數(如果是dpdk-2.2.0的話,就是第509行)的一條if語句的判斷條件,一共就一行代碼。

        case RTE_INTR_MODE_LEGACY:
                if (pci_intx_mask_supported(dev)) {
                        dev_dbg(&dev->dev, "using INTX");
                        udev->info.irq_flags = IRQF_SHARED;
                        udev->info.irq = dev->irq;
                        udev->mode = RTE_INTR_MODE_LEGACY;
                        break;
                }

修改爲


        case RTE_INTR_MODE_LEGACY:
                if (pci_intx_mask_supported(dev) || !pci_intx_mask_supported(dev) ) {
                        dev_dbg(&dev->dev, "using INTX");
                        udev->info.irq_flags = IRQF_SHARED;
                        udev->info.irq = dev->irq;
                        udev->mode = RTE_INTR_MODE_LEGACY;
                        break;
                }


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章