• [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

  • 相关阅读:
    JS计算两个日期时间之差之天数不正确
    nodejs 第一天
    SQLSERVER存储过程基本语法
    复制表结构和数据SQL语句
    SVN使用教程总结
    jquery hover事件只触发一次动画
    导出格式
    C# 反射给对象赋值遇到的问题——类型转换
    a标签下载
    检测到在集成的托管管道模式下不适用的 ASP.NET 设置。
  • 原文地址:https://www.cnblogs.com/hugetong/p/9548675.html
Copyright © 2020-2023  润新知