call_rcu() (是对__call_rcu()的封装)、call_rcu_bh() (ditto)、rcu_check_callbacks()、rcu_process_callbacks()(是对 __rcu_process_callbacks()的封装)、rcu_pending() (是对__rcu_pending()的封装)、rcu_needs_cpu()、rcu_cpu_notify()和__rcu_init()。
rcu_check_callbacks()函数实现如下: 代码语言:javascript 代码运行次数:0 运行 AI代码解释 voidrcu_check_callbacks(int cpu,int user){if(user||(idle_cpu(cpu)&&!in_softirq()&&hardirq_count()<=(1<<HARDIRQ_SHIFT))){RCU_qsctr(cpu)++;}tasklet_schedule(&RCU_tasklet(cpu));// 这里会调用 rcu_...
这些函数在调度器、__do_softirq()和rcu_check_callbacks()中被调用。后面这个函数在调度时钟中断中调用,并分析状态以确定中断是否发生在一个静止状态中,以确定是调用rcu_qsctr_inc()或者 rcu_bh_qsctr_inc()。它也触发RCU_SOFTIRQ软中断,并导致当前CPU在随后的软中断上下文中调用rcu_process_callbacks(),rcu_...
函数rcu_check_callbacks首先检查该CPU是否经历了一个quiescent state,如果: 1. 当前进程运行在用户态; 或 2. 当前进程为idle且当前不处在运行softirq状态,也不处在运行IRQ处理函数的状态; 那么,该CPU已经经历了一个quiescent state,因此通过调用函数rcu_qsctr_inc标记该CPU的数据结构rcu_data和rcu_bh_data的标记...
可以看到由于cpu2的rcu_data的curlist为空,而nxtlist不为空,所以返回1表示需要进行RCU处理,于是调用rcu_check_callbacks函数,其函数实现如下图所示。 void rcu_check_callbacks(int cpu, int user) { if (user || (idle_cpu(cpu) && !in_softirq() && ...
函数rcu_check_callbacks首先检查该CPU是否经历了一个quiescent state,如果: 1. 当前进程运行在用户态; 或 2. 当前进程为idle且当前不处在运行softirq状态,也不处在运行IRQ处理函数的状态; 那么,该CPU已经经历了一个quiescent state,因此通过调用函数rcu_qsctr_inc标记该CPU的数据结构rcu_data和rcu_bh_data的标记...
函数rcu_check_callbacks首先检查该CPU是否经历了一个quiescent state,如果: 1. 当前进程运行在用户态; 或 2. 当前进程为idle且当前不处在运行softirq状态,也不处在运行IRQ处理函数的状态; 那么,该CPU已经经历了一个quiescent state,因此通过调用函数rcu_qsctr_inc标记该CPU的数据结构rcu_data和rcu_bh_data的标记...
这些函数在调度器、__do_softirq()和rcu_check_callbacks()中被调用。后面这个函数在调度时钟中断中调用,并分析状态以确定中断是否发生在一个静止状态中,以确定是调用rcu_qsctr_inc()或者 rcu_bh_qsctr_inc()。它也触发RCU_SOFTIRQ软中断,并导致当前CPU在随后的软中断上下文中调用rcu_process_callbacks(),rcu_...
rcu_check_callbacks(cpu, user_ticks); 。。。 } void rcu_check_callbacks(int cpu, int user) { if (user || (idle_cpu(cpu) && !in_softirq() && hardirq_count() <= (1 << HARDIRQ_SHIFT))) RCU_qsctr(cpu)++; tasklet_schedule(&RCU_tasklet(cpu)); } tasklet_schedule(&RCU_tasklet(...
__rcu_check_callbacks(rsp, cpu); } 这个函数的主要任务: 更新当前CPU的动态时钟状态。 对每种RCU风格(如RCU-bh、RCU-sched等)调用__rcu_check_callbacks()。 static void __rcu_check_callbacks(struct rcu_state *rsp, int cpu) { struct rcu_data *rdp = per_cpu_ptr(rsp->rda, cpu); if (che...