还需要置上软中断位图__softirq_pending的相应位,表示有软中断发生,才能在软中断中处理。
置位软中断位图是由函数rcu_sched_qs和rcu_bh_qs完成的,定义在kernel\rcutiny.c。
109:void rcu_sched_qs(int cpu)
110:{
111: if (rcu_qsctr_help(&rcu_ctrlblk) + rcu_qsctr_help(&rcu_bh_ctrlblk))
112: raise_softirq(RCU_SOFTIRQ);
113:}
118:void rcu_bh_qs(int cpu)
119:{
120: if (rcu_qsctr_help(&rcu_bh_ctrlblk))
121: raise_softirq(RCU_SOFTIRQ);
122:}
raise_softirq最终会调用raise_softirq_irqoff,在分析tasklet时看过这个函数。
rcu_qsctr_help判断rcu_ctrlblk和rcu_bh_ctrlblk的队列上是否挂有函数,定义在kernel\rcutiny.c。
088:static int rcu_qsctr_help(struct rcu_ctrlblk *rcp)
089:{
090: unsigned long flags;
092: local_irq_save(flags);
093: if (rcp->rcucblist != NULL &&
094: rcp->donetail != rcp->curtail) {
095: rcp->donetail = rcp->curtail;
096: local_irq_restore(flags);
097: return 1;
098: }
099: local_irq_restore(flags);
101: return 0;
102:}
rcu_sched_qs判断rcu_ctrlblk和rcu_bh_ctrlblk的队列上是否挂有函数,如果有,置位软中断位图。
rcu_bh_qs仅判断rcu_bh_ctrlblk的队列上是否挂有函数,如果有,置位软中断位图。
【 在 four3ger (3ger) 的大作中提到: 】
: RCU(Read-Copy Update)是一种锁的机制,逐渐被广泛使用。
: 内核以两种方式实现了RCU机制,复杂点的在kernel\rcutree.c,简单点的在kernel\rcutiny.c。
: 可以通过配置CONFIG_TREE_RCU和CONFIG_TINY_RCU来选择。
: ...................
--
蝎子,蝎子,我爱你
[m [35m※ 来源:·水木社区 http://newsmth.net·[FROM: 59.64.161.*] [m
再看一下何时调用rcu_bh_qs
1. 软中断处理__do_softirq每处理完一种类型的软中断。只要__do_softirq处理了软中断,就处理挂在队列rcu_bh_ctrlblk上的函数
还有一些地方调用rcu_sched_qs或者rcu_bh_qs,和时钟相关。
【 在 four3ger (3ger) 的大作中提到: 】
: 将函数挂到rcu_ctrlblk和rcu_bh_ctrlblk的队列上后,函数还不能在软中断中执行。
: 还需要置上软中断位图__softirq_pending的相应位,表示有软中断发生,才能在软中断中处理。
: 置位软中断位图是由函数rcu_sched_qs和rcu_bh_qs完成的,定义在kernel\rcutiny.c。
: ...................
--
蝎子,蝎子,我爱你
[36m※ 修改:·four3ger 于 Apr 28 18:49:42 2011 修改本文·[FROM: 59.64.161.*] [m
[m [36m※ 来源:·水木社区 http://newsmth.net·[FROM: 59.64.161.*] [m
"深入理解linux内核"指出5个地方
1. 调用local_bh_enable或者local_bh_enable_ip激活软中断时
2. do_IRQ完成硬中断处理调用irq_exit退出时,以及其他调用irq_exit的地方
3. 如果系统使用I/O APIC,当smp_apic_timer_interrupt处理完本地定时器中断时(会调用irq_exit)
4. 在多处理系统中,当cpu处理完处理器间中断所触发的函数时(可能也是调用irq_exit)
5. 内核线程ksoftirqd被唤醒时
还有1个地方,调用netif_rx_ni处理skb,会先调用netif_rx处理skb,之后就调用软中断处理函数,可能是为了尽快处理skb。
【 在 four3ger (3ger) 的大作中提到: 】
: 先看一下何时调用rcu_sched_qs
: 1. 进程调度schedule一开始的时候
: 2. 内核线程ksoftirqd每次调用do_softirq处理软中断之前,保证处理挂在队列rcu_ctrlblk和rcu_bh_ctrlblk上的函数
: ...................
--
蝎子,蝎子,我爱你
[36m※ 修改:·four3ger 于 Apr 28 19:49:18 2011 修改本文·[FROM: 59.64.161.*] [m