手動綁定驅動 + drivers_probe + rescan


 

 

Igb_uio內核驅動

 

Igb_uio驅動主要做的就是注冊一個pci設備。但是igbuio_pci_driver對應的保存pci設備信息的id_table指針為空,這樣在內核注冊此pci設備時,會找不到匹配的設備,就不會調用igb_uio驅動中的探測probe函數,只會在/sys目錄下創建Igb_uio相應的目錄。

如何probe

在插入igb_uio.ko時是probe不到設備的,那是什么時候偵測到的呢?dpdk提供了一個Python腳本dpdk_nic_bind.py。

python tools/dpdk_nic_bind.py --bind=igb_uio eth1

運行上述命令就是將eth1網卡綁定到igb_uio模塊。這時dmesg就會看到igb_uio模塊的probe函數執行了,也就是意味着掃描到了匹配的pci設備。

 

 

經過分析dpdk_nic_bind.py,此腳本文件在上述情況下主要做了以下幾步:

◆獲取參數指定的網卡eth1的設備信息。使用lspci–Dvmmn查看。

Slot:   0000:06:00.1                                                                            

Class:  0200

Vendor: 8086

Device: 1521

SVendor:        15d9

SDevice:        1521

Rev:    01

可以查看到slot槽位信息、廠商號vendor ID、設備號device ID等信息。

 

 

◆unbind之前的igb模塊。

將前面獲取到的eth1對應的slot信息0000:06:00.1值寫入igb的unbind文件。

echo 0000:06:00.1 >  /sys/bus/pci/drivers/igb/unbind

從內核代碼分析此unbind的動作就是將igb模塊信息和此pci設備Dev去關聯。將dev->driver指針置為空,這個很重要。在內核處理pci設備注冊的函數中,就算驅動的vendor ID和device ID與設備的都匹配上了,如果此設備的dev->driver指針不為空,也不會調用probe函數的。

 

 

◆bind新的igb_uio模塊

將eth1設備的vendor和device ID信息寫入igb_uio的new_id文件。

echo 0x8086 0x1521 >  /sys/bus/pci/drivers/igb_uio/new_id

內核中處理此步的函數為store_new_id,此函數中是將寫入的vendor和device存入到此driver,也就是igb_uio的id_table,然后以此與PCI上的設備進行匹配,這個時候肯定會匹配成功,然后調用igb_uio模塊的probe函數進行初始化動作。

 

 

 

 

 

 

 

 

 

echo 1 > /sys/bus/pci/rescan
echo 1 > /sys/bus/pci/devices/0000:00:1e.0/rescan

 

 

Other Network devices
=====================
0000:06:00.0 'Hi1822 Family (2*25GE) 0200' unused=hinic,igb_uio,vfio-pci

 

[root@localhost dpdk-19.11]# ls /sys/bus/pci/drivers
ahci      ehci-pci     hibmc-drm  hisi_sas_v3_hw  igb_uio  megaraid_sas  ohci-pci  pci-stub  uhci_hcd  xhci_hcd
ata_piix  exar_serial  hinic      hns3            ipmi_si  nvme          pcieport  serial    vfio-pci
[root@localhost dpdk-19.11]# ls /sys/bus/pci/drivers/vfio-pci/
0000:05:00.0  bind  module  new_id  remove_id  uevent  unbind
[root@localhost dpdk-19.11]# ls /sys/bus/pci/drivers/vfio-pci/module/
coresize  holders   initstate  parameters  rhelversion  srcversion  uevent
drivers   initsize  notes      refcnt      sections     taint       version
[root@localhost dpdk-19.11]# ls /sys/bus/pci/drivers/vfio-pci/module/drivers/
pci:vfio-pci
[root@localhost dpdk-19.11]# ls /sys/bus/pci/drivers/vfio-pci/
0000:05:00.0  bind  module  new_id  remove_id  uevent  unbind
[root@localhost dpdk-19.11]# cd /sys/bus/pci/drivers/vfio-pci/
[root@localhost vfio-pci]#

 

 

NVMe的驅動解綁和VFIO的綁定
查看pci信息,找到nvme:
 $ lspci -nn

00:04.0 Non-Volatile memory controller [0108]: Intel Corporation QEMU NVM Express Controller [8086:5845] (rev 02)
記住兩個字段:00:04.08086:5845
00:04.0 全稱是0000:00:04.0 對應[[[[<domain>]:]<bus>]:][<device>][.[<func>]] 8086:5845 對應[<vendor>]:[<device>]
從內核驅動解綁
echo "0000:00:04.0" >/sys/bus/pci/devices/0000:00:04.0/driver/unbind
綁定到VFIO
echo 8086 5845 | tee /sys/bus/pci/drivers/vfio-pci/new_id
檢查:
- lsblk 看不到nvme盤
- vfio下面多了一個設備文件:ls /dev/vfio/4
到此為止,已經完成了NVMe設備的解綁和綁定,接下來就可以開發用戶態NVMe驅動來驅動NVMe盤,我們這里使用qemu的用戶態driver來測試和學習。

 

# echo igb > /sys/bus/pci/devices/0000\:08\:00.0/driver_override
# echo 0000:08:00.0 > /sys/bus/pci/drivers_probe
# lspci -s 0000:08:00.0 -k
08:00.0 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
Subsystem: Intel Corporation Device 0000
Kernel driver in use: igb
Kernel modules: igb

 

 echo 1 > /sys/bus/pci/rescan

 

 

# ethtool -i enp8s16 | grep bus
bus-info: 0000:08:10.0
# lspci -s 0000:08:10.0 -n
08:10.0 0200: 8086:10ca (rev 01)
# modprobe vfio
# modprobe vfio-pci
# echo 0000:08:10.0 > /sys/bus/pci/devices/0000\:08\:10.0/driver/unbind
# echo “8086 10ca” > /sys/bus/pci/drivers/vfio-pci/new_id
# echo 0000:08:10.0 > /sys/bus/pci/drivers/vfio-pci/bind
# lspci -s 0000:08:10.0 -k
08:10.0 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
Subsystem: Intel Corporation Device 0000
Kernel driver in use: vfio-pci
Kernel modules: igbvf

 

[root@localhost vfio-pci]# lspci -n -v -s 0000\:06\:00.0
06:00.0 0200: 19e5:0200 (rev 45)
        Subsystem: 19e5:d139

 

 

[root@localhost vfio-pci]# ls /sys/bus/pci/devices/
0000:00:00.0  0000:00:12.0  0000:05:00.0  0000:74:03.0  0000:7b:00.0  0000:7d:00.3  0000:81:00.0  0000:ba:00.0
0000:00:08.0  0000:02:00.0  0000:06:00.0  0000:74:04.0  0000:7c:00.0  0000:80:00.0  0000:84:00.0  0000:ba:01.0
0000:00:0c.0  0000:03:00.0  0000:07:00.0  0000:7a:00.0  0000:7d:00.0  0000:80:08.0  0000:b4:02.0  0000:ba:02.0
0000:00:10.0  0000:04:00.0  0000:08:00.0  0000:7a:01.0  0000:7d:00.1  0000:80:0c.0  0000:b4:03.0  0000:bb:00.0
0000:00:11.0  0000:04:01.0  0000:74:02.0  0000:7a:02.0  0000:7d:00.2  0000:80:10.0  0000:b4:04.0  0000:bc:00.0
[root@localhost vfio-pci]# ls /sys/bus/pci/devices/:06\:00.0/driver/
ls: cannot access /sys/bus/pci/devices/:06:00.0/driver/: No such file or directory
[root@localhost vfio-pci]# echo 0000\:06\:00.0 > /sys/bus/pci/devices/0000\:06\:00.0/driver/unbind
-bash: /sys/bus/pci/devices/0000:06:00.0/driver/unbind: No such file or directory
[root@localhost vfio-pci]# echo -n 0000\:06\:00.0 >  bind
-bash: echo: write error: No such device
[root@localhost vfio-pci]# pwd
/sys/bus/pci/drivers/vfio-pci
[root@localhost vfio-pci]# ls /dev/vfio/
25  vfio
[root@localhost vfio-pci]# echo -n  19e5:0200 > new_id 
-bash: echo: write error: Invalid argument
[root@localhost vfio-pci]# echo -n  "19e5:0200" > new_id 
-bash: echo: write error: Invalid argument
[root@localhost vfio-pci]# echo -n 0000\:06\:00.0 >  bind
-bash: echo: write error: No such device
[root@localhost vfio-pci]#

 

[root@localhost vfio-pci]# echo -n  "19e5 0200" > new_id 
[root@localhost vfio-pci]# echo -n 0000\:06\:00.0 >  bind
-bash: echo: write error: No such device
[root@localhost vfio-pci]# echo  0000:06:00.0 > bind -bash: echo: write error: No such device
[root@localhost vfio-pci]# ls /dev/vfio/
25  33  vfio
[root@localhost vfio-pci]# 

 

echo 0000:0b:00.0 >>/sys/bus/pci/devices/0000\:0b\:00.0/driver/unbind

注意:這條指令執行后/sys/bus/pci/devices/0000\:0b\:00.0/下的driver目錄會消失

 =========================================

[root@localhost dpdk-19.11]# ls /dev/vfio/
25  33  vfio
[root@localhost dpdk-19.11]# ls /sys/bus/pci/devices/0000\:06\:00.0/driver
0000:05:00.0  0000:06:00.0  bind  module  new_id  remove_id  uevent  unbind
[root@localhost dpdk-19.11]# echo 0000\:06\:00.0 >  /sys/bus/pci/devices/0000\:06\:00.0/driver/unbind 
[root@localhost dpdk-19.11]# ls /sys/bus/pci/devices/0000\:06\:00.0/driver
ls: cannot access /sys/bus/pci/devices/0000:06:00.0/driver: No such file or directory
[root@localhost dpdk-19.11]# ls /dev/vfio/
25  vfio
[root@localhost dpdk-19.11]# echo -n  "19e5 0200" > new_id  /sys/bus/pci/drivers/vfio-pci/new_id 
[root@localhost dpdk-19.11]# echo -n  "19e5 0200" >   /sys/bus/pci/drivers/vfio-pci/new_id 
[root@localhost dpdk-19.11]# ls /dev/vfio/
25  33  vfio
[root@localhost dpdk-19.11]# echo -n  "0000:06:00.0"  /sys/bus/pci/drivers/vfio-pci/bind 
0000:06:00.0 /sys/bus/pci/drivers/vfio-pci/bind[root@localhost dpdk-19.11]# 
[root@localhost dpdk-19.11]# ls /sys/bus/pci/devices/0000\:06\:00.0/driver
0000:05:00.0  0000:06:00.0  bind  module  new_id  remove_id  uevent  unbind
[root@localhost dpdk-19.11]# 

 

[root@localhost dpdk-19.11]# ./usertools/dpdk-devbind.py -s

Network devices using DPDK-compatible driver
============================================
0000:05:00.0 'Hi1822 Family (2*25GE) 0200' drv=vfio-pci unused=hinic,igb_uio
0000:06:00.0 'Hi1822 Family (2*25GE) 0200' drv=vfio-pci unused=hinic,igb_uio

 

[root@localhost dpdk-19.11]# ./usertools/dpdk-devbind.py -s

Network devices using DPDK-compatible driver
============================================
0000:05:00.0 'Hi1822 Family (2*25GE) 0200' drv=vfio-pci unused=hinic,igb_uio
0000:06:00.0 'Hi1822 Family (2*25GE) 0200' drv=vfio-pci unused=hinic,igb_uio

Network devices using kernel driver
===================================
0000:7d:00.0 'HNS GE/10GE/25GE RDMA Network Controller a222' if=enp125s0f0 drv=hns3 unused=hns_roce_hw_v2,igb_uio,vfio-pci *Active*
0000:7d:00.1 'HNS GE/10GE/25GE Network Controller a221' if=enp125s0f1 drv=hns3 unused=igb_uio,vfio-pci 
0000:7d:00.2 'HNS GE/10GE/25GE RDMA Network Controller a222' if=enp125s0f2 drv=hns3 unused=hns_roce_hw_v2,igb_uio,vfio-pci 
0000:7d:00.3 'HNS GE/10GE/25GE Network Controller a221' if=enp125s0f3 drv=hns3 unused=igb_uio,vfio-pci 

No 'Baseband' devices detected
==============================

No 'Crypto' devices detected
============================

No 'Eventdev' devices detected
==============================

No 'Mempool' devices detected
=============================

No 'Compress' devices detected
==============================

No 'Misc (rawdev)' devices detected
===================================

 

[root@localhost dpdk-19.11]# ls /sys/class/net/     ----沒dpdk的網卡
enp125s0f0  enp125s0f1  enp125s0f2  enp125s0f3  lo

 

[root@localhost dpdk-19.11]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp125s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether b0:08:75:5f:b7:d9 brd ff:ff:ff:ff:ff:ff
    inet 10.10.16.229/24 brd 10.10.16.255 scope global noprefixroute enp125s0f0
       valid_lft forever preferred_lft forever
    inet6 fe80::f9ec:a960:7518:b745/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
3: enp125s0f1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
    link/ether b0:08:75:5f:b7:da brd ff:ff:ff:ff:ff:ff
4: enp125s0f2: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
    link/ether b0:08:75:5f:b7:db brd ff:ff:ff:ff:ff:ff
5: enp125s0f3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether b0:08:75:5f:b7:dc brd ff:ff:ff:ff:ff:ff
[root@localhost dpdk-19.11]# lspci | grep ether
[root@localhost dpdk-19.11]# lspci | grep -i  ether
05:00.0 Ethernet controller: Huawei Technologies Co., Ltd. Hi1822 Family (2*25GE) (rev 45)
06:00.0 Ethernet controller: Huawei Technologies Co., Ltd. Hi1822 Family (2*25GE) (rev 45)
7d:00.0 Ethernet controller: Huawei Technologies Co., Ltd. HNS GE/10GE/25GE RDMA Network Controller (rev 21)
7d:00.1 Ethernet controller: Huawei Technologies Co., Ltd. HNS GE/10GE/25GE Network Controller (rev 21)
7d:00.2 Ethernet controller: Huawei Technologies Co., Ltd. HNS GE/10GE/25GE RDMA Network Controller (rev 21)
7d:00.3 Ethernet controller: Huawei Technologies Co., Ltd. HNS GE/10GE/25GE Network Controller (rev 21)
[root@localhost dpdk-19.11]# 

 


免責聲明!

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



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