硬件中断需要做尽可能少的事情,多时间要求不严的事情,交给中断下半部分去做。有三种不同形式的下半部实现机制:软中断、tasklet、工作队列。
软中断
内核定义了下面的软中断类型,用户尽量不要自己去创建软中断类型
enum
{
HI_SOFTIRQ=0,
TIMER_SOFTIRQ,
NET_TX_SOFTIRQ,
NET_RX_SOFTIRQ,
BLOCK_SOFTIRQ,
BLOCK_IOPOLL_SOFTIRQ,
TASKLET_SOFTIRQ,
SCHED_SOFTIRQ,
HRTIMER_SOFTIRQ,
RCU_SOFTIRQ, /* Preferable RCU should always be the last softirq */
NR_SOFTIRQS
};
软中断中的tasklet 用于执行延迟任务,相同类型的tasklet 按照顺序执行,不同的tasklet 可以在多核中并行执行。保证一个cpu 执行一个tasklet 。
softirq_init()函数
static DEFINE_PER_CPU(struct tasklet_head, tasklet_vec);
static DEFINE_PER_CPU(struct tasklet_head, tasklet_hi_vec);
DEFINE_PER_CPU(struct list_head [NR_SOFTIRQS], softirq_work_list);
1.在软中断初始化函数中,先要为每个cpu初始化2个链表以处理tasklet和一个工作列表
2.注册执行热插拔时执行的回调函数remote_softirq_cpu_notifier
3.为TASKLET_SOFTIRQ,HI_SOFTIRQ 类型的软中断注册回调函数
tasklet_action,tasklet_hi_action
主要函数
1.remote_softirq_cpu_notify
2.tasklet_action
3.tasklet_hi_action