​Linux kernel 驱动中,有不少驱动会引用到 EPROBE_DEFER 这个错误号。比如下面这个例子,对 devm_gpiod_get 的返回值进行判断,如果有错误且错误号不是 -EPRBOE_DEFER,才输出error log。

那么 EPRBOE_DEFER 有什么特别之处吗,需要驱动程序这样特意处理?这个与 kernel 设计的 driver-deferred-probe 机制有关。

kernel 下有多个独立的驱动,每个驱动或多或少地会引用到其他驱动提供的资源,比如某个外设驱动需要使用 gpio 资源,就会通过 gpio 驱动提供的函数接口去申请 gpio;但是当A驱动引用B驱动提供的资源时,B驱动可能还没有工作起来,为了解决驱动之间的这种依赖关系,kernel 设计了 driver-deferred-probe 机制:某个驱动在 probe 过程中,如果遇到依赖的资源还没有准备好,那么就返回 -EPRBOE_DEFER,kernel 检测到该驱动返回的是  -EPRBOE_DEFER,就会在过一段时间后让该驱动再次 probe。

driver-deferred-probe 流程如下图所示,有三条可能的路径

  • 生成新的 device 时

  • 注册新的 driver 时

  • later_initcall 主动再次触发

driver-deferred-probe 机制的核心数据结构与函数是:

  • deferred_probe_pending_list,用来记录哪些驱动被 deferred probe,并提供函数接口 driver_deferred_probe_add。

  • deferred_probe_work,用来调度相应的 work func 来执行 deferred probe 动作,并提供函数接口 driver_deferred_probe_trigger。

有了 driver-deferred-probe 机制后,编写驱动程序时,除了某些驱动有严格的执行次序,需要特意去定义 initcall 等级之外,一般的驱动则无需太过关心驱动间的依赖,从而在一定程度上简化了驱动开发。

以上就是对 EPRBOE_DEFER 的简要介绍。


作者:bigfish99

博客:https://www.cnblogs.com/bigfish0506/

公众号:大鱼嵌入式

最新文章

  1. Vimium使用快捷键总结
  2. 使用面向 iOS 的本机插件扩展 PhoneGap
  3. Mysql 数据库创建基本步骤
  4. iOS 蓝牙开发(二)iOS 连接外设的代码实现(转)
  5. Android圆角矩形创建工具RoundRect类
  6. Dynamics AX 2012 R2 RemoteApp导出项目报错
  7. Reprojection Matrix Q
  8. java实验一实验报告
  9. sencha项目升级
  10. Android Service即四大组件总结
  11. 安装 vsftp
  12. BootStrap--模态框中 上传图片
  13. windows 7 系统进程服务详解
  14. mahout贝叶斯算法开发思路(拓展篇)1
  15. 安装cocoapods遇到的一些问题
  16. BZOJ 1337: 最小圆覆盖1336: [Balkan2002]Alien最小圆覆盖(随机增量法)
  17. ImportError: No module named 'xlrd' 解决办法
  18. Python之面向对象三
  19. Paper Reading——LEMNA:Explaining Deep Learning based Security Applications
  20. 学习将码云账号和git连接,并且创建一个项目

热门文章

  1. 第一周JVM核心技术-工具与GC策略
  2. 10-10-12分页机制(xp)
  3. copy函数与ostream_iterator、reverse_iterator
  4. input type
  5. Linux_搭建NFS服务(基础)
  6. Ubuntu 20.04 搭建 LAMP 环境
  7. 051.Python的Django框架简单使用
  8. 012.Python的字典和集合的相关函数
  9. 存储单位 KB MB bit
  10. Java--反射机制——反射 API(Day_04)