📄 interrupt.h.txt
字号:
any question,send email to netxiong@263.net
*********************************基本的数据结构*************************************
(1):struct softirq_action
{
void (*action)(struct softirq_action *);
void *data;
};
bottom half的处理函数的位置,其中的action就是相对于irq_stat中的相应的处理函数。
enum
{
HI_SOFTIRQ=0,
NET_TX_SOFTIRQ,
NET_RX_SOFTIRQ,
TASKLET_SOFTIRQ //嵌套tasklet结构。
};
目前irq_stat共有四项,用open_softirq来进行初始化。
这个数据结构提供给open_softirq来进行初始化。
enum {
TIMER_BH = 0,
TQUEUE_BH,
DIGI_BH,
SERIAL_BH,
RISCOM8_BH,
SPECIALIX_BH,
AURORA_BH,
ESP_BH,
SCSI_BH,
IMMEDIATE_BH,
CYCLADES_BH,
CM206_BH,
JS_BH,
MACSERIAL_BH,
ISICOM_BH
};
enum
{
TASKLET_STATE_SCHED, /* Tasklet is scheduled for execution */
TASKLET_STATE_RUN /* Tasklet is running (SMP only) */
};
这里有三个enum的定义,实际上是一个迁套的结构.
struct tasklet_struct
{
struct tasklet_struct *next;
unsigned long state;
atomic_t count;
void (*func)(unsigned long); //处理函数。
unsigned long data; //处理函数的参数。
};
struct tasklet_head
{
struct tasklet_struct *list;
} __attribute__ ((__aligned__(SMP_CACHE_BYTES)));
以上这两个结构,下面的是构成tasklet_vec[NR_CPUS]的结构,也就是相对于每一个CPU一个的结构,从而组成了tasklet队列。队列中的每一个成员的结构都是tasklet_struct型的。
************************************************************************************
********************************对active位进行设置的位******************************
(1):static inline void mark_bh(int nr)
仅仅调用tasklet_hi_schedule(bh_task_vec+nr);
###注意:这里的mark_bh和原来的mark_bh有着本质的区别,正是这个mark_bh把原来的bh_base和现在的tasklet联系了起来。实际上现在的bh_base处理函数都归结到了taslet_hi_action中去了。只要对HI_SOFTIRQ置位,就执行tasklet_hi_action,也就执行了连接在tasklet_hi_vec之后的链表中去了。
(2):static inline void tasklet_hi_schedule(struct tasklet_struct *t)
t->next = tasklet_hi_vec[cpu].list;
tasklet_hi_vec[cpu].list = t;
__cpu_raise_softirq(cpu, HI_SOFTIRQ); //这个函数设置HI_SOFTIRQ位。
(3):static inline void __cpu_raise_softirq(int cpu, int nr)
softirq_active(cpu) |= (1<<nr); //设置相应的位。1<<nr就是对相应的位置1。
************************************************************************************
********************************将tasklet加入到tasklet队列中的函数*******************
这里的tasklet就是一个等待bottom half处理的tasklet_struct结构的变量。
(1):static inline void tasklet_schedule(struct tasklet_struct *t)
t->next = tasklet_vec[cpu].list;
tasklet_vec[cpu].list = t; //将新的tasklet_strcut结构加入到链表中去。
__cpu_raise_softirq(cpu, TASKLET_SOFTIRQ); //对相应的位置位。
(2):static inline void tasklet_hi_schedule(struct tasklet_struct *t)
两者的实现方法一样。
*************************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -