Hey,
Just ran io-uring-bench on my VM to /dev/nullb0 and got the following
soft lockup [1], the reproducer is as simple as:
modprobe null_blk
tools/io_uring/io_uring-bench /dev/nullb0
It looks like io_iopoll_getevents() can hog the cpu, however I don't
yet really know what is preventing it from quickly exceeding min and
punting back...
Adding this makes the problem go away:
--
diff --git a/fs/io_uring.c b/fs/io_uring.c
index 8b9dbf3b2298..aba03eee5c81 100644
--- a/fs/io_uring.c
+++ b/fs/io_uring.c
@@ -779,6 +779,7 @@ static int io_iopoll_getevents(struct io_ring_ctx
*ctx, unsigned int *nr_events,
return ret;
if (!min || *nr_events >= min)
return 0;
+ cond_resched();
}
return 1;
--
But I do not know if this is the correct way to fix this, or what
exactly is the issue, but thought I send it out given its so
easy to reproduce.
[1]:
--
[1032930.615999] watchdog: BUG: soft lockup - CPU#2 stuck for 22s!
[io_uring-bench:21221]
[1032930.626182] RIP: 0010:io_iopoll_getevents+0xaf/0x260
[...]
[1032930.626942] Call Trace:
[1032930.627598] io_iopoll_check+0x34/0x70
[1032930.627601] __x64_sys_io_uring_enter+0x183/0x300
[1032930.627729] do_syscall_64+0x55/0x130
[1032930.627911] entry_SYSCALL_64_after_hwframe+0x44/0xa9
[1032930.627927] RIP: 0033:0x7fa4641d7839
[...]
[1032958.615873] watchdog: BUG: soft lockup - CPU#2 stuck for 22s!
[io_uring-bench:21221]
[1032958.720822] RIP: 0010:blkdev_iopoll+0x0/0x30
[...]
[1032958.721116] Call Trace:
[1032958.721624] io_iopoll_getevents+0xaa/0x260
[1032958.721635] io_iopoll_check+0x34/0x70
[1032958.721637] __x64_sys_io_uring_enter+0x183/0x300
[1032958.721642] do_syscall_64+0x55/0x130
[1032958.721649] entry_SYSCALL_64_after_hwframe+0x44/0xa9
[1032958.721654] RIP: 0033:0x7fa4641d7839
[...]
--