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
在4.18版本,这个函数有两个版本:一个是在include/linux/rwlock_rt.h;一个在:include/linux/rwlock.h;
这个类型需要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);
}
这个从网上找很多资料,这里不分析。
还牵扯到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出来。当然解决起来也简单。大家知道有这么回事,知道思路就可以。不用纠结。