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.

[参考译文] AM3352:Linux 升级后产品重启

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1587411/am3352-product-reboot-after-linux-upgrade

器件型号: AM3352
Thread 中讨论的其他器件: WL1835

转换器
 
 
 
 

 

您好:

在我们的 AM335x 平台上将 Linux 内核从 4.19 升级到 5.10.100(版本 08.02.01)后、我们在大约 50 小时的正常运行时间后意外重新启动。

经过一些调查、我们发现、当我们禁用 mmc0(SD 卡)时、器件不再重新启动。

我们还注意到、在内核 4.19 中、mmc0 中断计数保持稳定、而在内核 5.10.100 中、中断计数持续增加 (/proc/interrupts)。

以下是我们的 DTS MMC 节点:

&mmc1{
    状态=“正常“;
    VMMC-SUPPLY =<&vmmcsd_FIXED>;
    总线宽度=<4>;
    pinctrl-names =“default",“,"sleep"、"sleep";“;</s>“
    pinctrl-0 =<&mmc1_pins_default>;
    pinctrl-1 =<&mmc1_pins_sleep>;
};

&mmc3{
    状态=“正常“;
    VMMC-SUPPLY =<&vmmcwifi_fixed>;
    总线宽度=<4>;
    pinctrl-names =“default";“;
    pinctrl-0 =<&mmc2_pins>;
    TI、不可拆卸;
    TI、needs-special-hs 处理;
    DMA =<&EDMA_XBar 12 0 1
        &EDMA_xbar 13 0 2>;
    dma-names =“tx",“,"rx"、"rx";“;</s>“
    电容断电卡;
    保持电源处于挂起状态;
    #address-cells =<1>;
    #size-cells =<0>;

    wlcore:wlcore@0{
        兼容=“ti、wl1835“、“ti、wlcore“;
        reg =<2>;
        中断父级=<&GPIO0>;
        中断=<26 0x1>;
    };
};

 

提前感谢您的帮助!

mmc_sd1.PNGmmc_sd0.PNG

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

    您好:

    当系统自行重新引导时、是否有任何终端输出? 是否有任何其他调试信息可以提示重新启动的原因?

    此致、

    Nick

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

    禁用了 mmc0 的器件也会最终重新引导、并显示以下日志:  

    [472109.943001] RCU:INFO:RCU_PREEME 在 CPU 上自检测到停止
    [472109.949202] RCU:    0-...!:(7020193 个周期此 GP) IDLE = aaa/1/0x40000002 softirq=9717802/9717802 fqs=0
    [472109.959081]  (t=2100 jiffies g=23306709 q=4)
    [472109.959098] RCU: RCU_PREEME kthread 饿了 2100 jiffies! g23306709 f0x0 RCU_GP_WAIT_FQS (5)->状态= 0x402 -> CPU = 0
    [472109.970432] RCU:    除非 RCU_PREEMPEM kthread 获得足够的 CPU 时间,否则 OOM 现在是预期行为。
    [472109.980119] RCU:RCU grace-period kthread 堆栈转储:
    [472109.985523]任务:RCU_PREEMEMPET   状态:I 栈:  0 pid     :11 PPID:2 个标志:0x00000000
    [472109.985603][ ](__schedule)、来自[ ](计划+0x90/0x118)
    [472109.985630][ ](时间表)自[ ](schedule_timeout+0x7c/0xf8)
    [472109.985666][ ](schedule_timeout)、来自[ ](RCU_gp_kthread+0x588/0xd94)
    [472109.985701][ ](RCU_gp_kthread)、来自[ ](kthread+0x170/0x178)
    [472109.985724][ ](kthread)(来自[ ](ret_from_fork+0x14/0x2C)
    [472109.985736]异常堆栈 (0xc186ffb0 至 0xc186fff8)
    [472109.985750] ffa0:                    00000000 00000000 00000000
    [472109.985767] ffc0:00000000 00000000 00000000 00000000 00000000
    [472109.985781] ffe0:00000000 00000000 00000000 00000013 00000000
    [472109.985804] CPU 0 的任务转储:
    [472109.985811]任务:SMS_spooler   状态:R 正在运行任务   栈:  0 pid:1126 PPID  :293 个标志:0x00000002
    [472109.985850][ ](runfound_backtrace) from [ ](show_stack+0x10/0x14)
    [472109.985883][ ](show_stack) from [ ](RCU_DUMP_CPU_STACK+0xc8/0x100)
    [472109.985909][ ](RCU_dump_cpu_stacks)、来自[ ](Rcu_sched_clock_IRQ+0x70c/0xd08)
    [472109.985937][ ](RCU_SCHED_CLOCK_IRQ)、来自[ ](update_proce_times+0x90/0xc4)
    [472109.985972][ ](update_proce_times)、来自[ ](tick_sched_timer+0x6c/0x108)
    [472109.985994][ ](tick_sched_timer)、来自[ ](__hrtimer_run_queues.constprop.0+0xb0/0x228)
    [472109.986014][ ](__hrtimer_run_queues.constprop.0)、来自[ ](hrtimer_interrupt+0x104/0x388)
    [472109.986041][ ](hrtimer_interrupt) ](dmtimer_clockevent_interrupt+0x24/0x2C)
    [472109.986067][ ](dmtimer_clockevent_interrupt) ](__HANDLE_IRQ_EVENT_PERCPU+0x34/0x130)
    [472109.986086][ ](__HANDLE_IRQ_EVENT_PERCPU)、来自[ ](handle_IRQ_event+0x6c/0x108)
    [472109.986110][ ](handle_irq_event)、来自[ ](handle_level_IRQ+0xb8/0x1c8)
    [472109.986130][ ](handle_level_irq)、来自[ ](__handle_domain_IRQ+0x70/0xc4)

    所有其他经测试的设备也会重新启动、但不会有任何日志。

    使用 Linux 5.10.202 时、设备会在经过以下跟踪后重新启动:

    [30150.661815] INFO:task kworker/0:3:14931 被阻止超过 122 秒。  
    [30150.669191]没有污染 5.10.202 #1  
    [30150.678799]“echo 0 >/proc/sys/kernel/hung_task_timeout_secs 禁用此消息。  
    [30150.689689]任务:kworker/0:3 state:D stack: 0 pid:14931 PPID: 2 flag:0x00000000  
    [30150.700652]工作队列:events_freezable MMC_rescan  
    [30150.708270][ ](__schedule)、来自[ ](计划+0x90/0x118)  
    [30150.717959][ ](时间表)自[ ](schedule_hrtimeout_range_clock+0x120/0x18c)  
    [30150.729876][ ](schedule_hrtimeout_range_clock)、来自[ ](schedule_hrtimeout_range+0x1c/0x24)  
    [30150.743259][ ](schedule_hrtimeout_reange) from [ ](usleep_range+0x68/0x98)  
    [30150.754527][ ](uleep_range) 自[ ](sdHCI_OMAP-Linit_74_clocks+0x9C/0x118)  
    [30150.766908][ ](sdhci_OMAP-Linit_74_clocks)、来自[ ](sdhci_set_ios+0xd0/0x4e4)  
    [30150.779320][ ](sdhci_set_ios)、来自[ ](sdHCI_OMAP_SET_IOS+0xd0/0x10c)  
    [30150.790808][ ](sdhci_OMAP-LSET_IOS)、来自[ ](mmc_power_up.part.0+0xbc/0x148)  
    [30150.802449][ ](mmc_power_up.part.0)、来自[ ](MMC_REscan+0x348/0x574)  
    [30150.811097][ ](mmc_rescan)、来自[ ](Process_One_Work+0x1c4/0x444)  
    [30150.822720][ ](proce_one_work)、来自[ ](worker_thread+0x74/0x614)  
    [30150.831446][ ](worker_thread)、来自[ ](kthread+0x170/0x178)  
    [30150.842092][ ](kthread)(来自[ ](ret_from_fork+0x14/0x2C)  
    [30150.849721]异常堆栈 (0xc3f81fb0 至 0xc3f81ff8)  
    [30150.861373(2001) 1fa0: 00000000 00000000 00000000  
    [30150.872927] 1fc0:00000000 00000000 00000000 00000000 00000000  
    [30150.883923] 1fe0:00000000 00000000 00000000 00000013 00000000  
    [30150.890988]内核紧急 — 未同步: Hung_task :阻止的任务  
    [30150.902330] mtdoops:就绪 4、5(无擦除)  
    [30150.906656] 5 秒后重启。

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

    您好、Hmaied、

    禁用 mmc0 的设备也会重新启动

    因此重启问题似乎与 mmc0 无关、对吧?

    请在您的电路板上运行以下命令、查看它是否显示在 RCU_PREEME STALL 消息之前有任何中断产生风暴。

    # 虽然真;做猫/proc/interrupts ;睡眠 1;完成&

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

    在运行时、只有 mmc0(+~50/秒)和 clockevent(+~280/秒)中断持续增加:while true;do cat /proc/interrupts;sleep 1;done &  

    通过: echo w >/proc/sysrq-trigger、我们可以看到 MMC_rescan 工作队列任务通常被阻止::

    [241384.140026] sysrq:显示被阻止的状态
    [241384.146172] task:kworker/0:3   state:D stack:  0 pid:14035 PPID:   2 flag:0x00000000
    [241384.146259]工作队列:events_freezable MMC_rescan
    [241384.146318][ ](__schedule)、来自[ ](计划+0x90/0x118)
    [241384.146348] ](时间表)自[ ](schedule_hrtimeout_range_clock+0x120/0x18c)
    [241384.146372][ ](schedule_hrtimeout_range_clock)、来自[ ](schedule_hrtimeout_range+0x1c/0x24)
    [241384.146393][ ](schedule_hrtimeout_reange) from [ ](usleep_range+0x68/0x98)
    [241384.146412][ ](uleep_range) 自[ ](MMC_REscan+0x348/0x574)
    [241384.146442][ ](mmc_rescan)、来自[ ](Process_One_Work+0x1c4/0x448)
    [241384.146462][ ](proce_one_work)、来自[ ](worker_thread+0x74/0x614)
    [241384.146488] ](worker_thread)、来自[ ](kthread+0x170/0x178)
    [241384.146511] ](kthread)(来自[ ](ret_from_fork+0x14/0x2C)
    [241384.146522]异常栈 (0xc1ce9fb0 至 0xc1ce9ff8)
    [241384.146537] 9fa0:                    00000000 00000000 00000000
    [241384.146553] 9fc0:00000000 00000000 00000000 00000000 00000000
    [241384.146567] 9fe0:00000000 00000000 00000000 00000013 00000000
    [242224.207454] sysrq:显示被阻止的状态
    [242224.212849]任务:kworker/0:3   state:D stack:  0 pid:14035 PPID:   2 flag:0x00000000
    [242224.212934]工作队列:events_freezable MMC_rescan
    [242224.212992][ ](__schedule)、来自[ ](计划+0x90/0x118)
    [242224.213021][ ](时间表)自[ ](schedule_hrtimeout_range_clock+0x120/0x18c)
    [242224.213045][ ](schedule_hrtimeout_range_clock)、来自[ ](schedule_hrtimeout_range+0x1c/0x24)
    [242224.213066][ ](schedule_hrtimeout_reange) from [ ](usleep_range+0x68/0x98)
    [242224.213084][ ](uleep_range) 自[ ](MMC_rescan+0x50c/0x574)
    [242224.213112][ ](mmc_rescan)、来自[ ](Process_One_Work+0x1c4/0x448)
    [242224.213134][ ](proce_one_work)、来自[ ](worker_thread+0x74/0x614)
    [242224.213161][ ](worker_thread)、来自[ ](kthread+0x170/0x178)
    [242224.213183][ ](kthread)(来自[ ](ret_from_fork+0x14/0x2C)
    [242224.213194]异常堆栈 (0xc1ce9fb0 至 0xc1ce9ff8)
    [242224.213209] 9fa0:                    00000000 00000000 00000000
    [242224.213226] 9fc0:00000000 00000000 00000000 00000000 00000000
    [242224.213239] 9fe0:00000000 00000000 00000000 00000013 00000000

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

    sdcard CD 引脚在您的电路板上是否有上拉电阻器?

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

    我们的板上未使用 CD 引脚。 引脚多路复用配置中未定义。

    下面是我们的当前引脚多路复用:

        mmc1_pins_default:pinmux_mmc1_pins{
            pinctrl-single、pins =<
                AM33XX_IOPAD (0x8fc、PIN_INPUT_PULLUP | MUX_MODE0)    /* mmc0_dat0.mmc0_dat0 */
                AM33XX_IOPAD (0x8f8、PIN_INPUT_PULLUP | MUX_MODE0)    /* mmc0_dat1.mmc0_dat1 */
                AM33XX_IOPAD (0x8f4、PIN_INPUT_PULLUP | MUX_MODE0)    /* mmc0_dat2.mmc0_dat2 */
                AM33XX_IOPAD (0x8f0、PIN_INPUT_PULLUP | MUX_MODE0)    /* mmc0_dat3.mmc0_dat3 */
                AM33XX_IOPAD (0x904、PIN_INPUT_PULLUP | MUX_MODE0)    /* mmc0_cmd.mmc0_cmd */
                AM33XX_IOPAD (0x900、PIN_INPUT_PULLUP | MUX_MODE0)    /* mmc0_clk.mmc0_clk */
            >;
        };
        mmc1_pins_sleep:pinmux_mmc1_pins_sleep{
            pinctrl-single、pins =<
                AM33XX_IOPAD (0x8fc、PIN_INPUT_PULLDOWN | MUX_MODE7)   /* mmc0_dat0.mmc0_dat0 */
                AM33XX_IOPAD (0x8f8、PIN_INPUT_PULLDOWN | MUX_MODE7)   /* mmc0_dat1.mmc0_dat1 */
                AM33XX_IOPAD (0x8f4、PIN_INPUT_PULLDOWN | MUX_MODE7)   /* mmc0_dat2.mmc0_dat2 */
                AM33XX_IOPAD (0x8f0、PIN_INPUT_PULLDOWN | MUX_MODE7)   /* mmc0_dat3.mmc0_dat3 */
                AM33XX_IOPAD (0x904、PIN_INPUT_PULLDOWN | MUX_MODE7)   /* mmc0_cmd.mmc0_cmd */
                AM33XX_IOPAD (0x900、PIN_INPUT_PULLDOWN | MUX_MODE7)   /* mmc0_clk.mmc0_clk */
            >;
        };

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

    如果没有 sdcard CD 针脚、软件将如何知道何时将 sdcard 插入插槽?

    所有 AM335x EVM 都有一个连接到插槽固定框架的 CD 引脚的 GPIO 引脚。

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

    尊敬的 Bin:

    我们使用下拉电阻添加了一条 GPIO-CD 线路、因此系统不会检测任何 SD 卡插入(出于测试目的)。

    AM33XX_IOPAD (0x8f4、PIN_INPUT_PULLUP | MUX_MODE0)  /* mmc0_dat2.mmc0_dat2 */
    AM33XX_IOPAD (0x8f0、PIN_INPUT_PULLUP | MUX_MODE0)  /* mmc0_dat3.mmc0_dat3 */
    AM33XX_IOPAD (0x904、PIN_INPUT_PULLUP | MUX_MODE0)  /* mmc0_cmd.mmc0_cmd */
    AM33XX_IOPAD (0x900、PIN_INPUT_PULLUP | MUX_MODE0)  /* mmc0_clk.mmc0_clk */
    AM33XX_IOPAD (0x990、PIN_INPUT_PULLUP | MUX_MODE7)  /* McASP0_aclkx.GPIO3_14 */
    ...
    &mmc1{
        pinctrl-names =“default",“,"sleep"、"sleep";“;</s>“
        pinctrl-0 =<&mmc1_pins_default>;
        pinctrl-1 =<&mmc1_pins_sleep>;
        CD-GPIOs =<&GPIO3 14 GPIO_ACTIVE_LOW>;
    };

    /proc/interrupts 中的中断保持稳定、但产品仍然在没有任何日志的情况下自动重启。

    什么可能导致系统在不产生任何日志的情况下重新启动?
    在这种情况下、为什么不记录内核消息、是否有已知的原因?

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

    您好、Hmaied、

    我们使用下拉电阻添加了 GPIO-CD 行

    我认为应该通过电阻器上拉 CD、为什么要将其下拉?

    /proc/interrupts 中的中断保持稳定、

    根据稳定、这是否意味着 mmc0 不再增加? 您曾说在添加 CD 引脚之前增加~50/秒。

    所有其他经测试的设备也会重新启动、但不需要任何日志。

    使用 Linux 5.10.202 时、设备会在经过以下跟踪后重新启动:

    [30150.661815] INFO:task kworker/0:3:14931 被阻止超过 122 秒。  
    [30150.669191]没有污染 5.10.202 #1  
    [30150.678799]“echo 0 >/proc/sys/kernel/hung_task_timeout_secs 禁用此消息。  
    [30150.689689]任务:kworker/0:3 state:D stack: 0 pid:14931 PPID: 2 flag:0x00000000  
    [30150.700652]工作队列:events_freezable MMC_rescan
     

    您能否总结一下您所做的行为和测试? 我想我和你之前的所有消息都混淆了。

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

    很抱歉混淆。 是的、我们实际上将 CD 针向上拉、而不是向下拉、目的是防止产品在测试过程中检测到任何 SD 卡。
    是的、添加此修改后、mmc0 中断停止增加、但在 GPIO-CD 更改之前、它们以~50/秒的速度递增

    我使用两个不同的内核版本进行了测试。
    使用 Linux 5.10.202 时、我会在重新引导前立即获得以下日志:

    [30150.661815] INFO:task kworker/0:3:14931 被阻止超过 122 秒。
    [30150.669191]没有污染 5.10.202 #1
    [30150.678799]“echo 0 >/proc/sys/kernel/hung_task_timeout_secs 禁用此消息。
    [30150.689689]任务:kworker/0:3 state:D stack: 0 pid:14931 PPID: 2 flag:0x00000000
    [30150.700652]工作队列:events_freezable MMC_rescan
    ...
    [30150.890988]内核紧急 — 未同步: Hung_task :阻止的任务
    [30150.902330] mtdoops:就绪 4、5(无擦除)
    [30150.906656] 5 秒后重启。


    使用此内核时、如果禁用 mmc0、则产品不会重新启动。

    但是、使用 Linux 5.10.100(版本 08.02.01)时、我根本没有日志、即使禁用 mmc0、产品最终也会重新启动。

    我希望这澄清了我所做的测试。
    如果您需要更多详细信息或仍有疑问、请告诉我。

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

    您好、Hmaied、

    感谢您的澄清。 我现在很清楚。

    我使用两个不同的内核版本进行了测试。
    使用 Linux 5.10.202 时、我会在重新引导前立即获得以下日志:

    [30150.661815] INFO:task kworker/0:3:14931 被阻止超过 122 秒。
    [30150.669191]没有污染 5.10.202 #1
    [30150.678799]“echo 0 >/proc/sys/kernel/hung_task_timeout_secs 禁用此消息。
    [30150.689689]任务:kworker/0:3 state:D stack: 0 pid:14931 PPID: 2 flag:0x00000000
    [30150.700652]工作队列:events_freezable MMC_rescan

    该消息似乎指示问题仍与 mmc0 相关。 但我目前正在进行一项关键工作、没有研究内核代码的带宽、您能否使用最新的 SDK (v11.2) 内核进行测试、看看问题是否仍然发生。 SDK8.2 是几年前发布的、已经不在 E2E 论坛的支持范围内。