io_uring: restructure submit sqes to_submit checks
Put an explicit check for number of requests to submit. First, we can turn while into do-while and it generates better code, and second that if can be cheaper, e.g. by using CPU flags after sub in io_sqring_entries(). Signed-off-by: Pavel Begunkov <asml.silence@gmail.com> Link: https://lore.kernel.org/r/5926baadd20c28feab7a5e1725fedf32e4553ff7.1632516769.git.asml.silence@gmail.com Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
Родитель
d9f9d2842c
Коммит
6962980947
|
@ -7225,16 +7225,19 @@ static const struct io_uring_sqe *io_get_sqe(struct io_ring_ctx *ctx)
|
|||
static int io_submit_sqes(struct io_ring_ctx *ctx, unsigned int nr)
|
||||
__must_hold(&ctx->uring_lock)
|
||||
{
|
||||
unsigned int entries = io_sqring_entries(ctx);
|
||||
int submitted = 0;
|
||||
|
||||
if (!entries)
|
||||
return 0;
|
||||
/* make sure SQ entry isn't read before tail */
|
||||
nr = min3(nr, ctx->sq_entries, io_sqring_entries(ctx));
|
||||
nr = min3(nr, ctx->sq_entries, entries);
|
||||
if (!percpu_ref_tryget_many(&ctx->refs, nr))
|
||||
return -EAGAIN;
|
||||
io_get_task_refs(nr);
|
||||
|
||||
io_submit_state_start(&ctx->submit_state, nr);
|
||||
while (submitted < nr) {
|
||||
do {
|
||||
const struct io_uring_sqe *sqe;
|
||||
struct io_kiocb *req;
|
||||
|
||||
|
@ -7253,7 +7256,7 @@ static int io_submit_sqes(struct io_ring_ctx *ctx, unsigned int nr)
|
|||
submitted++;
|
||||
if (io_submit_sqe(ctx, req, sqe))
|
||||
break;
|
||||
}
|
||||
} while (submitted < nr);
|
||||
|
||||
if (unlikely(submitted != nr)) {
|
||||
int ref_used = (submitted == -EAGAIN) ? 0 : submitted;
|
||||
|
|
Загрузка…
Ссылка в новой задаче