由于OOM错误导致内核崩溃(USB_SUBMIT_URB)

时间:2014-04-11 07:03:53

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

场景:

我在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和内核崩溃。 可能是这个问题是由于在一段时间内发生的外部碎片造成的。 任何输入都会有很大的帮助。

1 个答案:

答案 0 :(得分:0)

1)USB urb& s被某些东西消耗了吗?拥有指向块的指针的人负责将其传递或释放缓冲区。

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

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