首页 > 解决方案 > 如何在内核 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 线程的释放或停止。你能解释一下这个线程是如何工作的吗?

标签: clinux-kernellinux-device-drivermmc

解决方案


删除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函数被自动调用以释放中断。


推荐阅读