代码之家  ›  专栏  ›  技术社区  ›  romaric crailox

在ttymxc上调用open函数时的rcu_prempt

  •  3
  • romaric crailox  · 技术社区  · 7 年前

    在linux系统上,我面临一个问题:当我在ttymxc外围设备上调用open()函数时,在数秒的不活动后,我会收到一个rcu_prempt错误。我通过 O_RDWR , O_NDELAY 和 O_NOCTTY 选项。

    我读过 this document 并尝试解释“微调RCU CPU暂停检测器”部分,但我获得了关于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)
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   romaric crailox    7 年前

    在open()调用之前,我们似乎没有为物理设备供电。我们不明白为什么系统会在这种情况下陷入困境,但open()之前的电源设备解决了这个问题。