〇 需求
在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