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/processor-SDK-AM335X:RT 内核的 USB 小工具问题

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/675060/linux-processor-sdk-am335x-usb-gadget-issue-with-rt-kernel

器件型号:PROCESSOR-SDK-AM335X

工具/软件:Linux

您好!

我们在  Linux 配置中激活了"完全可抢占内核(RT)"模式、现在出现了一个问题:进程 [ksoftirqd/0]始终具有高 CPU 负载并阻止系统。

我们使用 Linux USB 小工具功能、当 USB 连接可用时、问题更容易重现。

我们的系统:

CPU:TI AM335X

存储库:Git://git.ti.com/processor-sdk/processor-sdk-linux.git

分支:PROCESSOR-SDK-LINUXE-RT-03.03.00

您是否知道预 embion 和 ksoftirqd/0有一些问题?

 导致 ksoftirqd/0具有高 CPU 负载的原因是什么?

提前感谢

此致、

Christian Fisahn

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

    Christian、

    [引用 user="Christian Fisahn"]我们在  Linux 配置中激活了"完全可抢占内核(RT)"模式,现在出现了进程 [ksoftirqd/0]始终具有高 CPU 负载并阻止系统的问题。

    您是否意味着在切换到"完全预发布内核"之前未发生此问题?

    [引用 user="Christian Fisahn"]我们使用 Linux USB 小工具功能,当 USB 连接可用时,问题更容易重现。

    您使用什么 USB 小工具函数?

    [引用 user="Christian Fisahn"] 导致 ksoftirqd/0具有高 CPU 负载的原因是什么?

    请检查/proc/interrupts 以查看哪个中断速率较高。

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


    您好!


    在第一个帖子"ksoftirqd/0"中出现复制粘贴错误、必须为"ktimersoftd/0"!

    您是否意味着在切换到"完全预发布内核"之前未发生此问题?

    是的、这句话 是正确的。

    您使用什么 USB 小工具函数?

    G_MULTI ->串行仿真、RNDIS 和批量器件仿真。

    请检查/proc/interrupts 以查看哪个中断速率较高。

    • 连接到 PC 的 USB 连接

    内存:62192K,189572K 免费,4K shrd,12K 缓冲器,42720高速缓存

    CPU: 0.0% USR 93.4% sys 0.0% NIC 6.5%闲置 0.0% IO 0.0% IRQ 0.0% sirq

    负载平均值:0.61 0.35 0.17 1/100 202

     PID PPID USER    STAT  VSZ %VSZ CPU %CPU 命令

       4    2根    软件      0 0.0  0 86.0 [ktimersoftd/0]

     

    CAT /proc/interrupts | grep -i time;Sleep 10;cat /proc/interrupts | grep time

     

    16:  16456125     INTC 68 gp_timer 级别     

    16:  16957202     INTC 68级别     gp_timer

     

    >> (16957202-16456125)/10 =~50107

    • 没有 USB 连接到 PC

    CAT /proc/interrupts | grep -i time;Sleep 10;cat /proc/interrupts | grep time

     

    16:      5045     INTC 68级别     gp_timer

    16:      6048     INTC 68 Level     gp_timer

     

    >> (6048-5045)/10 =~100 (CONFIG_Hz_100‘)

     

    在正常运行中、将插入 USB 连接、ktimertimersoftd CPU 负载上升 (50-80%) 至、但会返回到零

    但有时它会保持在100%。

     

    谢谢

     

    此致、

     

    Christian


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

    感谢您提供详细信息。 首先、让我尝试复制它并检查发生了什么。 我会随时向您发布。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Christian、

    顺便说一下、您能否在 u-boot bootargs 中添加'usbcore.autosuspend=-1'以查看问题是否仍然发生?

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

    我认为我能够看到您报告的同一问题、CPPI DMA 驱动程序中的计时器生成得太快、然后我得到了>30k/sec 的 gpgp_timer 中断。
    我将解决驱动程序错误。 同时、您可以在内核 menuconfig 中禁用 CPPI DMA 以避免此问题、直到我找到解决方案为止。
    顺便说一下、"usbcore.autosuspend=-1"无法解决问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、刘斌、

    我们还有一个复制过程:
    1.通过 USB 小工具串行与设备建立连接,例如使用 minicom
    2.定期打印此会话(例如顶部)
    3.通过 USB 小工具 RNDIS 与设备建立并行连接,例如 Telnet
    4.用顶部观察流程
    5.关闭 USB 小工具串行连接(步骤1),而不停止永久打印。
    6. ktimer.. 将显示高 CPU 负载
    7.重新连接 USB 小工具串行连接时、ktimer... 过程恢复再次处于正常状态。

    我将使用禁用"cpi dma in kernel menuconfig "进行测试。

    谢谢

    此致、

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

    禁用 DMA 模式(这意味着激活 PIO 模式)可以解决问题、如上一个帖子中所述。
    在插入 USB 连接时出现此问题的偶发问题、我们将继续观察。

    我们期待您的解决方案。

    谢谢

    此致、

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

    Christian、

    在 g_multiusecase 中、当 USB CPPI DMA 尝试发送1字节数据包但被卡住时、驱动程序会使用计时器继续轮询发送完成、这会导致计时器中断风暴。

    我在我的积压工作中添加了一个工作项目、以调查1字节传输失败的原因。 但同时、请使用以下内核补丁作为解决方案、这种解决方案使数据包大小<= 8字节的传输不使用 CPPI DMA、但无论如何这种传输效率更高。

    diff --git a/drivers/usb/musb_gadget.c b/drivers/usb/gadb/musb_gadget.c
    index 86066328e480-.10c28f15d536 100644
    -- a/drivers/usb/musb/structureb_musget.c
    ++ b/drivers/usb/usb/usb 100644*musb_musb.7_musb.usb
    @@*静态请求30b_musb_musb_musb.7b @@
    request_size = min_t (size_t、request->length - request->actual、
    musb_ep->dma->max_len);
    
    - USE_DMA =(请求->DMA!= DMA_ADDR_INVALID && REQUEST_SIZE);
    + use_dma =(请求->dma!= dma_ADDR_INVALID && request_size > 8);
    
    /* MUSB_TXCSR_P_ISO 仍正确设置*/
    
    
    
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢快速响应和补丁。

    我们实施您的快速解决方案、并期待最终解决方案。

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

    我无法复制主线内核 v4.16-rc6的问题、因此我的待办事项中添加的工作项目将被删除、除非我们发现该补丁会导致其他问题、否则上述补丁将是最终修复。