[dpdk][sysfs][pci] 在dpdk程序中操縱PCI設備
〇 需求
在DPDK程序運行時,希望能夠實時的操縱PCI 網卡設備的驅動綁定與解綁。
本文的目的是為了調查滿足以上需求的,kernel提供的,標準的API都有幾種,分別是什么。以確定實施方案。
一 背景
我們已知有三個方法:
1. dpdk_devbind.py
2. driverctl [administrator][driver] driverctl 是如何在udev上層管理設備驅動的
3. sysfs
[knowledge][linux][sysfs] sysfs文件系統
[dpdk] 讀官方文檔(2) 這里有個bind/unbind章節。
二 分析
分析driverctl的源碼
driverctl 是一個bash腳本,也是用sysfs實現的。原理如下:
# 加載 > echo pci-stub > /sys/bus/pci/devices/0000:03:00.0/driver_override > echo 0000:03:00.0 > /sys/bus/pci/devices/0000:03:00.0/driver/unbind > echo 0000:03:00.0 > /sys/bus/pci/drivers_probe > # 卸載 > echo > /sys/bus/pci/devices/0000:03:00.0/preferred_driver > echo 0000:03:00.0 > /sys/bus/pci/devices/0000:03:00.0/driver/unbind > echo 0000:03:00.0 > /sys/bus/pci/drivers_probe >
分析dpdk_devbind.py的源碼
用lspci配合sysfs實現。
但是在dpdk-devbind中,做個了一個判斷,同時支持新舊兩種方式。
新的方式與 driverctl 的實現相同。
舊的方式與先前我們在sysfs下的做法一樣,用new_id來操作, 如下:
[root@T9 usertools]# echo 0000:00:04.0 > /sys/bus/pci/drivers/igb_uio/unbind [root@T9 usertools]# echo "1af4 1000" > /sys/bus/pci/drivers/virtio-pci/new_id 或 [root@T9 usertools]# echo "0000:00:04.0" > /sys/bus/pci/drivers/virtio-pci/bind
根據dpdk-devbind中的注釋和郵件列表的patch郵件信息: 新的driver_override方式是kernel version >= 3.15才支持。但是實際調試過程中,我當前在redhat kernel version 3.10的環境里,便已經支持了新的方式了。
patch: https://patches.linaro.org/patch/27588/
三 結論
1. 以上三種方式是同一套接口,都是通過文件系統對sysfs進行讀寫操作來實現的。
2. 具體的sysfs操作方法有前文提到的兩種。 推薦較新的一種,即通過driver_override.
https://www.kernel.org/doc/Documentation/ABI/testing/sysfs-bus-platform
浙公網安備 33010602011771號