searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

kernel divide error问题排查介绍

2023-07-03 07:26:53
46
0

运维反映某环境宿主机crash,机器已重启恢复,需要尽快查明crash原因,接到任务后,迅速查看crash日志发现是divide error造成的,错误日志如图-1所示,这可是个严重的错误。

图-1

 

分析了相关错误日志后,定位到错误代码是intel的cpuidle/governors驱动的错误,具体错误位置如图-2所示,thresh被赋值为INT_MAX, 在for循环中比较data->intervals[i]的值时,data->intervals数组中的值都大于INT_MAX, if判断失败,造成sum和divisor都为0;进而造成后续sum/divisor时,除数是0,引发错误。

图-2

分析crash文件,发现出错时data->intervals数组中所有值都是4294967293,大于INT_MAX, 进一步确认出错位置。

图-3

 

由于出问题的操作系统出自openeuler,查看openeluer对此代码的修改历史,发现此问题已修复,

图-4

但运行的系统的版本是还没有合入此patch时的代码,合入此patch后问题解决。

在分析此patch的进一步前因后果时,发现其实是openeuler在合入patch时漏掉了此patch,后续补上造成的,openeuler在4年前的patch引入了bug(图-6),在2年前修复此patch(图-4)。 提交历史见图-5。

图-5

图-6

而在upstream中是先提交的图-4, 再提交的图-6,所以upstream不存在问题,openeuler由于打patch的顺序存在问题,造成了中间版本存在问题。

0条评论
0 / 1000
刘强
6文章数
2粉丝数
刘强
6 文章 | 2 粉丝
原创

kernel divide error问题排查介绍

2023-07-03 07:26:53
46
0

运维反映某环境宿主机crash,机器已重启恢复,需要尽快查明crash原因,接到任务后,迅速查看crash日志发现是divide error造成的,错误日志如图-1所示,这可是个严重的错误。

图-1

 

分析了相关错误日志后,定位到错误代码是intel的cpuidle/governors驱动的错误,具体错误位置如图-2所示,thresh被赋值为INT_MAX, 在for循环中比较data->intervals[i]的值时,data->intervals数组中的值都大于INT_MAX, if判断失败,造成sum和divisor都为0;进而造成后续sum/divisor时,除数是0,引发错误。

图-2

分析crash文件,发现出错时data->intervals数组中所有值都是4294967293,大于INT_MAX, 进一步确认出错位置。

图-3

 

由于出问题的操作系统出自openeuler,查看openeluer对此代码的修改历史,发现此问题已修复,

图-4

但运行的系统的版本是还没有合入此patch时的代码,合入此patch后问题解决。

在分析此patch的进一步前因后果时,发现其实是openeuler在合入patch时漏掉了此patch,后续补上造成的,openeuler在4年前的patch引入了bug(图-6),在2年前修复此patch(图-4)。 提交历史见图-5。

图-5

图-6

而在upstream中是先提交的图-4, 再提交的图-6,所以upstream不存在问题,openeuler由于打patch的顺序存在问题,造成了中间版本存在问题。

文章来自个人专栏
内核
6 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0