【问题标题】:Can I use free_irq in a software interrupt context?我可以在软件中断上下文中使用 free_irq 吗?
【发布时间】:2013-10-21 18:20:31
【问题描述】:

内核文档中关于free_irq 的内容如下:

这个函数不能从中断上下文中调用。

它是否包括软件中断? 如何在软件 IRQ 函数中释放 IRQ?

感谢您的帮助,

【问题讨论】:

    标签: c linux-kernel irq


    【解决方案1】:

    是的,该规则包括软中断上下文。您认为需要从 softirq 上下文调用 free_irq() 的事实表明您的设计有点不同寻常——在正常情况下,free_irq() 在设备关闭时使用,这几乎总是来自进程上下文。

    但是,如果您真的需要这样做,则可以通过schedule_work() 或一些类似的工作队列函数将其推迟到处理上下文。当然,您不能在 softirq 中等待延迟的工作完成,因此您还必须推迟释放 IRQ 之后的任何其他工作。

    如果您提供更多关于您为什么尝试从中断上下文调用free_irq() 的信息,可能会给出更好的答案。

    【讨论】:

    • 我做了一个变通方法,可以通过 de 'schedule_work()' 操作显着改进。因为'schedule_work()' 对this document 来说是非阻塞的,所以我的softirq 不必等待,不是吗?我唯一的限制是确保 free_irq 在下一次打开之前已经运行,我认为这可以通过 open 函数中的“flush_work”来完成。
    • 当然,schedule_work() 是非阻塞的——我的意思是如果你需要释放 IRQ,那么你必须等待它。至于“de 'schedule_work()' operation”,cancel_schedule_work() 是你想要的吗?
    • 我没有使用默认的工作队列,所以对应的函数是queue_work()和flush_work()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-29
    • 1970-01-01
    • 2017-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多