为什么deferred probe将设备挂入延迟链表而不是将驱动挂入延迟链表

1. 代码流程(drivers/base/dd.c)

08b7f5ada40747d7a362689c970b0d8d.png

98fde90455454ea1b44f4476b0983675.png

34cfceaed4b3448b991e6ac5bce67a86.png

可以看到在probe失败的时候(驱动返回-EPROBE_DEFER)是把设备挂到deferred_probe_pending_list上面的。

这就带来了一个疑问: 我当前明明是驱动加载的过程(driver_attach()->bus_for_each_dev()), 为什么要将设备挂到pending list上面而不是将驱动挂在pending list上面?

2. 作者是怎么说的

drivercore: Add driver probe deferral mechanism · torvalds/linux@d1c3414 · GitHub

d7ec3c4602a445809ed42c04d40835c7.png

从上面的截图看出,作者也是认为"如果要求的资源暂不可得,那么驱动通过在probe返回-EPROBE_DEFER这种方式请求延迟probe调用……",驱动这一行为的结果导致了dev被加入到pending list中去。

为什么是dev而不是drv,这一点没说清楚。

3. 猜测

一共有两种场景:

场景一: device_attach()->__device_attach()->bus_for_each_drv()->__device_attach_driver()->driver_probe_device()->really_probe()

b91801f0755542da9ba8b738a123b67d.png

这种情况是驱动先注册,设备后注册,对要注册的设备,遍历总线上所有的驱动尝试进行匹配,如果probe出现问题,将设备挂入链表,进行延迟probe,没有问题。

需要注意的是按照linux下的设备驱动模型,一个设备只能匹配一个驱动,所以此时probe根本没有成功。

场景二: driver_attach()->bus_for_each_dev()->__driver_attach()->device_driver_attach()->driver_probe_device()->really_probe()

dbbf42f1e4134f1aaba14ce8b781cd6c.png

这种情况是设备先注册,驱动后注册,对要注册的驱动,遍历总线上的所有设备尝试进行匹配。

需要注意的是按照linux下的设备驱动模型,一个驱动可以匹配多个设备,如果某个probe出问题,用某种方法将驱动挂入链表尝试后续进行延迟probe则会出现问题: 假如dev0,dev1都能匹配drv,恰恰是与dev1匹配时probe出了问题,如果选择延迟probe的话,dev0、dev1都要调一次probe,而我们的期望是dev1与驱动匹配的时候只调一次probe就可以了。

所以说综上所述,选择将设备挂入延迟链表是最佳的,既能兼容驱动先注册/驱动后注册的场景,又因为设备与驱动的唯一匹配性,避免发生问题。

4. 资料

Documentation/driver-api/driver-model/binding.rst

a25983ccffda4f81b47cdff79a5547e9.png

edf5bedf45514ebcb8d899c5246656a7.png

1587d0a221144d4d887480a6846ac8e9.png

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值