在分析softirq框架时,我们按照数据结构+算法拆开来分析(转载请标明出处)
一、抛开代码细节,聊聊软中断关键的数据结构
在上一章介绍中,我们看到了程序员是如何通过上下部机制来压榨CPU的剩余价值。
里面提到了上下部分机制的理解——上半部记录,下半部处理,软中断设计思路就按照这个中心思想来
我们抛开代码细节逻辑,先看看软中断需要哪些信息才能正常工作
1.之前提到了上下半部工作机制,上半部主要工作就是记录
那么我们首先需要一个数据结构来保存这个信息,上半部记录到我们需要处理什么,下半部拿到记录信息,逐个处理待处理的任务,这个记录的数据结构就是嵌入到irq_stat中的__softirq_pending变量,__softirq_pending每一位表示一类软中断,irq_stat是一个每CPU变量。相关代码如下
DEFINE_PER_CPU_ALIGNED(irq_cpustat_t, irq_stat)
typedef struct {
unsigned int __softirq_pending;
unsigned int ipi_irqsp[NR_IPI];
} ____cacheline_aligned irq_cpustat_t;
2.在__softirq_pending中纪录下来需要处理那些软中断后,具体要做哪些工作,也需要一个数据结构来保存,softirq使用了一个函数指针数组softirq_vec来保存具体要做哪些事情
struct softirq_action
{
void (*action)(struct softirq_action *);
};
enum
{
HI_SOFTIRQ=0,
TIMER_SOFTIRQ,
NET_TX_SOFTIRQ,
NET_RX_SOFTIRQ,
BLOCK_SOFTIRQ,
IRQ_POLL_SOFTIRQ,
TASKLET_SOFTIRQ,
SCHED_SOFTIRQ,
HRTIMER_SOFTIRQ,
RCU_SOFTIRQ, /* Preferable RCU should always be the last softirq */
NR_SOFTIRQS
};
static struct softirq_action softirq_vec[NR_SOFTIRQS] __cacheline_aligned_in_smp;
3.在处理软中断与硬件中断类似,在软中断处理过程中,虽然可以响应硬件中断,但是不应该被抢占的,而且有时候