Refactor how we do io_req_prep(), which is currently spilled across multiple ifs and functions, that's a mess which is hard to validate. It also cuts down amount of work we're doing during submission, where nops(batch=32) test shows 15217 vs 16830 KIOPS, before and after respectively. 1-6 are easy and should change nothing functionally. 7/11 cancels all the link, where currently it can be partially executed. That happens only in some cases, and currently is not consistent. That change alters the user visible behaviour and breaks one liburing test, but looks like the right thing to do. (IMHO, the test is buggy in that regard). 8/11 makes us to do one more opcode switch for where we previously were doing io_req_defer_prep(). That includes all links, but the total performance win, removing an extra async setup in 10/11, and just making all the thing cleaner justifies it well enough. Pavel Begunkov (11): io_uring: kill fictitious submit iteration index io_uring: keep io_*_prep() naming consistent io_uring: don't duplicate ->file check in sfr io_uring: move io_init_req()'s definition io_uring: move io_init_req() into io_submit_sqe() io_uring: move req link into submit_state io_uring: don't submit link on error io_uring: split sqe-prep and async setup io_uring: do io_*_prep() early in io_submit_sqe() io_uring: don't do async setup for links' heads io_uring: fail links more in io_submit_sqe() fs/io_uring.c | 460 +++++++++++++++++++++++++------------------------- 1 file changed, 228 insertions(+), 232 deletions(-) -- 2.24.0