linux——spin_lock注意事项

发布时间 2023-04-18 15:05:30作者: 爱喝拿铁

【问题描述】

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会一直被占用

【后续计划】

开展压力测试消除这类问题风险;

【官网守则】

  1. 进程上下文使用互斥锁;
  2. 其他情况(在中断中数据可被确认)使用spin_lock_irqsave()/spin_unlock_irqsave();
  3. 自旋锁保护的临界区语句不超过5行,且不调用任何函数;