我有一个简单的内核模块,用于与.compatible相关联的基于ARM的嵌入式系统。如我们所知,在一个设备树中可以出现多个".compatibles",并且将为每个匹配的节点调用.probe。
我找不到.probe函数是否可以由内核(!)同时调用的准确信息。如果在设备树中出现多个适当的.compatible,则不会出现。阅读内核驱动程序的任何源代码都让我确信它不能(同时被调用),尽管我还没有在.probes中看到锁。
我从https://www.kernel.org/doc/Documentation/driver-model/design-patterns.txt
上读到:
内核包含一些设备驱动程序,这些驱动程序假设它们只在某个系统(单例)上被探测()一次,但自定义假设驱动程序绑定的设备将在几个实例中出现。这意味着探测()函数和所有回调都需要重入。
但是这看起来与热插拔或类似的东西有关(如果我错了,请纠正我),而我的问题只是关于节点的处理。
我已经发现了platform_driver.driver,中的.probe_type,它可以设置为,但不确定它是否是关于我所需要的(如果我错了,请纠正我)。
如果可以同步/并发地调用.probe,则必须实现一些锁定,并最终使这个例程重新进入。
请有人告诉我链接/文档/章节,在那里我可以读到.probe机制是如何实现的,或者给我一个确切的答案。
发布于 2022-04-21 08:31:08
我的案子的答案很简单:
.probe_type = PROBE_FORCE_SYNCHRONOUS
将使内核在每个发现的.probes上逐个调用of_node。
.probe_type = PROBE_PREFER_ASYNCHRONOUS
将使内核同时调用.probes。
我是怎么做到的。我在文档或博客/论坛上找不到这些信息。因此,我的.probe函数延迟了一秒钟,在DT中添加了两个带有of_nodes的.compatible,并通过测量加载模块所需的时间(PROBE_FORCE_SYNCHRONOUS和PROBE_PREFER_ASYNCHRONOUS)对其进行了测试。
这些测试的结果看起来很清楚: PROBE_FORCE_SYNCHRONOUS需要2秒来加载模块,而PROBE_PREFER_ASYNCHRONOUS则需要1秒。
因此,答案是:是的,可以同时调用.probes,但是我们有控制它的机制。
顺便说一句,谢谢你的答复
https://stackoverflow.com/questions/70743354
复制相似问题