linux——spin_lock注意事项
【问题描述】
spin_lock/spin_lock_irqsave 保护的临界区内禁止调用可能使CPU睡眠/发生调度的函数(包括但不限于ioremap/mutex/semaphore等),否则可能出现死锁引起CPU挂死等问题。
CPU挂死问题在编码压力测试下出现,经过排查和复测已明确是上述原因导致;上周前端反馈出现VB申请不到打印后,CPU立即挂死,原因也是ISP驱动内部也出现上述问题导致。
【解决方案】
需确保spin_lock保护的临界区内容为原子操作
- 临界区内容精简,仅包含加减或逻辑操作;
- 确认临界区内容是否真的全部需要保护,可将不需要保护的内容移出到spin_lock外;
- 对于调用函数需确认是否可能引起CPU调度,若把握不准,可统一认为该函数可能引起调度进行处理,即将其移出spin_lock临界区;
spin_lock保护的临界区若需要再做互斥保护,保险起见,仍使用spin_lock,但需要注意效率问题,spin_lock为自旋,CPU会一直被占用
【后续计划】
开展压力测试消除这类问题风险;
【官网守则】
- 进程上下文使用互斥锁;
- 其他情况(在中断中数据可被确认)使用spin_lock_irqsave()/spin_unlock_irqsave();
- 自旋锁保护的临界区语句不超过5行,且不调用任何函数;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)