From 97ad45f787d7ebb7b9e2fe28ed094ed765ffcb86 Mon Sep 17 00:00:00 2001 From: microcai Date: Tue, 19 Nov 2024 08:20:30 +0800 Subject: [PATCH] support for ZeroCopy Send two changes: 1. use IORING_OP_SENDMSG_ZC instead of IORING_OP_SENDMSG for sending. 2. support for multislot completion notify. the proactor nature in asio is very suitable for zero-copy send. since the buffer is assumed to be valid until operation complete. the only drawback is kernel requirement but this is not an issue. people tent to upgrade their kernel to take advantage of io-uring anyway. --- asio/include/asio/detail/impl/io_uring_service.ipp | 10 ++++++++++ asio/include/asio/detail/io_uring_socket_send_op.hpp | 2 +- asio/include/asio/detail/io_uring_socket_sendto_op.hpp | 2 +- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/asio/include/asio/detail/impl/io_uring_service.ipp b/asio/include/asio/detail/impl/io_uring_service.ipp index c661a4d756..eb441c2c60 100644 --- a/asio/include/asio/detail/impl/io_uring_service.ipp +++ b/asio/include/asio/detail/impl/io_uring_service.ipp @@ -482,6 +482,16 @@ void io_uring_service::run(long usec, op_queue& ops) { --local_ops; } + else if (cqe->flags & IORING_CQE_F_MORE) + { + io_queue* io_q = static_cast(ptr); + io_q->set_result(cqe->res); + } + else if (cqe->flags & IORING_CQE_F_NOTIF) + { + io_queue* io_q = static_cast(ptr); + ops.push(io_q); + } else { io_queue* io_q = static_cast(ptr); diff --git a/asio/include/asio/detail/io_uring_socket_send_op.hpp b/asio/include/asio/detail/io_uring_socket_send_op.hpp index 2f57dae920..657e7675bd 100644 --- a/asio/include/asio/detail/io_uring_socket_send_op.hpp +++ b/asio/include/asio/detail/io_uring_socket_send_op.hpp @@ -73,7 +73,7 @@ class io_uring_socket_send_op_base : public io_uring_operation } else { - ::io_uring_prep_sendmsg(sqe, o->socket_, &o->msghdr_, o->flags_); + ::io_uring_prep_sendmsg_zc(sqe, o->socket_, &o->msghdr_, o->flags_); } } diff --git a/asio/include/asio/detail/io_uring_socket_sendto_op.hpp b/asio/include/asio/detail/io_uring_socket_sendto_op.hpp index 1866938a4b..e9ae67dc84 100644 --- a/asio/include/asio/detail/io_uring_socket_sendto_op.hpp +++ b/asio/include/asio/detail/io_uring_socket_sendto_op.hpp @@ -70,7 +70,7 @@ class io_uring_socket_sendto_op_base : public io_uring_operation } else { - ::io_uring_prep_sendmsg(sqe, o->socket_, &o->msghdr_, o->flags_); + ::io_uring_prep_sendmsg_zc(sqe, o->socket_, &o->msghdr_, o->flags_); } }