During LPC 2022, Josh Triplett proposed io_uring_spawn as a mechanism to fork and exec new processes through io_uring [1]. The goal, according to him, was to have a very efficient mechanism to quickly execute tasks, eliminating the multiple roundtrips to userspace required to fork, perform multiple $PATH lookup and finally execve. In addition, he mentioned this would allow for a more simple implementation of preparatory tasks, such as file redirection configuration, and handling of stuff like posix_spawn_file_actions_t. This RFC revives his original patchset. I fixed all the pending issues I found with task submission, including the issue blocking the work at the time, a kernel corruption after a few spawns, converted the execve command into execveat* variant, cleaned up the code and surely introduced a few bugs of my own along the way. At this point, I made it an RFC because I have a few outstanding questions about the design, in particular whether the CLONE context would be better implemented as a special io-wq case to avoid the exposure of io_issue_sqe and duplication of the dispatching logic. I'm also providing the liburing support in a separate patchset, including a testcase that exemplifies the $PATH lookup mechanism proposed by Josh. Thanks, [1] https://lwn.net/Articles/908268/ Gabriel Krisman Bertazi (6): io_uring: Drop __io_req_find_next_prep io_uring: Expose failed request helper in internal header kernel/fork: Don't inherit PF_USER_WORKER from parent fs/exec: Expose do_execveat symbol io_uring: Let commands run with current credentials io_uring: Let ->issue know if it was called from spawn thread Josh Triplett (3): kernel/fork: Add helper to fork from io_uring io_uring: Introduce IORING_OP_CLONE io_uring: Introduce IORING_OP_EXEC command fs/exec.c | 2 +- include/linux/binfmts.h | 5 + include/linux/io_uring_types.h | 3 + include/linux/sched/task.h | 1 + include/uapi/linux/io_uring.h | 3 + io_uring/Makefile | 2 +- io_uring/io_uring.c | 27 ++--- io_uring/io_uring.h | 8 ++ io_uring/opdef.c | 18 +++ io_uring/opdef.h | 2 + io_uring/spawn.c | 195 +++++++++++++++++++++++++++++++++ io_uring/spawn.h | 13 +++ kernel/fork.c | 21 ++++ 13 files changed, 279 insertions(+), 21 deletions(-) create mode 100644 io_uring/spawn.c create mode 100644 io_uring/spawn.h -- 2.47.0