如何检查Linux内核中特定的IRQ是否被禁用?



我有一个关于Linux内核中的IRQ的问题。我使用request_threaded_irq()启用IRQ。但有时我们需要使用disable_irq()禁用IRQ。根据具体情况,可能需要再次启用它。在启用IRQ之前,是否可以检查某个IRQ是否已经启用?防止再次启用。是否有任何API来检查特定的IRQ是否启用或禁用?

当前Linux内核不提供此函数,但您可以在下游内核中提供自己的函数,如:

modified   include/linux/interrupt.h
@@ -244,6 +244,7 @@ bool irq_has_action(unsigned int irq);
extern void disable_irq_nosync(unsigned int irq);
extern bool disable_hardirq(unsigned int irq);
extern void disable_irq(unsigned int irq);
+extern int irq_state_disabled(unsigned int irq);
extern void disable_percpu_irq(unsigned int irq);
extern void enable_irq(unsigned int irq);
extern void enable_percpu_irq(unsigned int irq, unsigned int type);
modified   kernel/irq/manage.c
@@ -704,6 +704,22 @@ static int __disable_irq_nosync(unsigned int irq)
return 0;
}
+int irq_state_disabled(unsigned int irq)
+{
+        unsigned long flags;
+        bool ret;
+        struct irq_desc *desc =
+                irq_get_desc_buslock(irq, &flags, IRQ_GET_DESC_CHECK_GLOBAL);
+
+        if (!desc)
+                return -EINVAL;
+
+        ret = irqd_irq_disabled(&desc->irq_data);
+        irq_put_desc_busunlock(desc, flags);
+        return ret;
+}
+EXPORT_SYMBOL(irq_state_disabled);

最新更新