We have seen workloads which suffer due to the way task work is currently scheduled. This scheduling can cause non-trivial tasks to run interrupting useful work on the workload. For example in network servers, a large async recv may run, calling memcpy on a large packet, interrupting a send. Which would add latency. This series adds an option to defer async work until user space calls io_uring_enter with the GETEVENTS flag. This allows the workload to choose when to schedule async work and have finer control (at the expense of complexity of managing this) of scheduling. Patches 1/2/3 are prep patches Patch 4 changes io_uring_enter to not always pre-run task work. It is not obvious that this is useful regardless of this series Patch 5/6/7 adds the new flag and functionality Dylan Yudaken (7): io_uring: use local ctx variable io_uring: remove unnecessary variable io_uring: introduce io_has_work io_uring: do not always run task work at the start of io_uring_enter io_uring: add IORING_SETUP_DEFER_TASKRUN io_uring: move io_eventfd_put io_uring: signal registered eventfd to process deferred task work include/linux/io_uring_types.h | 3 + include/uapi/linux/io_uring.h | 7 + io_uring/cancel.c | 2 +- io_uring/io_uring.c | 232 +++++++++++++++++++++++++-------- io_uring/io_uring.h | 31 ++++- io_uring/rsrc.c | 2 +- 6 files changed, 221 insertions(+), 56 deletions(-) base-commit: ff34d8d06a1f16b6a58fb41bfbaa475cc6c02497 -- 2.30.2