1. insmod 模块报“operation not permitted”,很快出现panic 信息
此问题最终原因是模块初始化时接口返回值混乱导致,实际上此模块已经成功插入到内核,但是因为返回值混乱,导致判断是插入模块失败,因此当前内核模块退出,但此内核模块注册到内核的过程没有被正确卸载,在使用时直接因为没有可用的代码段导致panic
2. panic 时报rcu_preempt self-detected stall on CPU
此问题最终原因是内核死锁。有两个过程需要同步,一个是报文收发软中断,另一个是命令下发过程(进程上下文),代码中使用spin_lock 同步。
在命令下发过程中,锁已经获取,但恰好此时有一个软中断到来,打断了命令下发过程,而且在软中断过程中需要获取相同的锁,此锁已经被命令下属过程占住,因此导致死锁。解决方法很简单,在命令下发过程中禁止软中断,即使用spin_lock_bh 同步
转自http://blog.csdn.net/wdq347/article/details/39641551