This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] Linux:AM572x USB 小工具完成处理程序延迟

Guru**** 2609945 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/636811/linux-am572x-usb-gadget-completion-handler-delay

工具/软件:Linux

您好、Bin、

详细信息:主板 AM572x、Linux 4.3.xx

问题:观察-  两次连续调用 USB 小工具完成处理程序之间的延迟为~2000微秒。

查询:如何减少延迟。

重现步骤:使用 g_webcam 应用程序。

 

请告诉我是否需要更多信息?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Mahesh、

    请注意、Linus USB 小工具驱动程序堆栈有多个层
    -指定您提到的完成处理程序的确切函数名;
    -提供显示延迟的内核日志;
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Mahesh、
    请您回答 Bin 的问题吗? 如果问题消失、没有回复、我们将在下周关闭此帖子。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    下面添加了一些更多详细信息

    平台:TI-AM572x
    Linux 内核版本:4.9.28
    TI-SDK:   ti-processor-sdk-linux-am57xx-evm-04.01.00.06-Linux-x86-Install.bin
    问题:USB 视频完成处理程序回调。

    完成处理程序延迟:
    使用 g_webcam.ko (补丁程序和 ko,按附件)和 USB_f_uvc.ko (补丁程序和 ko,按附件)将视频流式传输到 PC (1280x720)。
    观察完成处理程序调用的延迟为~4000 usecs、而在另一个 ARM 平台中、此延迟为~800 usecs。
    附加的日志文件示例(UVC-COMP-handler-delay-logs.txt)。
    这种延迟会导致前几层中的视频数据包堆积。
    注:
    在 drivers/USB/gadget/functions/UVC_VIDON.c 文件中为 UVC 完成处理程序函数(UVC_VIDOO_COMPLETE)测量的延迟。
    API (DE_gettimeofday)用于测量延迟。

    e2e.ti.com/.../2664.NV12_5F00_Support.tar

    e2e.ti.com/.../uvc_2D00_comp_2D00_handler_2D00_delay_2D00_logs.txt

    2.视频和 HID 并行
    另一个问题是视频和 HID 复合视频并行运行。
    我们有一个定制的复合小工具驱动程序;当视频数据包提交到 DWC3并并行提交 HID 数据包时、端点中的视频将被阻止(它不会触发完成回调函数)。 但 HID 可以继续将数据排队到其端点。
    当然、不能提供示例代码。
    从主机 PC (流式 PC)执行视频流重新启动、错误恢复、视频完成处理程序开始工作。 (但进一步的 HID 事件会破坏视频完成处理程序)
    TI 是否提供了任何用于并行检查视频、HID 的示例代码?  

    请告诉我是否需要一些其他详细信息。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    莫尼卡

    我即将离开办公室去度假、没有太多时间根据您提供的补丁复制您的确切用例、但我确实看到您使用 UVC 完成处理程序中的"printk()"来打印时间戳、 这不是测量运行时性能的正确方法、因为 printk 通常会将日志消息直接输出到速度非常慢的 UART 控制台上、这会导致测量不准确。

    我做了一个快速实验来证明我的陈述:

    在与修补程序0002中相同的位置,我使用 trace_printk()(您需要在内核配置中为其启用 ftrace),日志显示调用处理程序的时间间隔约为~120us。 然后我将其更改为 DEV_ERR(),这是 printk()的包装程序,现在日志直接转至 UART 控制台,并在大约~4ms 内调用该处理程序,这与您观察到的内容相匹配。

    您可能会问为什么另一个平台使用 printk()提供~800us 的性能,我认为这可能取决于每个 UART 驱动程序的实现或配置方式,但这并不重要,无论如何,printk()不应在该测量中使用。

    关于您报告的问题2、您是否有任何仅限视频和视频+HID 日志来显示 EP 中的视频如何被阻止?

    我将在大约3周内回来继续这一讨论。 谢谢。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    箱、

    为问题2附加从 UDC (drivers/USB/gadget/UDC/core.c)获取的日志、

    e2e.ti.com/.../tilogs_5F00_video_5F00_working_5F00_without_5F00_hid.txt

    e2e.ti.com/.../tilogs_5F00_video_5F00_hid_5F00_not_5F00_working.txt

    e2e.ti.com/.../mem_2D00_crash.txt

    以上日志中的观察结果是、

    1.当视频在没有 HID 事件的情况下进行流式传输时、会调用"USB_gadget_giveba回_request:ISOC_UDC"(为等时 EP 添加了调试消息)。 (请参阅 tilogs_video_working_without hid.txt)

    在 对几个 HID 事件"USB_gadget_giveba回_request:Int_UDC"(为中断 EP 添加了调试消息)排队后、我们看到"USB_gadget_giveba回 e_request:isoC_UDC"没有被调用来请求视频。 (请参阅 tilogs_video_hid_not working.txt)

    3.等时 EP 阻塞后、视频数据包在队列中堆积、等待 USB 请求缓冲区会导致内存崩溃。 (请参阅 mem-crash.txt)

    注意:我们只有视频请求缓冲队列大小为1024。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    莫尼卡

    我仍在使用 USB configfs 创建您的用例、以创建具有 HID 和 UVC 的复合小工具。

    HID 小工具导致内核崩溃、因为 NULL 指针解除引用、然后我移动到最新的主线内核(v4.15-rc6)、这不会出现此崩溃问题。 我花了一段时间来确定哪个内核修补程序解决了它、因此我现在将继续使用社区内核来查看我是否可以重现您的观察结果。

    同时、您是否也可以测试 v4.15-rc6?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    顺便说一下、我没有在2664.NV12_Support.tar 中应用您上面提供的任何补丁。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    莫尼卡

    我终于在内核 v4.15-rc6上启动并运行了测试用例-使用 USB config 小工具来创建具有 UVC 和 HID 功能的 USB 复合小工具。 HID 功能是一种键盘、可在1ms 间隔内馈送击键。 我在日志中注意到 HID 使用2ms 间隔。

    但我看不到 HID 数据包事件阻止 UVC 传输的问题、也看不到 UVC 视频流中的任何帧速率下降(我认为这是您尝试解决的问题)。

    这是 ftrace 日志的一部分。

    e2e.ti.com/.../am57x_2D00_uvc_2D00_hid_2D00_gadget.log

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我刚刚在社区内核 v4.14.13上进行了同样的测试、也没有看到阻止问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    箱、

    根据您对 printk 的评论,我们替换了 trace_printk()并测量了延迟。 测量的延迟数据与测量的数据类似。

    我们还观察到、我们在其中一个小工具模块中打印了一份、我们进行了更换、现在我们没有在这种情况下发现挂起问题。

    我认为 printk 很昂贵、会导致问题。 如果发现类似问题、我们将进一步测试和报告。

    感谢您的支持。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    莫尼卡

    感谢您的更新、我很高兴问题得到了解决。
    我将关闭此主题。 当您遇到新问题时、请打开新帖子。