Linux kernel 谁负责Napi计划
在阅读网络驱动程序中的NAPI调度时,我有一个疑问 通常,整个网络处理代码在softirq上下文中运行。使用NAPI轮询机制,驱动程序将在中断到达后轮询数据包 所以,如果NAPI代码也在softirq上下文中运行,那么如何安排它呢。(因为无法计划中断上下文代码)Linux kernel 谁负责Napi计划,linux-kernel,linux-device-driver,scheduler,computer-architecture,smp,Linux Kernel,Linux Device Driver,Scheduler,Computer Architecture,Smp,在阅读网络驱动程序中的NAPI调度时,我有一个疑问 通常,整个网络处理代码在softirq上下文中运行。使用NAPI轮询机制,驱动程序将在中断到达后轮询数据包 所以,如果NAPI代码也在softirq上下文中运行,那么如何安排它呢。(因为无法计划中断上下文代码) 网络驱动程序中工作队列的用途是什么 NAPI意义上的调度仅仅意味着将其标记为需要运行。换句话说,您只需进行函数调用,说“schedule me to run In the NAPI softirq”。这会将您的驱动程序轮询功能添加到“需
网络驱动程序中工作队列的用途是什么 NAPI意义上的调度仅仅意味着将其标记为需要运行。换句话说,您只需进行函数调用,说“schedule me to run In the NAPI softirq”。这会将您的驱动程序轮询功能添加到“需要轮询”设备列表中,并会导致NAPI softirq在“退出”时被激活 所以它通常是这样工作的。您的驱动程序配置您的设备,让它在将来的某个时刻,当某些数据包(理想情况下不止一个,以便分摊开销)准备好进行处理时中断。同时,内核调度普通的用户空间进程 当设备中断时:
- 如果尚未处于内核模式,中断会导致转换到内核模式
- linux中断处理代码找到驱动程序的中断处理程序例程并调用它
- 中断处理程序调用napi_计划(将轮询函数放在列表上并触发softirq)
- 中断处理程序返回
- 就在返回到用户模式(或CPU在中断之前所做的任何事情)之前,中断处理代码看到网络softirq需要运行并激活它
- softirq调用您的轮询函数来处理传入的数据包,直到您没有更多的数据包或NAPI“预算”用完为止。(在后一种情况下,
线程[我认为]稍后会重新调用softirq。)ksoftirqd
- 然后,您的驱动程序只会在您的设备上重新启用中断,前提是它已经完成了所有准备处理的数据包的处理