sock/uring: use batched manner to get the cqes.

Purpose: This can improve the performance.

Change-Id: I3f5526ab8716cb0771b5e193afa9a0dbffec5cc0
Signed-off-by: Ziye Yang <ziye.yang@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/1929
Community-CI: Mellanox Build Bot
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: Changpeng Liu <changpeng.liu@intel.com>
Reviewed-by: Aleksey Marchuk <alexeymar@mellanox.com>
This commit is contained in:
Ziye Yang 2020-04-20 20:22:49 +08:00 committed by Tomasz Zawadzki
parent 4f6fe26199
commit 79215d80c1
2 changed files with 11 additions and 14 deletions

View File

@ -884,23 +884,18 @@ static int
spdk_sock_uring_group_reap(struct spdk_uring_sock_group_impl *group, int max, int max_read_events, spdk_sock_uring_group_reap(struct spdk_uring_sock_group_impl *group, int max, int max_read_events,
struct spdk_sock **socks) struct spdk_sock **socks)
{ {
int i, count, ret; int count, i, completed_cqe_num;
struct io_uring_cqe *cqe; struct io_uring_cqe *cqes[SPDK_SOCK_GROUP_QUEUE_DEPTH];
struct spdk_uring_sock *sock, *tmp; struct spdk_uring_sock *sock, *tmp;
struct spdk_uring_task *task; struct spdk_uring_task *task;
int status; int status;
for (i = 0; i < max; i++) { max = spdk_min(max, SPDK_SOCK_GROUP_QUEUE_DEPTH);
ret = io_uring_peek_cqe(&group->uring, &cqe); completed_cqe_num = io_uring_peek_batch_cqe(&group->uring, cqes, max);
if (ret != 0) { for (i = 0; i < completed_cqe_num; i++) {
break; assert(cqes[i] != NULL);
}
if (cqe == NULL) { task = (struct spdk_uring_task *)cqes[i]->user_data;
break;
}
task = (struct spdk_uring_task *)cqe->user_data;
assert(task != NULL); assert(task != NULL);
sock = task->sock; sock = task->sock;
assert(sock != NULL); 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); assert(sock->group == group);
sock->group->io_inflight--; sock->group->io_inflight--;
sock->group->io_avail++; sock->group->io_avail++;
status = cqe->res; status = cqes[i]->res;
io_uring_cqe_seen(&group->uring, cqe); io_uring_cqe_seen(&group->uring, cqes[i]);
task->status = SPDK_URING_SOCK_TASK_NOT_IN_USE; task->status = SPDK_URING_SOCK_TASK_NOT_IN_USE;

View File

@ -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_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_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_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)); DEFINE_STUB_V(io_uring_queue_exit, (struct io_uring *ring));
static void static void