linux - 在 ttymxc 上调用 open 函数时的 rcu_prempt

标签 linux linux-kernel tty

我在 Linux 系统上遇到一个问题:当我在 ttymxc 外围设备上调用 open() 函数时,我在几秒钟不活动后收到 rcu_prempt 错误。我传递了 O_RDWRO_NDELAYO_NOCTTY 选项。

我读了this document并尝试解释“Fine-Tuning the RCU CPU Stall Detector”部分,但我获得了有关 rcu_prempt 后果的更多信息(什么是阻塞进程),但我无法理解起源......

如果有人有一些探索的想法,因为我现在被困住了......

这里是内核日志:

kernel: [   48.534370] INFO: rcu_preempt self-detected stall on CPU
kernel: [   48.539705]        0-...: (1 ticks this GP)
idle=26b/140000000000001/0 softirq=6846/6846 fqs=0 kernel: [  
48.547880]         (t=2717 jiffies g=1149 c=1148 q=6) kernel: [   48.552514] rcu_preempt kthread starved for 2717 jiffies! g1149 c1148 f0x0 s3 ->state=0x1 kernel: [   48.560693] Task dump for CPU 0:
kernel: [   48.563923] mmcqd/0         R running      0   135      2
0x00000002 kernel: [   48.570331] [<80015378>] (unwind_backtrace) from
[<800136a0>] (show_stack+0x10/0x14) kernel: [   48.570351]
[<800136a0>] (show_stack) from [<8006555c>]
(rcu_dump_cpu_stacks+0xa8/0x108) kernel: [   48.570371] [<8006555c>]
(rcu_dump_cpu_stacks) from [<80068d0c>]
(rcu_check_callbacks+0x478/0x8b8) kernel: [   48.570390] [<80068d0c>]
(rcu_check_callbacks) from [<8006c64c>]
(update_process_times+0x38/0x64) kernel: [   48.570408] [<8006c64c>]
(update_process_times) from [<8007b0cc>] (tick_sched_handle+0x54/0x60)
kernel: [   48.570421] [<8007b0cc>] (tick_sched_handle) from
[<8007b134>] (tick_sched_timer+0x5c/0xb0) kernel: [   48.570436]
[<8007b134>] (tick_sched_timer) from [<8006cc24>]
(__hrtimer_run_queues.constprop.6+0x130/0x1c8) kernel: [   48.570451]
[<8006cc24>] (__hrtimer_run_queues.constprop.6) from [<8006d5ec>]
(hrtimer_interrupt+0xa0/0x244) kernel: [   48.570470] [<8006d5ec>]
(hrtimer_interrupt) from [<80390800>] (mxc_timer_interrupt+0x34/0x3c)
kernel: [   48.570492] [<80390800>] (mxc_timer_interrupt) from
[<8005ce08>] (handle_irq_event_percpu+0x88/0x14c) kernel: [  
48.570509] [<8005ce08>] (handle_irq_event_percpu) from [<8005cf28>] (handle_irq_event+0x5c/0x88) kernel: [   48.570523] [<8005cf28>]
(handle_irq_event) from [<8005ff54>] (handle_fasteoi_irq+0xb8/0x1fc)
kernel: [   48.570535] [<8005ff54>] (handle_fasteoi_irq) from
[<8005c6f8>] (generic_handle_irq+0x24/0x34) kernel: [   48.570550]
[<8005c6f8>] (generic_handle_irq) from [<8005c75c>]
(__handle_domain_irq+0x54/0xa8) kernel: [   48.570563] [<8005c75c>]
(__handle_domain_irq) from [<80009478>] (gic_handle_irq+0x48/0x7c)
kernel: [   48.570578] [<80009478>] (gic_handle_irq) from [<80014114>]
(__irq_svc+0x54/0x90) kernel: [   48.570587] Exception
stack(0x8f0a5de8 to 0x8f0a5e30) kernel: [   48.570599] 5de0:          
a00a0013 00000000 806689f8 00000000 806689f8 806689f8 kernel: [  
48.570610] 5e00: a00a0013 802b686c 00000004 8f014a18 8f0a4000 24590000 00000000 8f0a5e38 kernel: [   48.570619] 5e20: 8039a02c 8039859c
600a0013 ffffffff kernel: [   48.570639] [<80014114>] (__irq_svc) from
[<8039859c>] (clk_enable_unlock+0x60/0x104) kernel: [   48.570655]
[<8039859c>] (clk_enable_unlock) from [<8039a02c>]
(clk_enable+0x2c/0x34) kernel: [   48.570677] [<8039a02c>]
(clk_enable) from [<8037d874>] (sdhci_esdhc_runtime_resume+0xa8/0xbc)
kernel: [   48.570699] [<8037d874>] (sdhci_esdhc_runtime_resume) from
[<802b7e30>] (__rpm_callback+0x50/0x84) kernel: [   48.570715]
[<802b7e30>] (__rpm_callback) from [<802b7eb8>]
(rpm_callback+0x54/0x80) kernel: [   48.570730] [<802b7eb8>]
(rpm_callback) from [<802b8724>] (rpm_resume+0x3f8/0x688) kernel: [  
48.570742] [<802b8724>] (rpm_resume) from [<802b940c>] (__pm_runtime_resume+0x34/0x98) kernel: [   48.570755] [<802b940c>]
(__pm_runtime_resume) from [<8036303c>] (__mmc_claim_host+0x1a0/0x1f0)
kernel: [   48.570773] [<8036303c>] (__mmc_claim_host) from
[<80373ac8>] (mmc_blk_issue_rq+0x288/0x518) kernel: [   48.570787]
[<80373ac8>] (mmc_blk_issue_rq) from [<803754cc>]
(mmc_queue_thread+0xc8/0x18c) kernel: [   48.570802] [<803754cc>]
(mmc_queue_thread) from [<80047c44>] (kthread+0xdc/0xf0) kernel: [  
48.570818] [<80047c44>] (kthread) from [<80010030>] (ret_from_fork+0x14/0x24)

最佳答案

我似乎在 open() 调用之前我们没有为物理设备供电。我们不明白为什么系统会陷入这种情况,但是在 open() 之前给设备上电可以解决问题。

关于linux - 在 ttymxc 上调用 open 函数时的 rcu_prempt,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53515185/

相关文章:

c++ - 在 pty 下运行命令时出现双回显

c - 使用 gdb 和 tty 命令在单独的终端中调试时无法将数据输入到 C 程序

linux - 获取ELF文件信息

linux - 如何创建循环打印ps信息的脚本

Yii 使用 Gii 的 Linux 权限问题

c - 如何在c中实现类似于linux系统时钟的时钟

c - 为什么要用宏来调用函数

c - 无法理解运行 make 给出的错误

c - nl80211库和cfg80211是如何工作的?

linux - 如何在启动过程后切换 linux 内核控制台?