[dpdk][sysfs][pci] 在dpdk程序中操縱PCI設備

 

〇  需求

在DPDK程序運行時,但願可以實時的操縱PCI 網卡設備的驅動綁定與解綁。html

本文的目的是爲了調查知足以上需求的,kernel提供的,標準的API都有幾種,分別是什麼。以肯定實施方案。linux

 

一  背景

咱們已知有三個方法:bash

  1. dpdk_devbind.pyide

  2. driverctl   [administrator][driver] driverctl 是如何在udev上層管理設備驅動的ui

  3. sysfsspa

    [knowledge][linux][sysfs] sysfs文件系統調試

    [dpdk] 讀官方文檔(2)    這裏有個bind/unbind章節。code

 

二  分析

分析driverctl的源碼orm

  driverctl 是一個bash腳本,也是用sysfs實現的。原理以下:htm

# 加載
> 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

相關文章
相關標籤/搜索