分类: LINUX
2011-07-14 12:24:06
1)rcu在设计上,rcu函数被安全执行的三个条件(满足其中任意一个就称此CPU处于quiescent state):
The CPU performs a process switch. The CPU starts executing in User Mode. The CPU executes the idle loop. |
2)实现如下:
时钟中断中:
void rcu_check_callbacks(int cpu, int user)
{
if (user /* 第二个条件 */ ||
(idle_cpu(cpu) && !in_softirq() && hardirq_count() <= (1 << HARDIRQ_SHIFT)))
/* 第三个条件 */
{
rcu_qsctr_inc(cpu); /* 设置本CPU的rdp->passed_quiesc */
rcu_bh_qsctr_inc(cpu);
} else if (!in_softirq())
rcu_bh_qsctr_inc(cpu);
tasklet_schedule(&per_cpu(rcu_tasklet, cpu));
}
schedule()中:
rcu_qsctr_inc(cpu); /* 第三个条件 */
当所有online的cpu都经过了这样一个quiescent state后,call_rcu()加入的函数才会被执行。
3) 这样就存在一些可能,使得内核长时间不能进入quiescent state状态:当某个cpu忙于在内核态或软中断之中奔命的时候,就可能长时间不能进入quiescent state;
解决办法:软中断线程化