硬中断处理
- 数据帧首先到达网卡的接收队列,分配RingBuffer
- DMA把数据搬运到网卡关联的内存
- 网卡向CPU发起硬中断,通知CPU有数据
- 调用驱动注册的硬中断处理函数
- 启动NAPI,触发软中断
上一分析说到网卡硬中断注册的函数igb_msix_ring
static irqreturn_t igb_msix_ring(int irq, void *data)
{
struct igb_q_vector *q_vector = data;
/* Write the ITR value calculated from the previous interrupt. */
igb_write_itr(q_vector);
napi_schedule(&q_vector->napi);
return IRQ_HANDLED;
}
igb_write_itr仅记录硬件中断频率
static inline void ____napi_schedule(struct softnet_data *sd,
struct napi_struct *napi)
{
list_add_tail(&napi->poll_list, &sd->poll_list);
//触发一个软中断NET_RX_SOFTIRQ
__raise_softirq_irqoff(NET_RX_SOFTIRQ);
}
- list_add_tail修改了napi的poll_list(双向链表,数据帧等着被处理),
- 触发一个软中断NET_RX_SOFTIRQ
- 网络包硬中断的工作到此结束。
软中断处理
判断softirq_pending标志
st