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.

[参考译文] AM3356:当 CPU 调节器设置为"ondemand,"一些 IRQ 线程占用 CPU 很长时间。

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1658335/am3356-when-the-cpu-governor-is-set-to-ondemand-some-irq-threads-occupy-the-cpu-for-a-long-period

器件型号: AM3356

您好、专家

当 CPU 调节器设置为“按需“时、某些 IRQ 线程有时会占用 CPU 400 至 500 毫秒的时间。
请参阅下面的 ftrace 日志。
相关的 IRQ 线程为`irq/42-mmc0-60`和`irq/57-wl18xx-260`。

通过 CAN0 传输大约 4 MB 的文件时会出现此问题。
CAN 帧传输间隔约为 0.5ms。
如果通信器件在 200ms 或更长时间内无法接收帧、则会中止连接。
因此、有必要防止这种情况发生。

内核版本 4.19.94 未出现此现象。
当 CPU 调节器设置为“performance“(性能)或“userspace“(用户空间)以锁定时钟速度时、也不会发生这种情况。
即使在 300MHz 中使用“userspace“设置固定时钟速度、也不会出现该问题。

作为临时解决方法、我们计划在传输过程中将 CPU 调节器设置为“性能“。
我们认为永久的解决方案需要修复内核中有问题的部分。
请您就这种现象的原因和相应的对策向我们提供意见。


-条件
 - SDK:9.3
 -内核版本: 4.1.119 00b127e50fa09f9bd35c66ac3011861392d9a750
 -内核配置:“. config-governor“在附加的 config_devicetree.tar.gz
 -设备树:config_devicetree.tar.gz 附件中的“am335x-jrn430k.dts“

- ftrace 日志
   ----- 案例 1 ftrace 的开始--------------------------------------------
     mw_CAN0-3070  [000] d.2.  676.839206:Sched_switch:Prev_comm=MW_CAN0 prev_pid=3070 prev_prio=118 prev_state=S => next_comm=kworker/0:5 next_pid=52 next_prio=120
   kworker/0:5-52[000]   d.2.  676.839255:Sched_switch:Prev_comm=kworker/0:5 prev_pid=52 prev_prio=120 prev_state=D => next_comm=RCU_prepempt next_pid=13 next_prio=120
   Rcu_preempt-13   [000] d.2.  676.839287:Sched_switch:Prev_comm=RCU_prepempt prev_pid=13 prev_prio=120 prev_state=i ===>next_comm=kworker/0:0 next_pid=4019 next_prio=120
   kworker/0:0-4019  [000] d.2.  676.840676:Sched_switch:Prev_comm=kworker/0:0 prev_pid=4019 prev_prio=120 prev_state=R+=> next_comm=ksoftirqd/0 next_pid=12 next_prio=48
   ksoftirqd/0-12   [000] d.2.  676.842618:Sched_switch:Prev_comm=ksoftirqd/0 prev_pid=12 prev_prio=48 prev_state=S => next_comm=irq/42-mmc0 next_pid=60 next_prio=49
--> irq/42-mmc0-60[000]   d.2.  677.239713:Sched_switch:Prev_comm=IRQ/42-mmc0 prev_pid=60 prev_prio=49 prev_state=R+=> next_comm=ksoftirqd/0 next_pid=12 next_prio=48
   ksoftirqd/0-12   [000] d.2.  677.240032:Sched_switch:Prev_comm=ksoftirqd/0 prev_pid=12 prev_prio=48 prev_state=S => next_comm=irq/42-mmc0 next_pid=60 next_prio=49
   irq/42-mmc0-60   [000] d.2.  677.240380:Sched_switch:Prev_comm=IRQ_42-mmc0 prev_pid=60 prev_prio=49 prev_state=S => next_comm=APL_WS next_pid=599 next_prio=120
     APL_WS-599  [000] d.2.  677.242447:Sched_switch:Prev_comm=APL_WS prev_pid=599 prev_prio=120 prev_state=S => next_comm=kworker/0:4 next_pid=51 next_prio=120
   ----- 案例 1 :跟踪端--------------------------------------------
   ----- 案例 2 ftrace 开始------------------------------------
     APL_MC-533  [000] d.2.  1295.469869:Sched_switch:Prev_comm=APL_MC prev_pid=533 prev_prio=120 prev_state=R+=> next_comm=ksoftirqd/0 next_pid=12 next_prio=48
   ksoftirqd/0-12   [000] d.2.  1295.472254:Sched_switch:Prev_comm=ksoftirqd/0 prev_pid=12 prev_prio=48 prev_state=S ==> next_comm=IRQ/57-wl18xx next_pid=260 next_prio=49
--> irq/57-wl18xx-260[000]  d.2.  1295.986965:Sched_switch:Prev_comm=IRQ/57-wl18xx prev_pid=260 prev_prio=49 prev_state=D => next_comm=APL_mc next_pid=532 next_prio=120
     APL_MC-532  [config_devicetree.tar.gz 000] d.2.  1295.989754:Sched_switch:Prev_comm=APL_MC prev_pid=532 prev_prio=120 prev_state=R+=> next_comm=ksoftirqd/0 next_pid=12 next_prio=48
   ----- 第 2 种情形是跟踪端点 ----------------------------------------

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

    尊敬的 Katsuya-San:

    [引述 userid=“599863“ url=“~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1658335/am3356-when-the-cpu-governor-is-set-to-ondemand-some-irq-threads-occupy-the-cpu-for-a-long-period ]-条件
     - SDK:9.3
     -内核版本: 4.1.119 00b127e50fa09f9bd35c66ac3011861392d9a750

    SDK 和内核版本不匹配。 您的意思是内核版本 6.1.119而不是 4.1.119 吗 ?

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

    尊敬的 Bin San:

    已经有一段时间了。

    我很抱歉。 这是个拼写错误。

    是的、内核版本为 6.1.119

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

    嗨、Bin-san

    我发现当使用`obap_hsmmc`作为 MMC 驱动程序时、不会出现此问题。
    对于内核 6.1.119、TI 似乎建议使用`sdhci-OMAP`作为 MMC 驱动程序。
    在该内核中使用`obap_hsmmc`是否存在任何相关风险?
    器件树如下所示。

    &mmc1 {
        compatible = "ti,omap4-hsmmc";
    
        status = "okay";
        vmmc-supply = <&vmmc_reg>;
        bus-width = <4>;
        pinctrl-names = "default";
        pinctrl-0 = <&mmc1_pins>;
        //cd-gpios = <&gpio3 14 GPIO_ACTIVE_HIGH>;
        //cap-power-off-card;
    };
    
    &mmc2 {
        compatible = "ti,omap4-hsmmc";
    
        vmmc-supply = <&vmmc_reg>;
        pinctrl-names = "default", "sleep";
        pinctrl-0 = <&emmc_pins_default>;
        pinctrl-1 = <&emmc_pins_sleep>;
        bus-width = <8>;
        status = "okay";
    };
    
    &mmc3 {
        compatible = "ti,omap4-hsmmc";
    
        /* these are on the crossbar and are outlined in the
           xbar-event-map element */
        dmas = <&edma_xbar 12 0 1
            &edma_xbar 13 0 2>;
        dma-names = "tx", "rx";
        status = "okay";
        vmmc-supply = <&wlan_en_reg>;
        bus-width = <4>;
        pinctrl-names = "default", "sleep";
        pinctrl-0 = <&mmc3_pins_default &wlan_pins>;
        pinctrl-1 = <&mmc3_pins_sleep &wlan_pins>;
        non-removable;
        cap-power-off-card;
        keep-power-in-suspend;
    
        #address-cells = <1>;
        #size-cells = <0>;
        wlcore: wlcore@0 {
            compatible = "ti,wl1835";
            reg = <2>;
            // WLAN_IRQ
            interrupt-parent = <&gpio1>;
            interrupts = <29 IRQ_TYPE_EDGE_RISING>;
        };
    };
    

    如果使用 OMAP_hsmmc 没有风险、请参阅以下内容。

    使用 OMAP_hsmmc 时、将以下日志输出到 dmesg。
    ----------------------------
    [ 0.662887] OMAP-Lsmmc 481d80.mmc:Rx DMA 通道请求失败
    ----------------------------
    我想隐藏这条消息。
    我想使用 DMA 来减少 CPU 负载、但找不到 eMMC (mmc2) 的示例器件树。
    是否不建议为 eMMC 使用 DMA?
    如果建议使用、请向我展示内核 6.1.119 中 obap_hsmmc 的一些示例代码。
    还是建议使用 PIO?

    此致。
    胜山

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

    您好 Katsuyama-San、

    感谢您提供详细信息。

    ]在该内核中使用`OMAP_hsmmc`是否存在任何相关风险?

    我无法评论使用 OMAP_hsmmc 驱动程序的风险。 由于较新的内核切换到 sdHCi-OMAP 驱动程序、OMAP-Lsmc 尚未在 AM335x 上进行验证。

    [quote userid=“599863“ url=“~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1658335/am3356-when-the-cpu-governor-is-set-to-ondemand-some-irq-threads-occupy-the-cpu-for-a-long-period/6400619 `我发现当使用` OMAP_hsmmc 作为 MMC 驱动程序时不会出现此问题。

    您能否在 v6.1 上尝试以下内核补丁、看看它是否对该问题有任何影响? (补丁会将延迟值从 50 更改为–1。)

    diff -git a/drivers/MMC/host/sdhci-oca.c b/drivers/MMC/host/sdhci-oca.c
    索引 bfb7c8b96341..9294e83bf8ca 100644
    ---A/drivers/MMC/host/sdhci-OMAP.c
    ++ b/drivers/MMC/host/sdHCi-OMAP-Lc
    @@–1303、7 +1303、7 @@ static int sdHCI_OMAP-Lprobe(结构 platform_device *pdev)
    *回调将作为 pm_runtime_get_sync 的一部分被调用。
    */
    pm_runtime_use_autosuspend (dev);
    - pm_runtime_set_autospend_delay (dev、 50);
    + pm_runtime_set_autospend_delay (dev、 –1);
    PM_runtime_enable (dev);
    RET = pm_runtime_resume_and_get (dev);
    if (ret){

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

    嗨、Bin-san

    感谢您的及时回复。
    不幸的是、补丁无效。
    下面是 ftrace 日志。

    kworker/0:0-7       [000] d..2.   811.640051: sched_switch: prev_comm=kworker/0:0 prev_pid=7 prev_prio=120 prev_state=R+ ==> next_comm=irq/42-mmc0 next_pid=61 next_prio=49
    irq/42-mmc0-61      [000] d..2.   812.063901: sched_switch: prev_comm=irq/42-mmc0 prev_pid=61 prev_prio=49 prev_state=S ==> next_comm=irq/57-wl18xx next_pid=260 next_prio=49
    irq/57-wl18xx-260     [000] d..2.   812.070074: sched_switch: prev_comm=irq/57-wl18xx prev_pid=260 prev_prio=49 prev_state=S ==> next_comm=APL_WS next_pid=594 next_prio=120
    

    我期待听到有关替代措施的消息。

    此致。
    胜山

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

    您好 Katsuyama-San、

    我熟悉 ftrace、但尚未使用 ftrace sched_switch 功能。 您能否帮助我了解如何解释您提供的 ftrace 日志?

    我正在尝试查看是否可以在 BeagleBone Black 上重现问题并进行调试。

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

    我无法发布!

    发生错误。 请重试或联系您的管理员。

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

    嗨、Bin-san

    我要为 sched_switch ftrace 附加脚本。

    - ftrace_start.sh --开始跟踪
    - ftrace_stop.sh — 停止跟踪并将日志保存到/var/log/ftrace.log
    请参阅/var/log/ftrace.log
    时间戳不是启动时间、而是由 sched_switch 划分的切换时间
    - ftrace_cputime.sh — 分析日志
     您可以看到每个线程的 CPU 时间。

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

    - ftrace_start.sh

    ----------------------------
    !/bin/sh
    #启动 ftrace

    #更改缓冲区大小
    #echo 96000 >/sys/kernel/debug/tracing/buffer_size_kb

    #重置跟踪
    echo nop >/sys/kernel/debug/tracing/current_tracer
    Echo 0 >/sys/kernel/debug/tracing/tracing_on
    Echo 0 >/sys/kernel/debug/tracing/events/enable

    #清除跟踪日志
    Echo >/sys/kernel/debug/tracing/trace

    #启用 function_graph
    #echo function_graph >/sys/kernel/debug/tracing/current_tracer

    #启用 sched_switch 跟踪
    Echo 1 >/sys/kernel/debug/tracing/events/sched/sched_switch/enable
    #开始跟踪
    Echo 1 >/sys/kernel/debug/tracing/tracing_on
    ----------------------------
    这将开始跟踪。

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

    - ftrace_stop.sh
    ----------------------------
    #!/bin/sh
    #停止 ftrace 并保存到文件。
    Echo 0 >/sys/kernel/debug/tracing/tracing_on
    CAT /sys/kernel/debug/tracing/trace >/var/log/ftrace.log
    ----------------------------
    这将停止跟踪并将日志保存到/var/log/ftrace.log 中
    请参阅/var/log/ftrace.log
    注意:时间戳不是开始时间、而是由 sched_switch 设置的切换时间

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    - ftrace_cputime.sh
     我想发送这个脚本。
    但系统显示“发生了错误。 请重试或联系管理员
    所以、我无法发送。
    此致。
    胜山
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    ftrace_cputime.sh

    ----------------------------------------------------
    登录文件=1美元
    awk 'NR===13 {sub(/:/,““,4美元); prev=4美元 }NR>13 {sub(/:/,““,4美元); printf(“%f %f %s\n“,4美元,4美元 — prev, 1美元);prev=4美元 }'${inlogfile}
    --------------------------------------------------------

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

    嗨、Bin-san

    我希望找出原因并修复 sdHCI_OMAP。

    此致。
    胜山

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

    我目前在休假期间不在办公室、下周晚些时候会回来。

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

    你好 Bin-san

    这也可以在 BeagleBone Black 上重现吗?

    请告诉我有关情况的详情。

    我期待着结果。

    此致

    胜山

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

    您好 Katsuyama-San、

    我刚回到办公室,我有几个工作队列中有比这个 cpufreq 问题更高的优先级. 请继续使用“性能“调节器作为解决方法、直到我能够重现并找出原因为止。

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

    嗨、Bin-san

    高优先级任务是否已完成?
    如果您能尽快开始执行我的任务、我将不胜感激。
    如果您无法立即开始、您能否让我知道如何提高 我的任务优先级?
    我是否应该通过机构提交请求?

    如果连续使用“性能“调速器、则包括功率等因素
    需要重新评估消耗和排放。
    所以、我想使用“ondemand“一个。

    此致。
    胜山

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

    您好 Katsuyama-San、

    高优先级任务是否已完成?

    不、其中一个问题可能需要很长时间、我可能需要数周的 100%带宽才能找到根本原因并解决问题。

    如果您无法立即开始、您能告诉我如何提高 任务的优先级吗?

    其中一种途径是您将问题上报给 TI 当地 FAE、他们可以将问题上报给 TI 工厂。

    我是否应该通过机构提交请求?

    我不确定是什么“机构“、但另一种选择是找到一家第三方公司来为您调试和解决问题。