serial: imx: Possible circular locking dependency

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Petr and Sergey,

I know this has been reported before [1] and [2], but I am still
observing the deadlock below
on an imx6q board since commit dbdda842fe96 ("printk: Add console
owner and waiter logic to load balance console writes").

To reproduce it:

# echo t > /proc/sysrq-trigger

[   20.325246] ======================================================
[   20.325252] WARNING: possible circular locking dependency detected
[   20.325260] 5.15.0-rc2-next-20210924-00004-gd2d6e664f29f-dirty #163
Not tainted
[   20.325273] ------------------------------------------------------
[   20.325279] sh/236 is trying to acquire lock:
[   20.325293] c1618614 (console_owner){-...}-{0:0}, at:
console_unlock+0x180/0x5bc
[   20.325361]
[   20.325361] but task is already holding lock:
[   20.325368] eefccc90 (&pool->lock){-.-.}-{2:2}, at:
show_workqueue_state+0x104/0x3c8
[   20.325432]
[   20.325432] which lock already depends on the new lock.
[   20.325432]
[   20.325439]
[   20.325439] the existing dependency chain (in reverse order) is:
[   20.325446]
[   20.325446] -> #3 (&pool->lock){-.-.}-{2:2}:
[   20.325475]        __queue_work+0x114/0x810
[   20.325497]        queue_work_on+0x54/0x94
[   20.325516]        put_pwq_unlocked.part.0+0x18/0x24
[   20.325535]        trace_eval_sync+0x18/0x2c
[   20.325560]        do_one_initcall+0x78/0x388
[   20.325582]        kernel_init_freeable+0x198/0x22c
[   20.325613]        kernel_init+0x10/0x128
[   20.325631]        ret_from_fork+0x14/0x38
[   20.325646]        0x0
[   20.325657]
[   20.325657] -> #2 (&pool->lock/1){-.-.}-{2:2}:
[   20.325690]        __queue_work+0x114/0x810
[   20.325710]        queue_work_on+0x54/0x94
[   20.325727]        __imx_uart_rxint.constprop.0+0x1b4/0x2e0
[   20.325760]        imx_uart_int+0x270/0x310
[   20.325778]        __handle_irq_event_percpu+0x48/0x34c
[   20.325796]        handle_irq_event_percpu+0x2c/0x84
[   20.325811]        handle_irq_event+0x38/0x5c
[   20.325824]        handle_fasteoi_irq+0xc8/0x180
[   20.325848]        handle_domain_irq+0x68/0xa4
[   20.325862]        gic_handle_irq+0x88/0xb0
[   20.325881]        __irq_svc+0x60/0x80
[   20.325896]        cpuidle_enter_state+0x138/0x5a4
[   20.325915]        cpuidle_enter_state+0x138/0x5a4
[   20.325928]        cpuidle_enter+0x28/0x38
[   20.325941]        do_idle+0x210/0x2bc
[   20.325966]        cpu_startup_entry+0x18/0x1c
[   20.325982]        start_kernel+0x5d4/0x6d8
[   20.326005]
[   20.326005] -> #1 (&port_lock_key){-...}-{2:2}:
[   20.326033]        imx_uart_console_write+0x168/0x1ac
[   20.326059]        console_unlock+0x2a4/0x5bc
[   20.326083]        register_console+0x18c/0x2ec
[   20.326102]        uart_add_one_port+0x4b4/0x50c
[   20.326121]        imx_uart_probe+0x4ac/0x728
[   20.326140]        platform_probe+0x58/0xb8
[   20.326162]        really_probe+0x14c/0x320
[   20.326192]        __driver_probe_device+0x80/0xe4
[   20.326214]        driver_probe_device+0x30/0xd4
[   20.326234]        __driver_attach+0x70/0xf4
[   20.326255]        bus_for_each_dev+0x74/0xc0
[   20.326277]        bus_add_driver+0x150/0x1dc
[   20.326298]        driver_register+0x74/0x108
[   20.326313]        imx_uart_init+0x20/0x40
[   20.326341]        do_one_initcall+0x78/0x388
[   20.326358]        kernel_init_freeable+0x198/0x22c
[   20.326380]        kernel_init+0x10/0x128
[   20.326396]        ret_from_fork+0x14/0x38
[   20.326410]        0x0
[   20.326419]
[   20.326419] -> #0 (console_owner){-...}-{0:0}:
[   20.326445]        lock_acquire+0x130/0x400
[   20.326462]        console_unlock+0x1d0/0x5bc
[   20.326481]        vprintk_emit+0x1f0/0x2e8
[   20.326503]        vprintk_default+0x20/0x28
[   20.326522]        _printk+0x2c/0x5c
[   20.326553]        show_pwq+0x58/0x2b0
[   20.326572]        show_workqueue_state+0x11c/0x3c8
[   20.326597]        __handle_sysrq+0xf4/0x210
[   20.326619]        write_sysrq_trigger+0x6c/0x84
[   20.326636]        proc_reg_write+0xa8/0xcc
[   20.326667]        vfs_write+0xb8/0x544
[   20.326697]        ksys_write+0x60/0xec
[   20.326717]        ret_fast_syscall+0x0/0x1c
[   20.326733]        0xbec5b950
[   20.326743]
[   20.326743] other info that might help us debug this:
[   20.326743]
[   20.326750] Chain exists of:
[   20.326750]   console_owner --> &pool->lock/1 --> &pool->lock
[   20.326750]
[   20.326788]  Possible unsafe locking scenario:
[   20.326788]
[   20.326792]        CPU0                    CPU1
[   20.326797]        ----                    ----
[   20.326803]   lock(&pool->lock);
[   20.326814]                                lock(&pool->lock/1);
[   20.326833]                                lock(&pool->lock);
[   20.326846]   lock(console_owner);
[   20.326858]
[   20.326858]  *** DEADLOCK ***
[   20.326858]
[   20.326862] 5 locks held by sh/236:
[   20.326876]  #0: c2abd284 (sb_writers#4){.+.+}-{0:0}, at:
ksys_write+0x60/0xec
[   20.326933]  #1: c16e0d2c (rcu_read_lock){....}-{1:2}, at:
__handle_sysrq+0x0/0x210
[   20.326984]  #2: c16e0d2c (rcu_read_lock){....}-{1:2}, at:
show_workqueue_state+0x0/0x3c8
[   20.327035]  #3: eefccc90 (&pool->lock){-.-.}-{2:2}, at:
show_workqueue_state+0x104/0x3c8
[   20.327081]  #4: c161858c (console_lock){+.+.}-{0:0}, at:
vprintk_emit+0xd8/0x2e8
[   20.327133]
[   20.327133] stack backtrace:
[   20.327141] CPU: 1 PID: 236 Comm: sh Not tainted
5.15.0-rc2-next-20210924-00004-gd2d6e664f29f-dirty #163
[   20.327163] Hardware name: Freescale i.MX6 Quad/DualLite (Device Tree)
[   20.327177] [<c0111918>] (unwind_backtrace) from [<c010be08>]
(show_stack+0x10/0x14)
[   20.327224] [<c010be08>] (show_stack) from [<c0e87838>]
(dump_stack_lvl+0x58/0x70)
[   20.327260] [<c0e87838>] (dump_stack_lvl) from [<c0189520>]
(check_noncircular+0xf4/0x168)
[   20.327290] [<c0189520>] (check_noncircular) from [<c018d3a8>]
(__lock_acquire+0x167c/0x31e8)
[   20.327320] [<c018d3a8>] (__lock_acquire) from [<c018f97c>]
(lock_acquire+0x130/0x400)
[   20.327347] [<c018f97c>] (lock_acquire) from [<c01984d0>]
(console_unlock+0x1d0/0x5bc)
[   20.327381] [<c01984d0>] (console_unlock) from [<c019a778>]
(vprintk_emit+0x1f0/0x2e8)
[   20.327416] [<c019a778>] (vprintk_emit) from [<c019a890>]
(vprintk_default+0x20/0x28)
[   20.327453] [<c019a890>] (vprintk_default) from [<c0e83744>]
(_printk+0x2c/0x5c)
[   20.327498] [<c0e83744>] (_printk) from [<c0e826c4>] (show_pwq+0x58/0x2b0)
[   20.327534] [<c0e826c4>] (show_pwq) from [<c014acfc>]
(show_workqueue_state+0x11c/0x3c8)
[   20.327576] [<c014acfc>] (show_workqueue_state) from [<c06cedd8>]
(__handle_sysrq+0xf4/0x210)
[   20.327617] [<c06cedd8>] (__handle_sysrq) from [<c06cf3dc>]
(write_sysrq_trigger+0x6c/0x84)
[   20.327648] [<c06cf3dc>] (write_sysrq_trigger) from [<c03707d0>]
(proc_reg_write+0xa8/0xcc)
[   20.327692] [<c03707d0>] (proc_reg_write) from [<c02cfa40>]
(vfs_write+0xb8/0x544)
[   20.327733] [<c02cfa40>] (vfs_write) from [<c02d001c>] (ksys_write+0x60/0xec)
[   20.327770] [<c02d001c>] (ksys_write) from [<c0100080>]
(ret_fast_syscall+0x0/0x1c)
[   20.327803] Exception stack(0xc2a55fa8 to 0xc2a55ff0)
[   20.327824] 5fa0:                   00000001 0128cf28 00000001
0128cf28 00000002 00000000
[   20.327846] 5fc0: 00000001 0128cf28 00000002 00000004 00585444
bec5b98c 00000020 0128b008
[   20.327861] 5fe0: 00584c60 bec5b950 004bd630 b6f66a3c

[1] https://lore.kernel.org/lkml/20190917141034.gvjg7bgylqbbxyv7@xxxxxxxxxxxxxx/
[2] https://lore.kernel.org/linux-serial/1574416632-32321-1-git-send-email-fugang.duan@xxxxxxx/

Petr has suggested a way to fix it:
https://lore.kernel.org/lkml/20190926085855.debu7t46s7kgb26p@xxxxxxxxxxxxxxx/

but I am not familiar with the serial core code enough to give it a
try at implementing it.

Would it be possible for you to cook a patch to fix this issue so I
could try it?

Thanks a lot,

Fabio Estevam



[Index of Archives]     [Kernel Newbies]     [Security]     [Netfilter]     [Bugtraq]     [Linux PPP]     [Linux FS]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Linmodem]     [Device Mapper]     [Linux Kernel for ARM]

  Powered by Linux