![[Android稳定性] 第038篇 [问题篇] 在workqueue中取消自身导致的workqueue自锁](https://hexoimg.oss-cn-shanghai.aliyuncs.com/blog/25/4/cover_android_stability_038.png)
[Android稳定性] 第038篇 [问题篇] 在workqueue中取消自身导致的workqueue自锁
### 一、问题背景 在441#-AS1-KKX_0411版本高低温运行测试后,出现工模卡死现象,需手动组合键进入dump。日志分析显示,卡死时刻多个线程处于D状态,包括batterysecret、charge_logger、xm_charge_work和fsa4480_usbc_analog_work_fn等。这些线程都在等待同一个IIO mutex,导致锁争用。 ### 二、根本原因 reverse_charge_monitor_workfunc函数在执行过程中,调用了iio_write_channel_raw函数,该函数持有iio_dev的mlock锁。随后,该函数又调用了smblib_handle_reverse_charge_event函数,该函数中包含cancel_delayed_work_sync(&self)操作,导致当前work无法退出,陷入死锁状态。 ### 三、解决方案 1. 修改reverse_charge_monitor_workfunc函数,将smblib_handle_reverse_charge_event函数的调用移至mutex_unlock(iio_dev->mlock)之后。 2. 考虑使用其他同步机制,如信号量或事件,避免锁争用。 ### 四、总结 通过分析日志和追踪源码,发现卡死现象是由reverse_charge_monitor_workfunc函数中的死锁导致的。通过修改函数调用顺序和使用其他同步机制,可以解决此问题。