BUG:使用sysfs_notify()进行原子调度....

时间:2014-12-09 13:48:16

标签: linux-kernel linux-device-driver scheduling

我有一个内核模块,它使用hrtimers在计时器触发时通知用户空间。我知道我可以使用用户空间计时器,但它正在模拟将来实际与硬件通信的驱动程序。每隔一段时间我就得到一个BUG: Scheduling while atomic。在做了一些研究之后,我假设我注册为回调的hrtimer.function是由内核内部的中断例程调用的(在#34;原子上下文中使我的回调函数")。然后当我在回调中调用sysfs_notify()时,我得到了内核错误,因为sysfs_notify()获取了一个互斥锁。

1)这是正确的假设吗?

如果这是正确的,我已经看到有一个名为sys_notify_dirent()的函数可用于从原子上下文通知用户空间。但根据这个消息来源:

http://linux.derkeiler.com/Mailing-Lists/Kernel/2009-10/msg07510.html

只能从"进程调用#34;上下文,而不是中断上下文(由于自旋锁)。

2)有人能解释过程,中断和原子上下文之间的区别吗?

3)如果这不能在中断上下文中使用,那么在此上下文中通知用户空间的替代方法是什么?

1 个答案:

答案 0 :(得分:1)

正确,sysfs_notify()无法从原子上下文中调用。是的,sysfs_notify_dirent()似乎可以安全地从原子上下文调用。你引用的来源是一个错误报告,它在一个旧的内核版本中注意到该声明实际上并不正确,还有修补它的补丁。现在似乎可以安全地打电话。

关注gpiolib_sysfs.c中的源代码,您会注意到sysfs_notify_dirent()最终会调用schedule_work(),这会将实际调用推迟到sysfs_notify(),这正是您的问题的评论建议您这样做。它只是包含在便利功能中。