【发布时间】: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