- 论坛徽章:
- 0
|
本帖最后由 wzw200 于 2015-02-03 21:04 编辑
也就是中断返回后。如何保证原先执行的软中断 还在本来执行的cpu上执行。也就是说我对中断“谁触发谁执行”的特性产生了疑问
我先回这个问题,不知道我说的对不对,
do_softirq 这个函数是所有CPU都可以调用的
你再向下跟代码就会发现tasklet_hi_action之类的函数里面都用了每CPU变量
用tasklet_schedule函数都加到每CPU变量里面了
中断返回后,别的CPU也只是执行自己 每CPU变量的 BH,多CPU的就不是一个变量,你想想,会冲突吗,
不知道你明白了没有
open_softirq(NET_TX_SOFTIRQ, net_tx_action);
open_softirq(NET_RX_SOFTIRQ, net_rx_action);
open_softirq(HRTIMER_SOFTIRQ, run_hrtimer_softirq);
open_softirq(int nr, void (*action)(struct softirq_action *))
open_softirq(TASKLET_SOFTIRQ, tasklet_action);
open_softirq(HI_SOFTIRQ, tasklet_hi_action);
open_softirq(TIMER_SOFTIRQ, run_timer_softirq);
深入Linux设备驱动程序内核机制.pdf 这本书的
第6章 tasklet,你看明白了,就知道了
http://
www.
cnblogs.com/hustcat/archive/2009/08/15/1546601.html
YY哥的中断三编,你可以看看
因为软中断变量是 per cpu的32位数 这个不是每CPU变量
softirq_vec 不是每CPU变量
raise_softirq_irqoff-》__raise_softirq_irqoff(nr)-》or_softirq_pending-再向下跟,pending是每CPU变量
tasklet_hi_action的链表是每CPU变量
do_softirq
{
查看自己的每CPU变量pending
tasklet_hi_action
开始用每CPU变量
} |
|