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

news2024/10/5 17:23:20

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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/783507.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Maven高级(继承与聚合+私服)

分模块设计和开发 为什么要分模块设计? 一个项目往往是分为好几个模块的 如果不同模块全写在一个项目里面 所有的程序员都要调用这有个项目就难以维护 比如我们之前设计的板块 就不太合理,现在我们把实体类和对应的工具类单独开出两个maven模块存储 然…

安装openai和简单使用

Anaconda的界面创建open ai环境,选择python10 控制台 #或者 conda info -e 注意不是anaconda命令开头 (base) C:\Users\su>conda env list # conda environments: # base * F:\anaconda3 openai F:\anaconda3\envs\opena…

TCP的拥塞控制、提高网络利用率的方法【TCP原理(笔记四)】

文章目录 拥塞控制慢启动 提高网络利用率的规范Nagle算法延迟确认应答捎带应答 拥塞控制 有了TCP的窗口控制,收发主机之间即使不再以一个数据段为单位发送确认应答,也能够连续发送大量数据包。然而,如果在通信刚开始时就发送大量数据&#x…

新能源汽车交流充电桩CP信号详解

随着新能源汽车的推广,交流充电桩迎来了巨大的市场需求,人们对车辆充电的便利性、安全性有着越来越高的要求。CP信号主要用于交流充电桩,充电桩和汽车之间只能通过CP信号进行通讯,判断、控制充电电流和状态。 汽车充电桩CP信号…

QT之自定义表格控件

继承QWidget来绘制的一款自定义控件,设计原因是因为Qt自带的QTableWidget的大批量操作很卡,特别是在嵌入式设备上时。 该控件特色功能: 1、支持拖动自适应。 2、支持各种颜色,字体,行列数设置。 代码如下: …

win10安装cuda11.4及cudnn

查看nvidia驱动版本 在windows终端键入nvidia-smi,查看nvidia显卡驱动。显卡驱动的版本决定了CUDA的版本下限。 如果出现上述的问题,则终端进入C:\Program Files\NVIDIA Corporation\NVSMI文件夹内,再键入nvidia-smi,可以看到我…

[MySQL]MySQL视图特性

[MySQL]MySQL视图特性 文章目录 [MySQL]MySQL视图特性1. 视图的概念2. 视图的基本操作创建视图删除视图 3. 视图规则和限制 1. 视图的概念 视图是一个虚拟表,其内容由查询定义,同真实的表一样,视图包含一系列带有名称的列和行数据。基表是对…

Git标签管理(对版本打标签,起别名)

tag 理解标签创建标签git tag [name]git show [tagname] 操作标签删除标签git tag -d < tagname > 推送某个标签到远程git push origin < tagname > 理解标签 标签 tag &#xff0c;可以简单的理解为是对某次 commit 的⼀个标识&#xff0c;相当于起了⼀个别名。 …

数据库备份mysqldump、mydumper、xtrabackup

数据库备份&#xff0c;数据库为school&#xff0c;素材如下 1.创建student和score表 CREATE TABLE student ( id INT(10) NOT NULL UNIQUE PRIMARY KEY , name VARCHAR(20) NOT NULL , sex VARCHAR(4) , birth YEAR, department VARCHAR(20) , address VARCHAR(50) );创建sco…

《面试1v1》如何提高远程用户的吞吐量

&#x1f345; 作者简介&#xff1a;王哥&#xff0c;CSDN2022博客总榜Top100&#x1f3c6;、博客专家&#x1f4aa; &#x1f345; 技术交流&#xff1a;定期更新Java硬核干货&#xff0c;不定期送书活动 &#x1f345; 王哥多年工作总结&#xff1a;Java学习路线总结&#xf…

FPGA配置文件从串并模式下载

FPGA配置文件的下载模式有5种&#xff1a; 主串模式&#xff08;master serial&#xff09;从串模式&#xff08;slave serial&#xff09;主并模式&#xff08;master selectMAP&#xff09;从并模式&#xff08;slave selectMAP&#xff09;JTAG模式 其中&#xff0c;JTAG模…

SQL 常见函数整理 _ SOUNDEX() 和 DIFFERENCE()

SOUNDEX() 1. 用法 是一种针对字符串进行音似匹配的函数。它将一个字符串作为输入&#xff0c;并返回一个代表该字符串音似编码的字符串。此编码可用于比较和匹配具有相似发音的字符串。 2. 基本语法 SOUNDEX(expression)其中&#xff0c;expression 是要进行音似编码的字符串…

后端排序优化——谁调用,谁排序

前言 为了使排序更加灵活&#xff0c;建议后端排序可以优化为“谁调用谁排序”。 代码实现 数据库设计 以学生表为例。 前端查询条件为姓名&#xff0c;住址。 Controller 简化后的controller层代码如下&#xff1a; /*** queryStudent[查询学生]* param name 姓名* param …

SQL优化——update优化

1.update优化 执行update语句的时候一定要根据索引字段进行更新&#xff0c;否则就会出现行锁升级为表锁的情况&#xff0c;锁住整张表&#xff0c;一旦锁表了并发性能就会受影响。 2.总结 sql优化事实上都是对索引进行优化

【Git】—— 解决分支合并冲突

在实际分⽀合并的时候&#xff0c;并不是想合并就能合并成功的&#xff0c;有时候可能会遇到代码冲突的问题。 为了演⽰这问题&#xff0c;创建⼀个新的分⽀ dev1 &#xff0c;并切换⾄⽬标分⽀&#xff0c;我们可以使⽤ git checkout - b dev1 ⼀步完成创建并切换的动作…

网卡收发包系统结构收发包流程,tcp/ip协议,socket套接字缓冲区,滑动窗口,mtu/mss

MTU和MSS的区别 MTU和MSS的区别 TCP 的 MTU & MSS MTU是在那一层&#xff1f;MSS在那一层&#xff1f; MTU是在数据链路层的载荷大小也就是传给网络层的大小&#xff0c;mss是在传输层的载荷大小也就是传给应用层的大小 mss是根据mtu得到的 1、MTU&#xff1a; Maximu…

矩阵置零(力扣)思维 JAVA

给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]] 输入&#xff1a;matrix [[0,1,2,0],[3,4,5,2],[…

Django项目之模型

Django项目之模型 创建环境配置连接MySQL数据库创建表单注册模型Django模型类查询模型类的条件查询聚合函数 创建环境 创建Django项目&#xff0c;创建usersapp&#xff0c;并在setting.py中注册 项目工作目录 配置连接MySQL数据库 修改/Djweb/Djweb/setting.py中DATABASE…

netty知识集锦2

粘包半包 粘包半包解决方案&#xff0c; 1短链接&#xff0c;它的消息边界是从链接建立到链接断开 2.定长解码器&#xff1a;服务器端选最大长度的消息作为定长&#xff0c;客户端不足补齐&#xff0c;缺点造成浪费 netty协议设计与解析 Message编码解码

[DASCTF 2023 0X401七月暑期挑战赛] REV1 controlflow复现

这东西没怎么研究过&#xff0c;不过很多人都完成了&#xff0c;不过这种比赛有很多应该是拿的别人的wp&#xff0c;所以减去些水份&#xff0c;赛后拿到一个wp是人c程序实现的。然后根据原代码还原一下加密流程。 首先是main 这里比较特殊&#xff0c;一开始的3个变量明显是加…