中断上下文(Softirq或tasklets)

Softirqs / tasklets据说是在中断环境中执行的,我有下面关于中断环境下半部分的问题。

Q1)如果我们试图将睡眠放入tasklet(中断上下文中的一半)会发生什么情况(考虑中断处理程序调度tasklet)。

[我的理解]正如我所知,当调用tasklet_schedule时从中断处理程序出来时,它将获得tasklet_vec结构指针,并且如果当前没有其他中断/高优先级softirq正在进行,它将计划将运行处理程序(tasklet处理程序)的ksoftirqd,并且如果一个高度的tasklet处理程序在这种情况下使用睡眠ksoftirqd将移动到wait_queue,除非和直到另一个tasklet_schdule被调用,我的中断的tasklet hander将在该点之后继续。

我们说“中断上下文代码不能睡眠”(如果我在中断处理程序中使用睡眠,考虑到我没有使用spint lock或者我没有禁用定时器中断,结果会有什么影响)

(如果我的理解错误,请纠正我)


睡眠仅在过程上下文中工作,不在中断上下文中。 在中断环境中,“当前”不是一项有效的任务,因此我们可以将它放入睡眠状态并稍后将其唤醒。 如果你想睡觉,请使用线程


如果您尝试在tasklet中休眠,将会有一个内核错误指示原子上下文中的上下文切换。 在下半部分,它是中断上下文,并且是ksoftirqd中的进程上下文。 无论处理tasklet在下半部分还是ksoftirqd, thread_info->preempt_count都不为零,这意味着原子上下文。

链接地址: http://www.djcxy.com/p/84797.html

上一篇: Interrupt context bottom half (Softirq or tasklets)

下一篇: Tasklets Bottom half Scheduling