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.

[参考译文] J721EXSOMXEVM:UART 8250 OMAP 死锁问题

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1592470/j721exsomxevm-uart-8250-omap-deadlock-issue

器件型号: J721EXSOMXEVM

我发现 UART 8250_OMAP-Lc Linux 驱动程序有问题。 当我在 UART(用于外部蓝牙模块)内核上启用子节点时、RCU 停滞。 我发现了一种导致僵局的情况。

该问题与内核“ti-linux-6.6.y"标签“标签:10.01.02 有关。  

驱动程序在 1856 的函数 omap8250_runtime_resume() 行中使用 port->lock。 但在这种情况下、锁被串行线路层占据。  

我们通过禁用 UART 的 UART_CAP_RPM 来解决这个问题。  
此场景的栈轨道如下:
 
queized_spin_lock_slowpath (lock = 0xFFFF80008235D7B8、val = 1141638144)
queed_sin_lock(内联)
DO_RAW_SPIN_LOCK (LOCK = 0x80008235D7B8)
_RAW_SPIN_LOCK_IRQ(内联)
_RAW_SPIN_LOCK_IRQ (LOCK = 0x80008235D7B8)                                 !!!!!! 死锁
omap8250_runtime_resume (dev = 0xFFFF000000187010)
pm_generic_runtime_resume (dev =?????)
__genpd_runtime_resume (dev =????)
genpd_runtime_resume (dev = 0xFFFF000000187010)
__rpm_callback (cb = 0x800080817D44、dev = 0xFFFF000000187010)
RPM_Callback (cb =??、dev = 0xFFFF000000187010)
RPM_resume (dev = 0xFFFF000000187010、rpmflags = 4)
__pm_runtime_resume (dev = 0xFFFF000000187010、rpmflags = 192)
PM_RUNTIME_GET_SYNC(内联)
serial8250_rpm_get(内联)
serial8250_rpm_get(内联)
serial8250_DO_get_mctrl (port = 0x80008235D7B8)
serial8250_get_mctrl(port =???)
UART_LINE_INFO(内联)                                               !!!!!! 获取端口->锁定呼叫 mctrl
UART_proc_show(m = 0xFFFF000005CB1658、v =??)
SEQ_READ_ITER (iocb = 0x800083943D48、ITER = 0x800083943D20)
PROC_reg_read_ITER (iocb =???、ITER =????)
CALL_READ_ITER(内联)
NEW_SYNC_READ(内联)
VFS_READ (FILE = 0xFFFF000007BCC400、buf = 0x0361A7F0、count = 1024、pos = 0xFFFF800083943DC0)
ksys_read (fd =??、buf = 0x0361A7F0、count = 1024)
_do_sys_read(内联)
__se_sys_read(内联)
__arm64_sys_read (regs =????)
__调用_syscall(内联)
Invoke_syscall (regs = 0xFFFF800083943EB0、scno =???、sc_nr =???、syscall_table =????)
el0_svc_common(regs = 0xFFFF800083943EB0、scno =???、syscall_table =???、SC_nr =?)
Do_el0_svc(寄存器=?????)
EL0_Svc (REGS = 0xFFFF800083943EB0)
el0t_64_sync_handler (regs =?????)
el0t_64_SYNC (asm)
异常
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Robert:

    感谢您指出这一点。  

    我们通过禁用 UART 的 UART_CAP_RPM 来解决这个问题。  [/报价]

    建议 1:

    这将是一个与当前 Linux 内核 6.6 一起使用的解决方案。

    建议 2:

    有很多暂停恢复问题发生与这个内核版本和很多补丁已经进来来修复这些问题,因此,理想情况下,最新的内核不应该有这些问题,并尝试这也将是一个替代的解决方案。

    此致

    Gokul Praveen

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

    感谢您的快速答复。

    我们现在将应用解决方案 1。 我们计划稍后切换到最新的内核。 我们需要先完成模块测试。

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

    当然可以、Robert。

    此致

    Gokul Praveen。