rcu_gp_in_progress()) /* 如果没有在宽限期(grace period),说明没有在rcu临界区,那就不需要做rcu stall的check */ 1382 return; 1383 rcu_stall_kick_kthreads(); 1384 j = jiffies; ··· 1404 gs1 = READ_ONCE(rcu_state.gp_seq); /* 第一次读取宽限期sequence*/ 1405 smp_rmb(); /* ...
rcu_gp_in_progress(rsp) rcu_gp_in_progress(rsp)|---returnrsp->completed != rsp->gpnum; rcu_start_gp(struct rcu_state *rsp, unsigned int flags) rcu_start_gp(structrcu_state *rsp, unsignedintflags)|--->rsp->gpnum++;//grace period序号加1|---rsp->signaled =RCU_GP_INIT;|---rsp...
低2bit表示状态,若不为0表示GP正在处理,见 rcu_gp_in_progress() 中判断。此三个结构都有这个成员。 gp_max: 目前系统上经历过的最长的宽限期的时间,单位jiffies,宽限期线程中取 max(gp_end-gp_start) 的值。 gp_kthread: 指向宽限期内核线程,函数体为 rcu_gp_kthread。每种都RCU创建了一个宽限期...
d = RCU_STALL_MIGHT_MIN; smp_mb(); // jiffies before .gp_seq to avoid false positives.if (!rcu_gp_in_progress()) return false; // Long delays at this point avoids false positive, but a delay // of ULONG_MAX/4 jiffies voids your no-false-positive warranty.smp...
/* Remove outgoing CPU from mask in the leaf rcu_node structure. */ mask = rdp->grpmask; local_irq_save(seq_flags); arch_spin_lock(&rcu_state.ofl_lock); raw_spin_lock_irqsave_rcu_node(rnp, flags); /* Enforce GP memory-order guarantee. */ rdp->rcu_ofl_gp_seq = READ_ONCE(r...
force_quiescent_state()函数实现一个三阶段的状态机。第一个阶段 (RCU_INITIALIZING)等待rcu_start_gp()完成对优雅周期的初始化。这个状态不是从force_quiescent_state()退出,就是从rcu_start_gp()退出。 在第二阶段(RCU_SAVE_DYNTICK),dyntick_save_progress_counter()函数扫描还没有报告静止状态的CPU,记录它...
[ 2940.645672] rcu: 2-...: (14797 ticks this GP) idle=5ba/1/0x4000000000000000 softirq=34828/34830 fqs=7126 [ 2940.645684] (t=15000 jiffies g=63853 q=7232) [ 2940.645690] NMI backtrace for cpu 2 [ 2940.645694] CPU: 2 PID: 21227 Comm: hl_gtest Tainted: P OE 5.13.0-40-generic...
看一眼rcu_report_qs_rsp会发现,其中有一个重要的赋值 static void rcu_report_qs_rsp(struct rcu_state *rsp, unsigned long flags) __releases(rcu_get_root(rsp)-lock) { WARN_ON_ONCE(!rcu_gp_in_progress(rsp)); rsp-completed = rsp-gpnum; rsp-signaled = RCU_GP_IDLE; rcu_start_gp(rsp,...
1476 如果非READ_ONCE(Commands for GP task. )则 1478 raw_spin_unlock_irq_rcu_node(rnp) 1479 返回:false 1481 WRITE_ONCE(Commands for GP task. , 0) 1483 如果WARN_ON_ONCE(Return true if an RCU grace period is in progress. The READ_ONCE()s* permit this function to be invoked ...
force_quiescent_state()函数实现一个三阶段的状态机。第一个阶段 (RCU_INITIALIZING)等待rcu_start_gp()完成对优雅周期的初始化。这个状态不是从force_quiescent_state()退出,就是从rcu_start_gp()退出。 在第二阶段(RCU_SAVE_DYNTICK),dyntick_save_progress_counter()函数扫描还没有报告静止状态的CPU,记录它...