3.5.6 bh移植到tasklet

    Linux2.2中,对中断的后半部分处理只提供了bh机制,而在2.4中新增加了两种机制:软中断和tasklet。通过上面的介绍我们知道,同一个软中断服务例程可以同时在不同的CPU上运行。为了提高SMP的性能,软中断现在主要用在网络子系统中。多个tasklet可以在多个不同的CPU上运行,但一个CPU一次只能处理一个taskletBh由内核进行了串行化处理,也就是在SPM环境中,某一时刻,一个bh函数只能由一个CPU来执行。如果要把Linux2.2中的bh移植到2.4tasklet,请按下面方法进行:

 

1Linux2.4中对bh的处理

  假设一个bhFOO_BHFOO表示任意一个),其处理函数为foo_bh,则

  1)处理函数的原型为:  void foo_bh(void);

  2)通过init_bh(FOO_BH, foo_bh)函数对foo_bh进行初始化

  3)通过mark_bh(FOO_BH)函数提出对foo_bh()的执行请求。

 

2.把bh移植到tasklet

 

 1)处理函数的原型为:void foo_bh(unsigned long data);

 2)通过宏 DECLARE_TASKLET_DISABLED(foo_tasklet, foo_bh, 0)

struct tasklet_struct foo_tasklet;

tasklet_init(&foo_tasklet, foo_bh, 0);

tasklet_disable(&foo_tasklet);

     foo_tasklet进行初始化

3)通过

     tasklet_enable(&foo_tasklet);

     tasklet_schedule(&foo_tasklet)

     foo_tasklet进行调度。