Linux kernel 使用usb\u submit\u urb进行USB2.0传输会导致内核死机 场景

Linux kernel 使用usb\u submit\u urb进行USB2.0传输会导致内核死机 场景,linux-kernel,embedded,usb,kernel,linux-device-driver,Linux Kernel,Embedded,Usb,Kernel,Linux Device Driver,我正在通过USB2.0构建和传输来自应用程序的以太网数据包。 在USB类驱动程序中,我发出一个请求,使用USB\u submit\u urb将此数据包发送到批量端点。我的以太网数据包大小是112字节。在不考虑演示时间的情况下,我能够在约200毫秒内传输8000个数据包 我正在打一个ioctl电话以非常快的速度发送数据包,比如说我在每3-4次usec后打一个ioctl电话。在我的ioctl中,我正在发出usb\u submit\u urb这是一个非阻塞调用,与usb\u bulk\u msg不同

我正在通过USB2.0构建和传输来自应用程序的以太网数据包。 在USB类驱动程序中,我发出一个请求,使用
USB\u submit\u urb
将此数据包发送到批量端点。我的以太网数据包大小是112字节。在不考虑演示时间的情况下,我能够在约200毫秒内传输8000个数据包

我正在打一个
ioctl
电话以非常快的速度发送数据包,比如说我在每3-4次usec后打一个
ioctl
电话。在我的
ioctl
中,我正在发出
usb\u submit\u urb
这是一个非阻塞调用,与
usb\u bulk\u msg
不同

  • 问题

如果考虑呈现时间,内核恐慌和DMESG日志读取<代码>内核恐慌-不同步:中断< /代码>中的致命异常。对于信息:考虑到呈现时间,数据包将在硬件设备中等待,直到timestamp_in_packet==硬件时间。 我需要了解EHCI在这种情况下的行为,或者在这种情况下端点队列的状态。我正在开发一个ETH over USB芯片。这种内核恐慌的真正原因是什么。


任何输入都会有很大帮助。

我建议您尝试找到最小的代码来重现问题。您只编写用户空间代码是正确的吗(即,不管您意外地做了什么,您“不应该”能够导致这种情况?),然后您可以在出现明显崩溃的情况下使用额外的printk工具重新构建内核。但这是一项乏味的任务。是否有任何方法可以禁用成功提交urbs后发生的硬件中断。我认为在我的例子中,问题是产生了过多的中断,因此CPU锁定(硬锁)(看门狗线程)。过多的中断不一定会导致崩溃。最可能的原因是您的驱动程序中有一个错误。在每100usec调用usb_submit_urb后,我能够成功地传输60000-120000个数据包,但在那之后内核崩溃(Dmesg错误读取:内核崩溃-不同步:中断中的致命异常)。好像我的驱动程序工作正常。问题已经调试好了。问题在于嵌套中断的生成。通过使用流量控制机制,问题消失了:)