"blk-mq: fix tag_get wait task can't be awakened" causes hangs

From: Alex Xu (Hello71)
Date: Mon Jan 24 2022 - 11:24:40 EST


Hi,

Recently on torvalds master, I/O on USB flash drives started hanging
here:

task:systemd-udevd state:D stack: 0 pid: 374 ppid: 347 flags:0x00004000
Call Trace:
<TASK>
? __schedule+0x319/0x4a0
? schedule+0x77/0xa0
? io_schedule+0x43/0x60
? blk_mq_get_tag+0x175/0x2b0
? mempool_alloc+0x33/0x170
? init_wait_entry+0x30/0x30
? __blk_mq_alloc_requests+0x1b4/0x220
? blk_mq_submit_bio+0x213/0x490
? submit_bio_noacct+0x22c/0x270
? xa_load+0x48/0x80
? mpage_readahead+0x114/0x130
? blkdev_fallocate+0x170/0x170
? read_pages+0x48/0x1d0
? page_cache_ra_unbounded+0xee/0x1f0
? force_page_cache_ra+0x68/0xc0
? filemap_read+0x18c/0x9a0
? blkdev_read_iter+0x4e/0x120
? vfs_read+0x265/0x2d0
? ksys_read+0x50/0xa0
? do_syscall_64+0x62/0x90
? do_user_addr_fault+0x271/0x3c0
? asm_exc_page_fault+0x8/0x30
? exc_page_fault+0x58/0x80
? entry_SYSCALL_64_after_hwframe+0x44/0xae
</TASK>

mount(8) hangs with a similar backtrace, making the device effectively
unusable. It does not seem to affect NVMe or SATA attached drives. The
affected drive does not support UAS. I don't currently have UAS drives
to test with. The default I/O scheduler is set to noop.

I found that reverting 180dccb0dba4 ("blk-mq: fix tag_get wait
task can't be awakened") appears to resolve the issue.

Let me know what other information is needed.

Cheers,
Alex.