Linux kernel 谁负责Napi计划

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调度时,我有一个疑问

通常,整个网络处理代码在softirq上下文中运行。使用NAPI轮询机制,驱动程序将在中断到达后轮询数据包

所以,如果NAPI代码也在softirq上下文中运行,那么如何安排它呢。(因为无法计划中断上下文代码)


网络驱动程序中工作队列的用途是什么

NAPI意义上的调度仅仅意味着将其标记为需要运行。换句话说,您只需进行函数调用,说“schedule me to run In the NAPI softirq”。这会将您的驱动程序轮询功能添加到“需要轮询”设备列表中,并会导致NAPI softirq在“退出”时被激活

所以它通常是这样工作的。您的驱动程序配置您的设备,让它在将来的某个时刻,当某些数据包(理想情况下不止一个,以便分摊开销)准备好进行处理时中断。同时,内核调度普通的用户空间进程

当设备中断时:

  • 如果尚未处于内核模式,中断会导致转换到内核模式
  • linux中断处理代码找到驱动程序的中断处理程序例程并调用它
  • 中断处理程序调用napi_计划(将轮询函数放在列表上并触发softirq)
  • 中断处理程序返回
  • 就在返回到用户模式(或CPU在中断之前所做的任何事情)之前,中断处理代码看到网络softirq需要运行并激活它
  • softirq调用您的轮询函数来处理传入的数据包,直到您没有更多的数据包或NAPI“预算”用完为止。(在后一种情况下,
    ksoftirqd
    线程[我认为]稍后会重新调用softirq。)
  • 然后,您的驱动程序只会在您的设备上重新启用中断,前提是它已经完成了所有准备处理的数据包的处理
根据我的经验,工作队列通常仅用于某些需要在可调度上下文中完成的长时间操作(即,在等待某项任务完成时可能阻塞[睡眠]的真实任务上下文)

例如,在“英特尔ixgbe驱动程序”中,如果驱动程序检测到NIC需要重置,则会触发一个工作队列条目以重新初始化NIC。某些操作需要较长的睡眠时间,如果可以让其他任务运行,则不希望将处理器束缚在softirq上下文中。可能还有其他原因--例如,您需要分配大量内存,这可能需要在任务上下文中进行分配调用