Chinaunix首页 | 论坛 | 博客
  • 博客访问: 21906
  • 博文数量: 5
  • 博客积分: 110
  • 博客等级: 入伍新兵
  • 技术积分: 60
  • 用 户 组: 普通用户
  • 注册时间: 2011-05-18 11:01
文章分类

全部博文(5)

文章存档

2011年(5)

我的朋友

分类:

2011-05-25 13:10:27

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) |
给主人留下些什么吧!~~