【问题标题】:How to work kernel irq thread in kernel Linux?如何在内核 Linux 中工作内核 irq 线程?
【发布时间】:2020-03-20 14:29:32
【问题描述】:

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

【问题讨论】:

    标签: c linux-kernel linux-device-driver mmc


    【解决方案1】:

    删除sdhci-msm 模块会导致调用模块的module_exit 处理函数,该函数将调用platform_device_unregister 将自身注销为平台设备驱动程序。 (其中大部分被“drivers/mmc/host/sdhci-msm.c”中的宏调用 module_platform_driver(sdhci_msm_driver); 隐藏。)

    取消注册平台驱动程序后,所有成功探测的设备将被自动删除。将为每个成功探测的设备自动调用驱动程序的“删除”处理程序sdhci_msm_remove

    所以你可能想知道为什么sdhci_msm_remove 不释放由“探测”函数sdhci_msm_probe 中的devm_request_threaded_irq 调用分配的中断?答案是不需要,因为中断被分配为“托管设备资源”(见下文)。

    devm_request_threaded_irq 是围绕request_threaded_irq 函数的“设备资源管理”(“devres”)包装器。当被探测的设备被移除时,任何由 devres 管理的资源都会被自动清理。 (devres 管理的资源的清理发生在“remove”处理程序返回之后。)对于 devres 管理的中断资源,清理会导致自动调用 free_irq 函数以释放中断。

    【讨论】:

    • 当我在重新启动后运行(并且未加载驱动程序)insmod mmc_host_module.ko 函数sdhci_msm_pwr_irq() 没有直接运行但是当我执行rmmod mmc_host_moduleinsmod mmc_host_module.ko 时出现错误,因为sdhci_msm_pwr_irq() 直接在执行init_completion(&msm_host->pwr_irq_completion); 之前,所以我在sdhci_msm_pwr_irq(...) 中调用了与complete(&msm_host->pwr_irq_completion); 相关的崩溃,因此我在尝试创建msm-host->pwr_irq 的free_irq 时询问free_irq 工作人员我得到了在 rmmod 上也崩溃
    • @developer 如果您直接在 devres 管理的中断上调用 free_irq,则该中断将被释放两次——一次由您释放,一次在设备移除时的 devres 清理期间释放。因此,如果您需要手动释放中断,请改为调用devm_free_irq
    • @IanAbbott,最初的问题是 devm_*_irq() 的错误使用,即这一系列函数被错误地转换为支持 devres,而人们在大多数情况下都错误地理解了它。正确的解决方法是将托管调用替换为普通调用。
    • @0andriy vanilla 内核中的 sdhci 代码仍然使用 devres。 AOSP 添加了所有可能引入了一些不兼容性的 pwr_irq_completion 废话。
    • @IanAbbott,是的,它支持我在上一条评论中第一句话的第二部分,即人们在大多数情况下都误认为
    猜你喜欢
    • 1970-01-01
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    • 2012-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多