__do_softirq函数处理软件中断过程如下图流程分析 4. 首先调用local_softirq_pending函数取得目前有哪些位存在软件中断 5. 调用__local_bh_disable关闭软中断,其实就是设置正在处理软件中断标记,在同一个CPU上使得不能重入__do_softirq函数 6. 重新设置软中断标记为0,set_softirq_pending重新设置软中断标记为0,这样...
内核调度器调度到ksoftirqd内核线程时,会将所有等待处理的 deferred interrupt(也就是 softirq)拿出来,执行对应的处理方法(softirq handler); 以收包软中断为例, IRQ handler 并不执行 NAPI,只是触发它,在里面会执行到 raise NET_RX_SOFTIRQ;真正的执行在 softirq,里面会调用网卡的 poll() 方法收包。IRQ handler ...
__do_softirq函数处理软件中断过程如下图流程分析 4. 首先调用local_softirq_pending函数取得目前有哪些位存在软件中断 5. 调用__local_bh_disable关闭软中断,其实就是设置正在处理软件中断标记,在同一个CPU上使得不能重入__do_softirq函数 6. 重新设置软中断标记为0,set_softirq_pending重新设置软中断标记为0,这样...
account_irq_enter_time(current);// 关闭软中断,实质是设置正在处理软件的中断标记,在同一个CPU上使得不能重入_do_softirq函数__local_bh_disable_ip(_RET_IP_, SOFTIRQ_OFFSET); in_hardirq = lockdep_softirq_start(); restart:/* Reset the pending bitmask before enabling irqs */// 重新设置软中断标...
void raise_softirq(unsigned int nr) 实际上即以软中断类型nr作为偏移量置位每cpu变量irq_stat[cpu_id]的成员变量__softirq_pending,这也是同一类型软中断可以在多个cpu上并行运行的根本原因。 软中断执行函数 do_softirq-->__do_softirq 执行软中断处理函数__do_softirq前首先要满足两个条件: ...
该内核线程被唤醒后,会调用local_softirq_pending()检查软中断位掩码,如果必要检查do_softirq()函数。 也就是说,ksoftirqd内核线程是时间维度上的一种平衡策略。 软中断函数也可以重新激活自身。实际上,网络软中断和tasklet软中断就是这样做的。更重要的是,外部事件,比如网卡上的数据包泛滥也可以频繁地激活软中断。
1、当调用local_bh_enable()函数激活本地CPU的软中断时。条件满足就调用do_softirq() 来处理软中断。 2、当do_IRQ()完成硬中断处理时调用irq_exit()时调用do_softirq()来处理软中断。 3、当一个特殊内核线程ksoftirq/n被唤醒时,处理软中断。 软中断处理函数详解: ...
startup_kernel->rest_init->kernel_init->kernel_init_freeable->do_basic_setup(); 而do_basic_setup函数会进行驱动设置。会通过调用net_dev_init函数。 net_dev_init函数(定义在net/core/dev.c),最注册软中断,如下: open_softirq(NET_TX_SOFTIRQ, net_tx_action); ...
kernel/smpboot.c 里面的代码首先调用 ksoftirqd_should_run 判断是否有 pending 的软中断,如果有,就执行 run_ksoftirqd,后者做一些 bookeeping 工作,然后调用 __do_softirq。 __do_softirq 做的几件事情: 判断哪个 softirq 被 pending 计算softirq 时间,用于统计 ...
open_softirq(NET_RX_SOFTIRQ, net_rx_action); } subsys_initcall(net_dev_init); 在这个函数里,会为每个 CPU 都申请一个 softnet_data 数据结构,在这个数据结构里的 poll_list 是等待驱动程序将其 poll 函数注册进来,稍后网卡驱动初始化的时候我们可以看到这一过程。