场景:
我在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和内核崩溃。 可能是这个问题是由于在一段时间内发生的外部碎片造成的。 任何输入都会有很大的帮助。
答案 0 :(得分:0)
1)USB urb& s被某些东西消耗了吗?拥有指向块的指针的人负责将其传递或释放缓冲区。
2)您是否已将vm.min_free_kbytes
中的/etc/sysctl.conf
设置为系统内存的至少1%?
3)当系统运行时,在shell循环中捕获/proc/slabinfo
并查看某处是否存在泄漏。