【问题标题】: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


    【解决方案1】:

    我不相信您可以为 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。

    【讨论】:

      【解决方案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。

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

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

      【讨论】:

        猜你喜欢
        • 2015-04-28
        • 2012-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-12
        • 2016-01-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多