【问题标题】:Kernel Crashes due to OOM error (USB_SUBMIT_URB)由于 OOM 错误 (USB_SUBMIT_URB) 导致内核崩溃
【发布时间】:2014-05-25 04:51:59
【问题描述】:

场景:

我在 ioctl 调用中调用 usb_submit_urb 以从应用程序发送音频数据包。 代码实现如下:

retval = copy_from_user(&pkt_1722, pkt_1722_userspace, 
                        sizeof(struct ifr_data_struct_1722));
if(retval) {
    printk("copy_from_user error: pkt_1722\n");
    retval = -EINVAL;
}
usb_init_urb(bky_urb_alloc[bky_urb_context.bky_i]);
usb_fill_bulk_urb(bky_urb_alloc[bky_urb_context.bky_i],
                  dev->udev,
                  priv->avb_a_out,
                  (void*) dma_buf[bky_urb_context.bky_i],
                  112,
                  bky_write_bulk_callback,
                  &bky_urb_context); 
retval = usb_submit_urb(bky_urb_alloc[bky_urb_context.bky_i],
                        GFP_ATOMIC);
if (retval) {
    printk(KERN_INFO "%s - failed submitting write urb, error %d",
           __FUNCTION__, retval);
    goto error;
}

我正在维护一个 urb 数组,以便在调用完成处理程序后可以重用它们。 urb 和 dma_buf 的分配在探针中发生一次。

问题:

我可以流式传输 1722 个数据包几个小时,然后内核崩溃,我只能看到带有调用跟踪的黑屏并显示 OOM 错误(内存不足)。导致错误的 PID 是在后台运行的其他内核进程,它试图分配页面 但它失败并显示OOM和内核崩溃。 这个问题可能是由于一段时间内发生的外部碎片。 任何输入都会有很大帮助。

【问题讨论】:

  • 连续调用usb_submit_urb几个小时会导致内存碎片吗?

标签: linux-kernel embedded usb kernel linux-device-driver


【解决方案1】:

1) USB urb&s 是否被某物消耗?拥有指向块的指针的人负责传递它或释放缓冲区。

2) 您是否将/etc/sysctl.conf 中的vm.min_free_kbytes 设置为至少1% 的系统内存?

3) 在系统运行时,在 shell 循环中捕获 /proc/slabinfo 并查看某处是否存在泄漏。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-03
    • 2012-02-01
    • 2018-04-18
    • 1970-01-01
    相关资源
    最近更新 更多