锁:实例分析,复制粘贴(copy/paste)导致的连续锁锁死(hang)
创始人
2024-03-24 20:59:57
0

文章目录

  • 参考
  • 实例链接
  • 现象
  • 原因
  • write_lock_bh
    • rt
    • 非 rt
  • 相关日志
  • 评议

参考

  1. queue spinlock https://lwn.net/Articles/719629/
  2. https://lwn.net/Articles/618497/
  3. https://lwn.net/Articles/227506/

实例链接

https://bugzilla.kernel.org/show_bhg.cgi?id=10002
wpa_supplicant doens’t work and froze the computer

现象

相关模块不工作,计算机hang住。其实解决也很简单:大家知道有这么回事,知道思路就可以。不用纠结。

原因

代码逻辑里有复制粘贴的错误:

+                       write_lock_bh(&dev_base_lock);
+                       dev->link_mode = nla_get_u8(tb[IFLA_LINKMODE]);
+                       write_lock_bh(&dev_base_lock);   //这里应为 unlock

write_lock_bh

在4.18版本,这个函数有两个版本:一个是在include/linux/rwlock_rt.h;一个在:include/linux/rwlock.h;

rt

这个类型需要PREEMPT_RT配置选项的支持;暂时用不到,先不看。
https://mzhan017.blog.csdn.net/article/details/127195445

static __always_inline void write_lock_bh(rwlock_t *rwlock)
{local_bh_disable();rt_write_lock(rwlock);
}

非 rt

这个从网上找很多资料,这里不分析。
还牵扯到CONFIG_PARAVIRT_SPINLOCKS,配置

#define write_lock_bh(lock)		_raw_write_lock_bh(lock)

相关日志

如果有这些调试信息的打印,对于问题的定位有些许的帮助;但是帮助不是很大。像这样的问题,如果暴力解题,就使用gitbisect 工具,二分法尝试所有进入的commit,看到底哪一个代码导致的问题,然后详细看代码。

static inline void debug_write_lock_before(rwlock_t *lock)
{RWLOCK_BUG_ON(lock->magic != RWLOCK_MAGIC, lock, "bad magic");RWLOCK_BUG_ON(lock->owner == current, lock, "recursion");RWLOCK_BUG_ON(lock->owner_cpu == raw_smp_processor_id(),	lock, "cpu recursion");
}static void rwlock_bug(rwlock_t *lock, const char *msg)
{if (!debug_locks_off())return;printk(KERN_EMERG "BUG: rwlock %s on CPU#%d, %s/%d, %p\n",msg, raw_smp_processor_id(), current->comm,task_pid_nr(current), lock);dump_stack();   、、、 会将当前的function trace 打印出来,但是实际导致问题的代码我们是dump不出来,也许可以将做锁操作的地方使用全局变量记录下来方便问题调试。
}

评议

这种问题来势汹汹,一下子就开出7-8个bug出来。当然解决起来也简单。大家知道有这么回事,知道思路就可以。不用纠结。

相关内容

热门资讯

每周股票复盘:日盈电子(603... 截至2025年12月26日收盘,日盈电子(603286)报收于59.5元,较上周的57.11元上涨4...
每周股票复盘:盐 田 港(00... 截至2025年12月26日收盘,盐 田 港(000088)报收于4.53元,较上周的4.52元上涨0...
每周股票复盘:广电网络(600... 截至2025年12月26日收盘,广电网络(600831)报收于4.2元,较上周的4.36元下跌3.6...
每周股票复盘:新疆火炬(603... 截至2025年12月26日收盘,新疆火炬(603080)报收于22.85元,较上周的22.73元上涨...
每周股票复盘:瀚川智能(688... 截至2025年12月26日收盘,瀚川智能(688022)报收于15.3元,较上周的14.42元上涨6...
每周股票复盘:中粮糖业(600... 截至2025年12月26日收盘,中粮糖业(600737)报收于17.27元,较上周的17.18元上涨...
每周股票复盘:马钢股份(600... 截至2025年12月26日收盘,马钢股份(600808)报收于4.22元,较上周的3.82元上涨10...
每周股票复盘:内蒙一机(600... 截至2025年12月26日收盘,内蒙一机(600967)报收于16.34元,较上周的16.05元上涨...
富达基金投顾业务负责人戴旻:封... 由三亚市人民政府主办,《财经》杂志、财经网、《财经智库》、三亚中央商务区管理局、三亚经济研究院承办的...
海南大谷国际园区董事长张焱:以... 由三亚市人民政府主办,《财经》杂志、财经网、《财经智库》、三亚中央商务区管理局、三亚经济研究院承办的...