kenel中一个bug搞得郁闷了好几天,描述一下以备忘:
kernel:2.6.30
现象:在2440上一个程序偶尔会不能彻底退出,处于一种奇怪状态,非僵尸,vsz为0。
分析:vsz为零表示进程确实已执行了退出动作。该进程的wchan为down_interruptible表示该进程目前在等待一个semaphore内核锁。
于是开始费力查找,按照常规路数,相信kernel其他部分没问题,注意力主要放在驱动上,找来找去最后发现在音频驱动中关闭音频设备时要用down_interruptible来检查是否所有已经提交给dma的buffer是否已经发送完毕(buffer在提交前用down_interruptible对buffer加锁,完毕后的通知的中断处理程序用up解锁),就在这儿偶尔会拿不到锁而等待。
但为什么大多数时候这儿最终都能拿到锁而只有极少情况拿不到呢?最后发现凡是调用s3c2410_dma_ctrl(dma,S3C2410_DMAOP_FLUSH)函数就会出错,再进去跟到s3c2410_dma_flush(...)函数发现该函数中的一个bug:
s3c2410_dma_ctrl(chan->number, S3C2410_DMAOP_STOP)应该改为s3c2410_dma_ctrl(chan->number | DMACH_LOW_LEVEL, S3C2410_DMAOP_STOP)才对。
哈哈,很高兴,问题解决了,更郁闷的事来了。在网上搜了下,发现早就有人发现了这个bug了,但官方kernel 2.6.38中看发现该bug还未修正。
结论:1:要相信kernel, 但不要盲从它。
2:发现问题先到网上看看有没人遇到并以解决该问题,要相信人民群众的眼睛是雪亮的。
3: 如果网上搜不到,就到牛论坛上发个帖问一下,高手们还是乐意帮你解决问题的。
4: 实在没办法,要相信自己的能力,自己动手干掉他。
阅读(945) | 评论(0) | 转发(0) |