c - 如何在内核 Linux 中工作内核 irq 线程?
问题描述
我在 mmc 驱动程序中看到了devm_request_threaded_irq
用于启动的功能,sdhci_msm_pwr_irq
如下所示:
ret = devm_request_threaded_irq(&pdev->dev, msm_host->pwr_irq, NULL,
sdhci_msm_pwr_irq, IRQF_ONESHOT,
dev_name(&pdev->dev), host);
但是当我打电话时,rmmod
我没有看到这个 irq 线程的释放或停止。你能解释一下这个线程是如何工作的吗?
解决方案
删除sdhci-msm
模块会导致调用模块的module_exit
处理程序函数,该函数将调用platform_device_unregister
以取消将自身注册为平台设备驱动程序。module_platform_driver(sdhci_msm_driver);
(其中大部分被“drivers/mmc/host/sdhci-msm.c”中的宏调用隐藏。)
取消注册平台驱动程序后,所有成功探测的设备将被自动删除。sdhci_msm_remove
将为每个成功探测的设备自动调用驱动程序的“删除”处理程序。
所以你可能想知道为什么sdhci_msm_remove
不释放devm_request_threaded_irq
“probe”函数中调用分配的中断sdhci_msm_probe
?答案是不需要,因为中断被分配为“受管设备资源”(见下文)。
devm_request_threaded_irq
是围绕函数的“设备资源管理”(“devres”)包装器request_threaded_irq
。当被探测的设备被移除时,任何由 devres 管理的资源都会被自动清理。(devres 管理的资源的清理发生在“remove”处理程序返回之后。)对于 devres 管理的中断资源,清理导致free_irq
函数被自动调用以释放中断。
推荐阅读
- sql-server - 尝试运行 dtsx 文件 SSIS 时显示错误 15404?
- ocaml - 为什么会出现这种语法错误?外壳没有给定原因
- rust - 实现类型的引用添加
- javascript - 为什么我的 componentDidMount() 函数在我刷新页面时不会被触发,但在我第一次登陆页面时会起作用?
- html - Safari中混合字体的行高
- node.js - React - 拒绝加载脚本 Google Analytics 和 Stripe 脚本
- electron - 如果您在电子应用中有 TFF,您是否需要 WOFF
- python - 为什么发生异常时我的 MQTT 客户端无法重新连接
- python - 生成没有相同元素相邻的排列
- java - 你如何不使用 MixIn 渲染丢弃的项目