g7075 f0x0 RCU_GP_WAIT_FQS(3) ->state=0x1 ->cpu=5 Unless rcu_sched kthread gets sufficient CPU time, OOM is now expected behavior. 使CPU 时间的宽限期 kthread 饿死当然会导致 RCU CPU 停顿警告,即使所有 CPU 和任务都已通过所需的静止状态。
其中标志 RCU_GP_FLAG_INIT 表示需要启动新的宽限期,RCU_GP_FLAG_FQS 表示需要强制静止状态。 gp_state: 宽限期线程的睡眠状态。 RCU_GP_IDLE: 没有宽限期, RCU_GP_WAIT_GPS: 等待宽限期的开始, RCU_GP_DONE_GPS: 停止等待宽限期开始, RCU_GP_WAIT_FQS: 等待强制静止状态时刻, RCU_GP_DOING_FQS...
rcu_gp_fqs(first_gp_fqs); first_gp_fqs = false; trace_rcu_grace_period(rcu_state.name, READ_ONCE(rcu_state.gp_seq), TPS("fqsend")); cond_resched_tasks_rcu_qs(); WRITE_ONCE(rcu_state.gp_activity, jiffies); ret = 0; /* Force full wait till next FQS. */ ...
* "reqwait": GP kthread sleeps waiting for grace-period request. * "reqwaitsig": GP kthread awakened by signal from reqwait state. * "fqswait": GP kthread waiting until time to force quiescent states. * "fqsstart": GP kthread starts forcing...
rda 数组是每一个CPU的rcu_data结构指针。rcu_state也包含一定数量的,与当前优雅周期相关的字段,以及与其他机制交互的字段(signaled、gpnum、completed、onofflock、fqslock、jiffies_force_qs、n_force_qs、n_force_qs_lh、n_force_qs_ngp、gp_start、jiffies_stall、and dynticks_completed)。
* "reqwait": GP kthread sleeps waiting for grace-period request. * "reqwaitsig": GP kthread awakened by signal from reqwait state. * "fqswait": GP kthread waiting until time to force quiescent states. * "fqsstart": GP kthread starts forcing quiescent states. ...
[17:41:22] [ 67.257281] rcu_preempt kthread starved for 2102 jiffies! g1197 c1196 f0x0 RCU_GP_WAIT_FQS(3) ->state=0x402 ->cpu=1 [17:41:22] [ 67.268211] rcu_preempt I 0 8 2 0x00000000 [17:41:22] [ 67.273961] Backtrace: ...
g633 f0x0RCU_GP_WAIT_FQS(5) ->state=0x402->cpu=4[61.291452] rcu: RCU grace-period kthread stack dump: [61.291467] rcu_sched I01020x80000000[61.291468] Call Trace: [61.291475] ? __schedule+0x2a2/0x870[61.291476] schedule+0x28/0x80[61.291478] schedule_timeout+0x16b/0x390[61.291480]...
g20409 f0x2 RCU_GP_WAIT_FQS(5) ->state=0x200 [ 94.691925] rcu: Possible timer handling issue on cpu=0 timer-softirq=1664 [ 94.691929] rcu: rcu_sched kthread starved for 59998 jiffies! g20409 f0x2 RCU_GP_WAIT_FQS(5) ->state=0x200 ->cpu=0 [ 94.691936] rcu: Unless rcu_...
关键点来了:Tree RCU使用rcu_node节点来构造层级结构,进而管理静止状态Quiescent State和宽限期Grace Period,静止状态信息QS是从每个CPU的rcu_data往上传递到根节点的,而宽限期GP信息是通过根节点从上往下传递的,当每个CPU经历过一次QS状态后,宽限期结束 ...