我有一个内核模块,它通过 read() 向用户态进程提供数据。在数据可用之前,该进程会阻塞读取。我通过 read 方法中的 wait_event_interruptible() 实现了这一点。
数据来自一个中断处理程序,它把它吸入内存,然后安排一个小任务来处理它。原始代码调度 tasklet,然后调用 wake_up_interruptible() 重新激活被阻塞的读取。但是,这会导致竞争条件,因为在读取尝试将数据提供给用户进程之前,tasklet 可能尚未完成处理数据。
所以问题是,将我对 wake_up_interruptible() 的调用移到 tasklet 的末尾是否安全?