1.3.10内核,在项目中遇到一种情况,我们根据sk指针hash到一个cpu上,然后访问该cpu对应分配的一个数据区。

然后系统会偶尔crash掉,crash掉有两种情况,一种是cred的rcu回收时出现计数bugon,一种是hung,

hung的这种一般是由于由一个持有mutex的进程在rttable的resize过程中synchronize_rcu() 出现等待gp,而另外一个进程也需要这把mutex的锁。

继续排查发现等待gp是因为synchronize_rcu() 自身的这个rcu没有及时处理,导致没有调用wakeup,

这种rcu还在对应的链中,也就是rcu出现累积,有的是几十万个rcu没有执行,有的甚至上千万个。在开启rcuo内核线程的代码中(RCU_NOCB),可以看到对应的线程

处于一种不干活的状态,

tatic int rcu_nocb_kthread(void *arg)
{
。。。
while (list) {
next = list->next;
/* Wait for enqueuing to complete, if needed. */
while (next == NULL && &list->next != tail) {----------什么情况下会在这里循环
schedule_timeout_interruptible(1);
next = list->next;
}
debug_rcu_head_unqueue(list);
local_bh_disable();
if (__rcu_reclaim(rdp->rsp->name, list))
cl++;
c++;
local_bh_enable();
list = next;
}
。。。。
}

很显然,原本的第二个while,应该只是一个无锁设计,也就是临时状态,但是从crash文件看,这里形成死循环了。

这种死循环,导致了后面的 __rcu_reclaim 并没有执行,从而导致rcu积压。

回过头来看,while循环的原因是因为,rcu_head的next指向NULL,同时它又不是最后一个rcu。

也就是rcu的串被破坏了,破坏的原因不是因为踩内存,而是因为,我们由一个流程有问题,导致同一个rcu_head被call_rcu了两次。

后面的问题我想大家也容易分析了,不过我们还遇到了两种情况,一种是,在同一个cpu上,同一个rcu_head被call_rcu了两次,

另外一种,是在两个cpu上分别执行,形成了环。

2.在suse 11 sp3上,遇到一种rcu链被破坏的情况,rcu的func指针指向莫名的数据段地址,导致oops,另外一个crash是出现的put_cred的bugon,因为计数不对。两种

crash都是因为rcu的链被异常破坏,如果是1这种情况的破坏是因为自己代码没写好,那么2这种其实是因为xfs的一个bug,排查耗了很多时间,

如果你排查过程中遇到rcu的qlen为负值(也就是不该执行的rcu执行了,会导致rcu_data的关于qlen的计数会错的),并且开启了slab或者slub的debug的话,

最还还需要开启CONGFIG_PAGEALLOC和STACKOVERFLOW的开关,kmem -s 看到slab一片正常的时候,你需要怀疑,是不是xfs的bug,因为,我踩坑了。

最新文章

  1. Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part3:db安装和升级
  2. 【Java并发编程实战】----- AQS(四):CLH同步队列
  3. Failed to stop iptables.service: Unit iptables.service not loaded.
  4. String字符串针对常量池的优化
  5. Python基础7:文件操作
  6. GDC 2016 神秘海域4中使用Substance制作Texture
  7. C++ 之高效使用STL ( STL 算法分类)
  8. POJ 1185 状态压缩DP 炮兵阵地
  9. Angularjs 日期格式转换
  10. CSS实现页面背景自动切换功能
  11. [NYLG-OJ] 77 开灯问题(白书例题)
  12. python爬虫之获取验证码登陆
  13. ABP module-zero +AdminLTE+Bootstrap Table+jQuery权限管理系统第十三节--RBAC模式及ABP权限管理(附送福利)
  14. Picnic Planning POJ - 1639(最小k度生成树)
  15. Camera Binning Mode
  16. CentOS yum 安装 Apache + PHP + MySQL
  17. (15)Python时间
  18. 【iCore1S 双核心板_FPGA】例程十一:Modelsim仿真实验
  19. Python中数据类型
  20. httpclient的简单使用

热门文章

  1. FastDFS 技术整理
  2. 深入C++04:模板编程
  3. iPhone x 的区别
  4. HIPPO-4J 1.3.0 正式发布:支持 Dubbo、RibbitMQ、RocketMQ 框架线程池
  5. iNeuOS工业互联网操作系统,增加搜索应用、多数据源绑定、视图背景设置颜色、多级别文件夹、组合及拆分图元
  6. kubernetes code-generator使用
  7. 使用Vite2+TypeScript4+Vue3技术栈,如何入手开发项目
  8. 从svn下载项目后出现 Error:java: Compilation failed: internaljava compiler error 解决办法
  9. OWL页面创建Copy功能,把选择内容复制到QC
  10. 多校联训 DP 专题