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和内核崩溃。 可能是由于在一段时间内发生的外部碎片造成的。任何输入都会有很大的帮助。
可以在调用usb_submit_urb连续数小时可能导致的内存碎片? –