diff --git a/module/sock/uring/uring.c b/module/sock/uring/uring.c index 642636445..38cc6db81 100644 --- a/module/sock/uring/uring.c +++ b/module/sock/uring/uring.c @@ -884,23 +884,18 @@ static int spdk_sock_uring_group_reap(struct spdk_uring_sock_group_impl *group, int max, int max_read_events, struct spdk_sock **socks) { - int i, count, ret; - struct io_uring_cqe *cqe; + int count, i, completed_cqe_num; + struct io_uring_cqe *cqes[SPDK_SOCK_GROUP_QUEUE_DEPTH]; struct spdk_uring_sock *sock, *tmp; struct spdk_uring_task *task; int status; - for (i = 0; i < max; i++) { - ret = io_uring_peek_cqe(&group->uring, &cqe); - if (ret != 0) { - break; - } + max = spdk_min(max, SPDK_SOCK_GROUP_QUEUE_DEPTH); + completed_cqe_num = io_uring_peek_batch_cqe(&group->uring, cqes, max); + for (i = 0; i < completed_cqe_num; i++) { + assert(cqes[i] != NULL); - if (cqe == NULL) { - break; - } - - task = (struct spdk_uring_task *)cqe->user_data; + task = (struct spdk_uring_task *)cqes[i]->user_data; assert(task != NULL); sock = task->sock; assert(sock != NULL); @@ -908,8 +903,8 @@ spdk_sock_uring_group_reap(struct spdk_uring_sock_group_impl *group, int max, in assert(sock->group == group); sock->group->io_inflight--; sock->group->io_avail++; - status = cqe->res; - io_uring_cqe_seen(&group->uring, cqe); + status = cqes[i]->res; + io_uring_cqe_seen(&group->uring, cqes[i]); task->status = SPDK_URING_SOCK_TASK_NOT_IN_USE; diff --git a/test/unit/lib/sock/uring.c/uring_ut.c b/test/unit/lib/sock/uring.c/uring_ut.c index 29fafbcc5..f89e4da15 100644 --- a/test/unit/lib/sock/uring.c/uring_ut.c +++ b/test/unit/lib/sock/uring.c/uring_ut.c @@ -48,6 +48,8 @@ DEFINE_STUB(__io_uring_get_cqe, int, (struct io_uring *ring, struct io_uring_cqe DEFINE_STUB(io_uring_submit, int, (struct io_uring *ring), 0); DEFINE_STUB(io_uring_get_sqe, struct io_uring_sqe *, (struct io_uring *ring), 0); DEFINE_STUB(io_uring_queue_init, int, (unsigned entries, struct io_uring *ring, unsigned flags), 0); +DEFINE_STUB(io_uring_peek_batch_cqe, unsigned, (struct io_uring *ring, struct io_uring_cqe **cqes, + unsigned count), 0); DEFINE_STUB_V(io_uring_queue_exit, (struct io_uring *ring)); static void