block, bfq: lockdep circular locking dependency gripe

From: Mike Galbraith
Date: Tue Oct 20 2020 - 02:15:58 EST


[ 1917.361401] ======================================================
[ 1917.361406] WARNING: possible circular locking dependency detected
[ 1917.361413] 5.9.0.g7cf726a-master #2 Tainted: G S E
[ 1917.361417] ------------------------------------------------------
[ 1917.361422] kworker/u16:35/15995 is trying to acquire lock:
[ 1917.361428] ffff89232237f7e0 (&ioc->lock){..-.}-{2:2}, at: put_io_context+0x30/0x90
[ 1917.361440]
but task is already holding lock:
[ 1917.361445] ffff892244d2cc08 (&bfqd->lock){-.-.}-{2:2}, at: bfq_insert_requests+0x89/0x680
[ 1917.361456]
which lock already depends on the new lock.

[ 1917.361463]
the existing dependency chain (in reverse order) is:
[ 1917.361469]
-> #1 (&bfqd->lock){-.-.}-{2:2}:
[ 1917.361479] _raw_spin_lock_irqsave+0x3d/0x50
[ 1917.361484] bfq_exit_icq_bfqq+0x48/0x3f0
[ 1917.361489] bfq_exit_icq+0x13/0x20
[ 1917.361494] put_io_context_active+0x55/0x80
[ 1917.361499] do_exit+0x72c/0xca0
[ 1917.361504] do_group_exit+0x47/0xb0
[ 1917.361508] __x64_sys_exit_group+0x14/0x20
[ 1917.361513] do_syscall_64+0x33/0x40
[ 1917.361518] entry_SYSCALL_64_after_hwframe+0x44/0xa9
[ 1917.361523]
-> #0 (&ioc->lock){..-.}-{2:2}:
[ 1917.361532] __lock_acquire+0x149d/0x1a70
[ 1917.361537] lock_acquire+0x1a7/0x3b0
[ 1917.361542] _raw_spin_lock_irqsave+0x3d/0x50
[ 1917.361547] put_io_context+0x30/0x90
[ 1917.361552] blk_mq_free_request+0x4f/0x140
[ 1917.361557] blk_attempt_req_merge+0x19/0x30
[ 1917.361563] elv_attempt_insert_merge+0x4f/0x90
[ 1917.361568] blk_mq_sched_try_insert_merge+0x28/0x40
[ 1917.361574] bfq_insert_requests+0x94/0x680
[ 1917.361579] blk_mq_sched_insert_requests+0xd1/0x2a0
[ 1917.361584] blk_mq_flush_plug_list+0x12d/0x240
[ 1917.361589] blk_flush_plug_list+0xb4/0xd0
[ 1917.361594] io_schedule_prepare+0x3c/0x40
[ 1917.361599] io_schedule+0xb/0x40
[ 1917.361604] blk_mq_get_tag+0x13a/0x250
[ 1917.361608] __blk_mq_alloc_request+0x5c/0x130
[ 1917.361613] blk_mq_submit_bio+0xf3/0x770
[ 1917.361618] submit_bio_noacct+0x41e/0x4b0
[ 1917.361622] submit_bio+0x33/0x160
[ 1917.361644] ext4_io_submit+0x49/0x60 [ext4]
[ 1917.361661] ext4_writepages+0x683/0x1070 [ext4]
[ 1917.361667] do_writepages+0x3c/0xe0
[ 1917.361672] __writeback_single_inode+0x62/0x630
[ 1917.361677] writeback_sb_inodes+0x218/0x4d0
[ 1917.361681] __writeback_inodes_wb+0x5f/0xc0
[ 1917.361686] wb_writeback+0x283/0x490
[ 1917.361691] wb_workfn+0x29a/0x670
[ 1917.361696] process_one_work+0x283/0x620
[ 1917.361701] worker_thread+0x39/0x3f0
[ 1917.361706] kthread+0x152/0x170
[ 1917.361711] ret_from_fork+0x1f/0x30
[ 1917.361715]
other info that might help us debug this:

[ 1917.361722] Possible unsafe locking scenario:

[ 1917.361728] CPU0 CPU1
[ 1917.361731] ---- ----
[ 1917.361736] lock(&bfqd->lock);
[ 1917.361740] lock(&ioc->lock);
[ 1917.361746] lock(&bfqd->lock);
[ 1917.361752] lock(&ioc->lock);
[ 1917.361757]
*** DEADLOCK ***

[ 1917.361763] 5 locks held by kworker/u16:35/15995:
[ 1917.361767] #0: ffff892240c9bd38 ((wq_completion)writeback){+.+.}-{0:0}, at: process_one_work+0x1fa/0x620
[ 1917.361778] #1: ffff94569342fe78 ((work_completion)(&(&wb->dwork)->work)){+.+.}-{0:0}, at: process_one_work+0x1fa/0x620
[ 1917.361789] #2: ffff8921424ae0e0 (&type->s_umount_key#39){++++}-{3:3}, at: trylock_super+0x16/0x50
[ 1917.361800] #3: ffff8921424aaa40 (&sbi->s_writepages_rwsem){.+.+}-{0:0}, at: do_writepages+0x3c/0xe0
[ 1917.361811] #4: ffff892244d2cc08 (&bfqd->lock){-.-.}-{2:2}, at: bfq_insert_requests+0x89/0x680
[ 1917.361821]
stack backtrace:
[ 1917.361827] CPU: 6 PID: 15995 Comm: kworker/u16:35 Kdump: loaded Tainted: G S E 5.9.0.g7cf726a-master #2
[ 1917.361833] Hardware name: MEDION MS-7848/MS-7848, BIOS M7848W08.20C 09/23/2013
[ 1917.361840] Workqueue: writeback wb_workfn (flush-8:32)
[ 1917.361846] Call Trace:
[ 1917.361854] dump_stack+0x77/0x97
[ 1917.361860] check_noncircular+0xe7/0x100
[ 1917.361866] ? __lock_acquire+0x2ce/0x1a70
[ 1917.361872] ? __lock_acquire+0x149d/0x1a70
[ 1917.361877] __lock_acquire+0x149d/0x1a70
[ 1917.361884] lock_acquire+0x1a7/0x3b0
[ 1917.361889] ? put_io_context+0x30/0x90
[ 1917.361894] ? bfq_put_queue+0xcf/0x480
[ 1917.361901] _raw_spin_lock_irqsave+0x3d/0x50
[ 1917.361906] ? put_io_context+0x30/0x90
[ 1917.361911] put_io_context+0x30/0x90
[ 1917.361916] blk_mq_free_request+0x4f/0x140
[ 1917.361921] blk_attempt_req_merge+0x19/0x30
[ 1917.361926] elv_attempt_insert_merge+0x4f/0x90
[ 1917.361932] blk_mq_sched_try_insert_merge+0x28/0x40
[ 1917.361937] bfq_insert_requests+0x94/0x680
[ 1917.361944] blk_mq_sched_insert_requests+0xd1/0x2a0
[ 1917.361950] blk_mq_flush_plug_list+0x12d/0x240
[ 1917.361956] blk_flush_plug_list+0xb4/0xd0
[ 1917.361962] io_schedule_prepare+0x3c/0x40
[ 1917.361967] io_schedule+0xb/0x40
[ 1917.361972] blk_mq_get_tag+0x13a/0x250
[ 1917.361978] ? wait_woken+0xa0/0xa0
[ 1917.361984] __blk_mq_alloc_request+0x5c/0x130
[ 1917.361989] blk_mq_submit_bio+0xf3/0x770
[ 1917.361996] submit_bio_noacct+0x41e/0x4b0
[ 1917.362002] ? submit_bio+0x33/0x160
[ 1917.362007] submit_bio+0x33/0x160
[ 1917.362028] ext4_io_submit+0x49/0x60 [ext4]
[ 1917.362045] ext4_writepages+0x683/0x1070 [ext4]
[ 1917.362056] ? do_writepages+0x3c/0xe0
[ 1917.362060] do_writepages+0x3c/0xe0
[ 1917.362067] ? __writeback_single_inode+0x62/0x630
[ 1917.362072] __writeback_single_inode+0x62/0x630
[ 1917.362078] writeback_sb_inodes+0x218/0x4d0
[ 1917.362087] __writeback_inodes_wb+0x5f/0xc0
[ 1917.362093] wb_writeback+0x283/0x490
[ 1917.362100] ? wb_workfn+0x29a/0x670
[ 1917.362104] wb_workfn+0x29a/0x670
[ 1917.362112] ? process_one_work+0x283/0x620
[ 1917.362117] ? process_one_work+0x251/0x620
[ 1917.362121] process_one_work+0x283/0x620
[ 1917.362128] worker_thread+0x39/0x3f0
[ 1917.362133] ? process_one_work+0x620/0x620
[ 1917.362138] kthread+0x152/0x170
[ 1917.362142] ? kthread_park+0x90/0x90
[ 1917.362148] ret_from_fork+0x1f/0x30