在这里插入图片描述

[toc]

bust_spinlocks:在 oops/panic 等路径放宽“控制台/日志相关锁约束”,保证关键日志可达

作用与实现原理

  • yes != 0:进入 oops/panic 类路径,递增 oops_in_progress,表示系统正处在异常打印阶段。
  • yes == 0:退出异常打印阶段,调用 console_unblank() 尝试唤醒/点亮控制台;递减 oops_in_progress,当其回到 0 时唤醒日志守护线程(传统实现中为 klogd 相关等待队列)。

该函数名中的 “bust spinlocks” 的含义是:异常阶段可能有锁/状态阻止日志输出,该函数通过提升 oops_in_progress 等全局状态让相关路径避免在锁上阻塞或放宽某些限制,从而提高“panic/oops 信息可达性”。


bust_spinlocks

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
* @brief 在 oops/panic 等异常路径中切换“允许输出关键日志”的模式。
*
* @param yes 非 0 表示进入异常输出阶段;0 表示退出异常输出阶段。
*
* @note 该函数依赖全局计数 oops_in_progress 来表达“异常输出阶段的嵌套深度”。
* 采用计数而非布尔值可避免嵌套 oops/panic 场景下状态提前恢复。
*/
void bust_spinlocks(int yes)
{
if (yes) {
++oops_in_progress; /**< 进入异常输出阶段:递增嵌套计数,通知控制台/printk 放宽限制以保证日志输出。 */
} else {
console_unblank(); /**< 退出阶段前尝试唤醒控制台显示/输出通路,避免关键信息被“黑屏/空白终端”掩盖。 */
if (--oops_in_progress == 0)
wake_up_klogd(); /**< 当异常输出嵌套完全结束时,唤醒等待日志的线程/等待队列以恢复常规日志处理。 */
}
}