Softirqs / tasklet据说是在中断上下文中执行的,我对下面的中断上下文有一半的问题。
Q1)如果我们尝试将睡眠放入tasklet(中断上下文的一半)会发生什么(考虑到tasklet由中断处理程序调度)。
[我的理解] 正如我所知,当调用tasklet_schedule时从中断处理程序出来它将获得获取tasklet_vec结构指针,如果当前没有其他中断/高优先级softirq正在进行中,它将调度ksoftirqd,它将运行处理程序(tasklet处理程序),如果是一个高的那个tasklet在这种情况下,处理程序使用sleep ksoftirqd将移动到wait_queue,除非并且直到调用另一个tasklet_schdule,否则我的中断tasklet hander将在该点继续。
我们说“中断上下文代码一定不能睡觉”(如果我在中断处理程序中使用sleep,考虑到我没有使用过spint锁或者我没有禁用定时器中断,会有什么后果)
(如果我的理解错误,请纠正我)
答案 0 :(得分:1)
Sleep仅在进程上下文中工作,而不在中断上下文中。在中断环境中,"当前"这不是一个有效的任务,所以我们可以让它进入睡眠状态并在以后唤醒它。如果你想睡觉,请使用线程
答案 1 :(得分:1)
如果您尝试在tasklet中睡眠,则会出现一个内核错误,指示原子上下文中的上下文切换。
在下半部分,它是中断上下文,并且是ksoftirqd中的进程上下文。
无论在下半部分还是ksoftirqd处理tasklet,thread_info->preempt_count
都不为零,这意味着原子上下文。