【问题标题】:ERESTARTSYS from get_user_pages and pending fatal signal?来自 get_user_pages 的 ERESTARTSYS 和未决的致命信号?
【发布时间】:2013-11-24 16:18:20
【问题描述】:
我正在 linux 上为它测试一些软件+驱动程序,驱动程序在其内部函数中使用 get_user_pages()。
在某些时候,我的驱动程序从 get_user_pages() 收到 ERESTARTSYS 错误 (-512),根据内核代码,它发生的原因是“如果我们有一个挂起的 SIGKILL,请不要继续出错页面并可能分配内存。” - 这是来自 memory.c 内核文件的注释。
所以我的问题是,我怎样才能看到谁发送了这个 SIGKILL 以及为什么?我试图查看 /var/log/kern.log 文件,但看不到任何信号。我能做什么?
【问题讨论】:
标签:
linux
memory
logging
kernel
sigkill
【解决方案2】:
我遇到了完全相同的问题。
但不是在 get_user_pages() 中,我会从 sock_sendmsg() 获得 -ERESTARTSYS。
为了调试这个问题,我所做的是在其中添加一条日志消息
linux-3.2/kernel/signal.c: __send_signal().
为了避免消息填满内核日志。
我会 strncmp(t->comm, "myprogramname") 然后记录 t->comm, t->pid, current->comm 和 current->pid。
我还意识到它不仅是 SIGKILL,而且还有其他待处理的信号,
然后调用将返回 -ERESTARTSYS。
所以我的下一步是找出谁在给我的程序一个信号。
并为所有信号添加处理程序(SIGKILL 除外,我无法真正处理)。
幸运的是,它不是 SIGKILL。
添加处理程序可能对您的情况没有帮助,但日志记录会识别发送者和原因。
处理可能会帮助有类似问题的其他人。