/* 最高优先级软中断 */TIMER_SOFTIRQ,/* Timer定时器软中断 */NET_TX_SOFTIRQ,/* 发送网络数据包软中断 */NET_RX_SOFTIRQ,/* 接收网络数据包软中断 */BLOCK_SOFTIRQ,/* 块设备软中断 */IRQ_POLL_SOFTIRQ,/* 块设备软中断 */TASKLET_SOFTIRQ,/* tasklet软中断 */SCHED_SOFTIRQ,/* 进程调度及负载...
DEFINE_PER_CPU(struct tasklet_head, tasklet_vec)为每个CPU都分配了tasklet_head结构,该结构用来维护struct tasklet_struct链表,需要放到该CPU上运行的tasklet将会添加到该结构的链表中,内核中为每个CPU维护了两个链表tasklet_vec和tasklet_vec_hi,对应两个不同的优先级,本文以tasklet_vec为例; struct tasklet_struct...
voidtasklet_schedule(structtasklet_struct *t);//参数说明t:要安排执行的 Tasklet。 4、tasklet_disable 和 tasklet_enable:这两个函数用于禁用和启用 Tasklet。禁用 Tasklet 后,即使调用 tasklet_schedule 也不会立即执行 Tasklet。它们的原型如下: voidtasklet_disable(structtasklet_struct *t);voidtasklet_enable(...
DEFINE_PER_CPU(struct tasklet_head, tasklet_vec)为每个CPU都分配了tasklet_head结构,该结构用来维护struct tasklet_struct链表,需要放到该CPU上运行的tasklet将会添加到该结构的链表中,内核中为每个CPU维护了两个链表tasklet_vec和tasklet_vec_hi,对应两个不同的优先级,本文以tasklet_vec为例; struct tasklet_struct...
softirq_vec[]数组,类比硬件中断描述符表irq_desc[],通过软中断号可以找到对应的handler进行处理,比如图中的tasklet_action就是一个实际的handler函数; 软中断可以在不同的CPU上并行运行,在同一个CPU上只能串行执行; 每个CPU维护irq_cpustat_t状态结构,当某个软中断需要进行处理时,会将该结构体中的__softirq_pend...
硬件的中断处理函数处于中断上半部分,在CPU关中断的状态下执行,中断线程、软中断(softirq)及小任务(tasklet)属于中断的下半部分(bottom half)在CPU开中断的状态下执行。小任务基于软中断实现,实质是对软中断的进一步封装, 在实际使用中应尽量使用小任务 。软中断及小任务的执行时机通常是中断上半部分返回(中断服务函...
TASKLET_SOFTIRQ, /* tasklet软中断 */ SCHED_SOFTIRQ, /* 进程调度及负载均衡的软中断 */ HRTIMER_SOFTIRQ, /* Unused, but kept as tools rely on thenumbering. Sigh! */ RCU_SOFTIRQ, /* Preferable RCU should always be the last softirq, RCU相关的软中断 */ ...
2、为何有softirq和tasklet OK,linux kernel已经把中断处理分成了top half和bottom half,看起来已经不错了,那为何还要提供softirq、tasklet和workqueue这些bottom half机制,linux kernel本来就够复杂了,bottom half还来添乱。实际上,在早期的linux kernel还真是只有一个bottom half机制,简称BH,简单好用,但是性能不佳。后...
softirq 和 tasklet 依赖软中断子系统,运行在软中断上下文中; workqueue 不依赖软中断子系统,运行在进程上下文中。 softirq 前面已经看到, Linux 在每个 CPU 上会创建一个 ksoftirqd 内核线程。 softirqs 是在 Linux 内核编译时就确定好的,例外网络收包对应的 ...
其中HI_SOFTIRQ和TASKLET_SOFTIRQ用来实现tasklet,NET_TX_SOFTIRQ和NET_RX_SOFTIRQ用于网络的发送和接受操作,TIMER_SOFTIRQ和HRTIMER_SOFTIRQ用于定时器,前者是低精度的定时器,后者是高精度的定时器。BLOCK_SOFTIRQ和BLOCK_IOPOLL_SOFTIRQ用于块设置操作,SCHED_SOFTIRQ用于调度方面的操作,RCU_SOFTIRQ用于rcu方面的操作。这些...