时钟中断导致的内核模块死锁

   这篇文章是对这几天找的一个BUG的总结,如果理解上有不对的地方,或者有更好的建议,希望看到的朋友能够指出。
  问题是这样的:内核模块中有一个哈希表来维护模块中管理的连接,哈希表是用一个读写锁数组来互斥的,每个锁管理一段哈希表槽位。模块中的处理主要有这几个分支:NF_INET_LOCAL_IN和NF_INET_POST_ROUTING两个钩子点的处理函数,一个是定时器处理函数fcluster_timer_process()。死锁出现在两个地方是在定时器处理函数fcluster_timer_process()中获取写锁时一直阻塞,导致占有CPU时间过长,引发softlockup机制的处理,触发panic操作。
   遇到死锁的问题,首先肯定是怀疑自己的代码逻辑中出现了纰漏,所以再次仔细地检查了代码逻辑,发现不会出现没有释放锁的情况。接下来在代码中添加调试信息,在获取锁的时候进行统计,并且在可能导致没有释放锁的地方都加了调试信息,但是还是没有发现问题。内核开发中遇到这样的问题,真是很头疼。内核太庞大了,就算你的逻辑没问题,也有可能因为对内核机制的某些情况不了解导致操作的时机不对。在用户层应用程序中,有gdb可以查看栈信息,单步调试可以看到执行的逻辑,在内核中有很多东西都要靠源码来分析。现在我把最先想到,也是大部分人都会做的两步操作都做了,而且重复了多次,但是依然找不到问题原因,这时心中真是很烦,很不知所措,不知道下一步该怎么做。
  问题还在,也不能什么也不做,一次次地修改添加调试信息的位置,一次次地打印一些参数和变量的值,但是依然没有进展。在测试的过程中我发现了一个系统参数softlock_panic,可以在内核线程占有CPU时间过长的情况下执行p
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Ubuntu内核中,死锁是指当多个线程或进程同时持有资源,并且互相等待对方释放资源时发生的一种情况。死锁通常是由于资源分配的顺序不当或者互斥锁的使用不正确引起的。当死锁发生时,系统的进程或线程将无法继续执行,导致系统无响应。 在Linux内核中,为了避免死锁的发生,使用了自旋锁和非自旋锁(如semaphore或mutex)两种锁机制。自旋锁是一种忙等待的锁,当一个线程无法获取锁时,它会一直在一个循环中自旋等待,直到获取到锁为止。而非自旋锁在获取不到锁的时候会进入阻塞状态,从而进入内核态。然而,使用非自旋锁会导致线程从用户态和内核态之间频繁切换,影响锁的性能。 因此,在Ubuntu内核中,为了避免死锁并提高锁的性能,可以考虑使用自旋锁来保护共享数据。自旋锁适合用于只有进程上下文访问的场景,而在同时涉及中断上下文和进程上下文的场景下,则需要谨慎选择适当的锁机制,以避免死锁的发生。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Linux驱动之 内核最常见的自旋锁及死锁示例](https://blog.csdn.net/qq_52858062/article/details/116397144)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [Linux内核 自旋锁spin lock,教你如何用自旋锁让ubuntu死锁](https://blog.csdn.net/daocaokafei/article/details/108266526)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值