Linux 如何在softirq上下文中运行hrtimer处理程序?

Linux 如何在softirq上下文中运行hrtimer处理程序?,linux,timer,interrupt,Linux,Timer,Interrupt,我找到了关于hrtimer的本教程: 我相信它使用的方式将在hardirq上下文中运行回调处理程序,对吗?但是它也提到了“一个有趣的方面是定义回调函数的执行上下文的能力(例如在softirq或hardiirq上下文中)” 我已经检查了hrtimer.h文件,但它确实不是那么直观。有人知道如何在softirq环境中运行它吗?在hardirq中运行它类似吗 谢谢,此信息是关于旧内核的-在最近的版本中,此功能已被删除,以降低代码复杂性并避免bug。现在hrtimer总是在禁用IRQ的hardirq上

我找到了关于hrtimer的本教程:

我相信它使用的方式将在hardirq上下文中运行回调处理程序,对吗?但是它也提到了“一个有趣的方面是定义回调函数的执行上下文的能力(例如在softirq或hardiirq上下文中)

我已经检查了hrtimer.h文件,但它确实不是那么直观。有人知道如何在softirq环境中运行它吗?在hardirq中运行它类似吗


谢谢,

此信息是关于旧内核的-在最近的版本中,此功能已被删除,以降低代码复杂性并避免bug。现在hrtimer总是在禁用IRQ的hardirq上下文中运行

一种可能的方法是使用tasklet\hr计时器

#包括
struct tasklet_hrtimer mytimer;
枚举hrtimer\u重新启动回调(结构hrtimer*t){
struct tasklet_hrtimer*mytime=container_of(t,struct tasklet_hrtimer,timer);
...
}
...
tasklet_hrtimer_init(&mytimer,回调,时钟,模式);
tasklet\u hrtimer\u启动(&mytimer,time,mode);
...
在上面的示例中,应使用适当的值替换
时钟
模式
时间

如果您想将数据传递给回调函数,那么必须将tasklet_hrtimer变量嵌入到您的某个结构中,并使用trick的容器获取数据

不太明显,您的结构将包含一个tasklet_hrtimer,它将包含一个hrtimer结构。当您得到一个指向最内部元素的指针,并且您知道它与父元素有固定的偏移量时,您可以到达父元素