2014-04-11 69 views
0

场景:内核崩溃由于OOM错误(USB_SUBMIT_URB)

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

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

+0

可以在调用usb_submit_urb连续数小时可能导致的内存碎片? –

回答

0

1)是USB URB & S上的东西所消耗?谁拥有的指针块负责通过它上或释放的缓冲区。

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

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

相关问题