我有一个关于 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);