我有一个内核模块,它使用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)如果这不能在中断上下文中使用,那么在此上下文中通知用户空间的替代方法是什么?
答案 0 :(得分:1)
正确,sysfs_notify()
无法从原子上下文中调用。是的,sysfs_notify_dirent()
似乎可以安全地从原子上下文调用。你引用的来源是一个错误报告,它在一个旧的内核版本中注意到该声明实际上并不正确,还有修补它的补丁。现在似乎可以安全地打电话。
关注gpiolib_sysfs.c中的源代码,您会注意到sysfs_notify_dirent()
最终会调用schedule_work()
,这会将实际调用推迟到sysfs_notify()
,这正是您的问题的评论建议您这样做。它只是包含在便利功能中。