来自get_user_pages的ERESTARTSYS和待定的致命信号?

时间:2013-11-24 16:18:20

标签: linux memory logging kernel sigkill

我正在linux上测试一些软件+驱动程序,驱动程序在其内部函数中使用get_user_pages()。 在某些时候,我的驱动程序从get_user_pages()收到ERESTARTSYS错误(-512),并根据内核代码发生,因为“如果我们有一个挂起的SIGKILL,请不要保留错误页面并可能分配内存。” - 这是来自memory.c内核文件的注释。 所以我的问题是,我怎么能看到谁发送了这个SIGKILL以及为什么?我试图查看/var/log/kern.log文件,但看不到有关任何信号的任何信息。我该怎么办?

2 个答案:

答案 0 :(得分:0)

我不相信你可以为SIGKILL(其他人,是),除非你愿意修补内核给你信号信息。在这种情况下,您可以根据文档检查si_code和si_pid值:http://pubs.opengroup.org/onlinepubs/009696699/basedefs/signal.h.html

例如,如果你的信号信息是siptr:

if ((siptr)->si_code <= 0) {
   printk(KERN_DEBUG "kill sent by process %u", (siptr)->si_pid);
}

if检查不是绝对必要的:它将printk()限制为kill()引发的信号。如果内核引发了信号,则si_code将大于0。

答案 1 :(得分:0)

我有完全相同的问题。 但是不是在get_user_pages()中,我会从sock_sendmsg()获得-ERESTARTSYS。

要调试此问题,我所做的是添加日志消息 linux-3.2 / kernel / signal.c:__ send_signal()。

并避免在内核日志中填写消息。 我会strncmp(t-&gt; comm,&#34; myprogramname&#34;)然后记录t-&gt; comm,t-&gt; pid,current-&gt; comm和current-&gt; pid。

此外,我意识到它不仅是SIGKILL,还有任何其他信号待定, 然后调用将返回-ERESTARTSYS。

所以我的下一步是找出谁给我的程序一个信号。 并为所有信号添加处理程序(SIGKILL除外,我无法真正处理)。 幸运的是,这不是SIGKILL。

添加处理程序可能对您的情况没有帮助,但是日志记录将识别发送者和原因。

处理可能有助于其他有类似问题的人。