是什么时候在ISR计划之后运行tasklet?

我写了我的ISR,我的tasklet立即运行。 但是 ,我看到有人说tasklet只有在CPU受到关注时才运行。 这是一个非常通用的术语CPU注意,所以我背诵这些响应者。 我的意思是在哪个时刻CPU注意到tasklet的执行和CPU状态发生了什么?

其次,如果假设我继续进行硬中断,那么tasklet有机会运行的时候呢? tasklet可能没有机会运行吗? 内核如何处理这些事情?

Solutions Collecting From Web of "是什么时候在ISR计划之后运行tasklet?"

TL; DR:Tasklet由Scheduler处理的ksoftirq线程运行。


Tasklet只是一个softirq (它由TASKLET_SOFTIRQ优先级处理)的形式,所以运行tasklet时的规则适用于它们。 在这里,他们根据Robert Love的书“Linux coreel Development”

  1. 在从硬件中断代码路径返回
  2. ksoftirq内核线程中
  3. 在任何明确检查并执行未决softirq的代码中,如联网子系统

如果threadirqs=true (内核启动参数)是默认值,那么情况(1)似乎不起作用。


UPD :有关与Scheduler的ksoftirq关系的一些说明。

这似乎是发生的事情:

  1. hardirq处理程序中,唤醒了ksoftirq (由于tasklet_schedule()
  2. 因此, wake_up_process()检查ksoftirq是否可以抢占当前线程
  3. 如果(2)为真,则设置TIF_NEED_RESCHED标志
  4. hardirq返回( ret_from_intr – 在x86中) TIF_NEED_RESCHED标志被选中
  5. 如果(4)为真, schedule()被调用来挑选下一个要执行的线程。

ksoftirq在(2-3)中被认为是抢占候选的可能性很高,在(5)中被选中,但是如果有竞争者, ksoftirq必须等到下一个schedule()循环 – 当前线程投降(即睡眠),时钟滴答发生,系统调用或新的中断。