2、软中断事件的 handler 提前注册到 softirq 子系统, 注册方式open_softirq(softirq_id, handler) 例如,注册网卡收发包(RX/TX)软中断处理函数: // net/core/dev.c open_softirq(NET_TX_SOFTIRQ, net_tx_action); open_softirq(NET_RX_SOFTIRQ, net_rx_action); 3、软中断占 CPU 的总开销:可以用top查看...
softirqs 是在 Linux 内核编译时就确定好的,例如网络收包对应的 NET_RX_SOFTIRQ 软中断。因此是一种静态机制。如果想加一种新 softirq 类型,就需要修改并重新编译内核。 代码语言:javascript 代码运行次数:0 复制Cloud Studio 代码运行 heidsoft@heidsoft-dev:~$ systemd-cgls -k | grep kworker ├─ 8 [kwor...
2、软中断事件的 handler 提前注册到 softirq 子系统, 注册方式open_softirq(softirq_id, handler) 例如,注册网卡收发包(RX/TX)软中断处理函数: // net/core/dev.c open_softirq(NET_TX_SOFTIRQ, net_tx_action); open_softirq(NET_RX_SOFTIRQ, net_rx_action); 3、软中断占 CPU 的总开销:可以用top查看...
TIMER_SOFTIRQ,/* 时钟相关的软中断 */ NET_TX_SOFTIRQ,/* 将数据包传送到网卡 */ NET_RX_SOFTIRQ,/* 从网卡接收数据包 */ BLOCK_SOFTIRQ,/* 块设备的软中断 */ BLOCK_IOPOLL_SOFTIRQ,/* 支持IO轮询的块设备软中断 */ TASKLET_SOFTIRQ,/* 常规tasklet */ SCHED_SOFTIRQ,/* 调度程序软中断 */ HRTIM...
NET_TX_SOFTIRQ和NET_RX_SOFTIRQ是用于网卡数据收发的。BLOCK_SOFTIRQ和BLOCK_IOPOLL_SOFTIRQ是用于block device的。SCHED_SOFTIRQ用于多CPU之间的负载均衡的。HRTIMER_SOFTIRQ用于高精度timer的。RCU_SOFTIRQ是处理RCU的。这些具体使用情景分析会在各自的子系统中分析,本文只是描述softirq的工作原理。
open_softirq(NET_RX_SOFTIRQ, net_rx_action); 定义在:kernel/softirq.c文件中 voidopen_softirq(intnr,void(*action)(structsoftirq_action *)) { softirq_vec[nr].action = action; } 这个就是网络接收和发送的软中断,并关联两个函数net_tx_action和net_rx_action。软中断由softirq_action结构体表示, ...
TIMER_SOFTIRQ是for software timer的(所谓software timer就是说该timer是基于系统tick的)。NET_TX_SOFTIRQ和NET_RX_SOFTIRQ是用于网卡数据收发的。BLOCK_SOFTIRQ和BLOCK_IOPOLL_SOFTIRQ是用于block device的。SCHED_SOFTIRQ用于多CPU之间的负载均衡的。HRTIMER_SOFTIRQ用于高精度timer的。RCU_SOFTIRQ是处理RCU的。
系统中有哪些软中断(softirq队列里有什么),也是固定的,Linux Kernel中定义的软中断的定义如下:(linux/include/linux/interrupt.h)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...
net_dev_init函数(定义在net/core/dev.c),最注册软中断,如下: open_softirq(NET_TX_SOFTIRQ, net_tx_action); open_softirq(NET_RX_SOFTIRQ, net_rx_action); 定义在:kernel/softirq.c文件中 voidopen_softirq(intnr,void(*action)(structsoftirq_action *)) ...
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 }; (linux/kernel/softirq.c) 74 static void wakeup_softirqd(void) ...