free_irq之后,/ proc / interrupt文件中出现中断

时间:2015-02-06 15:33:18

标签: linux-kernel

我已经使用

注册了一个中断
/* Request INT and set the handler*/
err = request_irq(irq_num, gpio_irq_handler, IRQF_TRIGGER_LOW  | IRQF_SHARED, "Test_IRQ", dev);

当我退出模块时,我使用

释放它
free_irq(irq_num, dev);

我面临的问题是中断永远不会从/ proc / interrupts文件中清除

我在这里注册了gpio的中断

root@lolly:~# insmod isr.ko 
root@lolly:~# cat /proc/interrupts 
           CPU0       CPU1       
165:        701          0         -   5  Test_IRQ
Err:          0

我删除模块,中断是免费的

root@lolly:~# rmmod isr.ko 
root@lolly:~# cat /proc/interrupts 
           CPU0       CPU1       
165:        701          0         -   5
Err:          0

但我找到了条目和计数

我再次加载模块

root@lolly:~# insmod isr.ko 
root@lolly:~# cat /proc/interrupts 
           CPU0       CPU1       
165:        702          0         -   5  Test_IRQ
Err:          0

我看到计数仍不为零

我造成102次中断

root@lolly:~# cat /proc/interrupts 
           CPU0       CPU1       
165:        804          0         -   5  Test_IRQ
Err:          0
root@lolly:~# 

但是这个数字递增了

这种行为是否正确?我希望在释放IRQ时中断条目消失,再次加载时从零开始计数

请问我的观察结果可以纠正我吗?

1 个答案:

答案 0 :(得分:0)

我还没有在内核中使用过中断,但我花了一些时间查看内核搜索。

remove_irq函数基本上只调用__free_irq

在此功能中,会发生以下情况:

  1. 搜索并找到要删除的处理程序
  2. 删除处理程序
  3. irq_pm_remove_action被调用,它与/proc无关。
  4. 如果没有更多处理程序(desc->action == NULL),irq_shutdown被调用,这是特定于arch的(在x86上没有做任何事情)并且与/proc无关
  5. unregister_handler_proc被调用,但如果绝对没有中断报告,这似乎只会尝试删除/proc/interrupts
  6. 停止IRQ线程(你不使用它)并移除模块(如果它仍在内存中(即使在rmmod之后),因为处理程序仍然在内存中(我猜))。
  7. show_interrupts函数确实checks是否存在任何处理程序。所以回答你的第一个问题:

      

    这种行为是否正确?

    不,你不应该看到那个中断,因为没有人再加上它了。

    如果我猜测,是否有可能在模块的早期版本中忘记remove_irq,所以先前安装的irq处理程序会留在内核中?重启可以解决这个问题。

    请注意,通过查找IRQF_SHARED指针remove_irq中断dev。因此,如果您在没有remove_irq的情况下删除该模块,则没有删除处理程序的非破解方法。