遇到了一个内核崩溃的问题,困恼了我很久,实力有限,一点办法也没有;
设备:mt7621,250 Hz频率
内核版本:linux-2.6.36.x
场景:
1,应用程序使用pthread_create开了400个线程,线程什么都不处理,使用usleep函数延时10ms运行;
2,内核使用一个定时器,周期为8ms,回调函数为for循环8次,每次调用ei_start_xmit发送一个自己定义的二层包,我这边测试8次都是发生一样的包;
现象:
运行10分钟或者半个小时内核就直接挂死;
每次都挂死再hrtime_run_queues函数的rb_erase函数中,提示说锁已经被释放;
还出现过一种现象是,我设备是两核两线程,用top看有四个cpu,其实有一个cpu直接跑死,表现出来的现象是在这个cpu上运行的所有程序都卡死在sleep函数,程序不会往下执行,其他核正常,cpu占用率不高,内存未泄露
说明:
为什么要开那么多线程呢是因为我本来有180个线程,里面有运行程序内容,内核使用中断10ms发是8个包,但是这样内核一至三天就会随机跑死,找不到原因,所以我就极限测试找问题
测试结果:
1,减少线程会拉长挂死时间,有时候需要一天才能出现,为了调试方便才做极限测试;
2,去掉线程保留中断处理也会挂死;去掉中断保留线程则不会挂死;
3,中断只调用一次ei_start_xmit也会挂死,挂死在函数dma_cache_sync,出错信息和图片一致,但是去掉dma_cache_sync这个函数就不挂死;