diff --git a/src/fast_task_queue.h b/src/fast_task_queue.h index 3234358..d211304 100644 --- a/src/fast_task_queue.h +++ b/src/fast_task_queue.h @@ -49,8 +49,9 @@ struct sf_network_handler; struct fast_task_info; #if IOEVENT_USE_URING -#define FC_URING_OP_TYPE(task) (task)->uring.op_type -#define FC_URING_IS_CLIENT(task) (task)->uring.is_client +#define FC_URING_OP_TYPE(task) (task)->uring.op_type +#define FC_URING_IS_CLIENT(task) (task)->uring.is_client +#define FC_URING_IS_SEND_ZC(task) ((task)->uring.op_type == IORING_OP_SEND_ZC) #endif typedef struct ioevent_entry diff --git a/src/ioevent.c b/src/ioevent.c index c6552b5..7e0f531 100644 --- a/src/ioevent.c +++ b/src/ioevent.c @@ -75,6 +75,7 @@ int ioevent_init(IOEventPoller *ioevent, const char *service_name, ioevent->cqe = NULL; ioevent->submit_count = 0; ioevent->send_zc_logged = false; + ioevent->send_zc_done_notify = false; #elif IOEVENT_USE_KQUEUE ioevent->poll_fd = kqueue(); if (ioevent->poll_fd < 0) { diff --git a/src/ioevent.h b/src/ioevent.h index 19a517f..fe4ba96 100644 --- a/src/ioevent.h +++ b/src/ioevent.h @@ -23,6 +23,7 @@ #include "logger.h" #define IOEVENT_TIMEOUT (1 << 20) +#define IOEVENT_NOTIFY (1 << 21) //for io_uring send_zc done callback #if IOEVENT_USE_EPOLL #include @@ -80,6 +81,7 @@ typedef struct ioevent_puller { struct io_uring ring; int submit_count; bool send_zc_logged; + bool send_zc_done_notify; //if callback when send_zc done #else int poll_fd; struct { @@ -191,6 +193,12 @@ static inline int ioevent_poll_ex(IOEventPoller *ioevent, const int timeout_ms) } #if IOEVENT_USE_URING +static inline void ioevent_set_send_zc_done_notify( + IOEventPoller *ioevent, const bool need_notify) +{ + ioevent->send_zc_done_notify = need_notify; +} + static inline int ioevent_uring_submit(IOEventPoller *ioevent) { int result; diff --git a/src/ioevent_loop.c b/src/ioevent_loop.c index d34e682..1587cff 100644 --- a/src/ioevent_loop.c +++ b/src/ioevent_loop.c @@ -46,6 +46,10 @@ static int ioevent_process(IOEventPoller *ioevent) pEntry = (IOEventEntry *)ioevent->cqe->user_data; if (pEntry != NULL) { if (ioevent->cqe->flags & IORING_CQE_F_NOTIF) { + if (ioevent->send_zc_done_notify) { + pEntry->callback(pEntry->fd, IOEVENT_NOTIFY, pEntry); + } + #ifdef IORING_NOTIF_USAGE_ZC_COPIED if (!ioevent->send_zc_logged) { struct fast_task_info *task; diff --git a/src/ioevent_loop.h b/src/ioevent_loop.h index c8377d1..a12f33d 100644 --- a/src/ioevent_loop.h +++ b/src/ioevent_loop.h @@ -158,6 +158,11 @@ static inline int uring_prep_first_send_zc(struct fast_task_info *task) sqe, task->event.fd, task->iovec_array.iovs, FC_MIN(task->iovec_array.count, IOV_MAX), task); + } else if (task->send.ptr->length < 4096) { + SET_OP_TYPE_AND_HOLD_TASK(task, IORING_OP_SEND); + ioevent_uring_prep_send(&task->thread_data->ev_puller, + sqe, task->event.fd, task->send.ptr->data, + task->send.ptr->length, task); } else { SET_OP_TYPE_AND_HOLD_TASK(task, IORING_OP_SEND_ZC); ioevent_uring_prep_send_zc(&task->thread_data->ev_puller, @@ -175,6 +180,11 @@ static inline int uring_prep_next_send_zc(struct fast_task_info *task) sqe, task->event.fd, task->iovec_array.iovs, FC_MIN(task->iovec_array.count, IOV_MAX), task); + } else if (task->send.ptr->length - task->send.ptr->offset < 4096) { + SET_OP_TYPE_AND_HOLD_TASK(task, IORING_OP_SEND); + ioevent_uring_prep_send(&task->thread_data->ev_puller, sqe, + task->event.fd, task->send.ptr->data + task->send.ptr->offset, + task->send.ptr->length - task->send.ptr->offset, task); } else { SET_OP_TYPE_AND_HOLD_TASK(task, IORING_OP_SEND_ZC); ioevent_uring_prep_send_zc(&task->thread_data->ev_puller, sqe,