On 6/14/24 4:46 PM, Kuniyuki Iwashima wrote: > From: Gabriel Krisman Bertazi <krisman@xxxxxxx> > Date: Fri, 14 Jun 2024 12:30:46 -0400 >> IORING_OP_BIND provides the semantic of bind(2) via io_uring. While >> this is an essentially synchronous system call, the main point is to >> enable a network path to execute fully with io_uring registered and >> descriptorless files. >> >> Signed-off-by: Gabriel Krisman Bertazi <krisman@xxxxxxx> >> >> --- >> changes since v1: >> - drop explocit error handling for move_addr_to_kernel (jens) >> - Remove empty line ahead of return; >> --- >> include/uapi/linux/io_uring.h | 1 + >> io_uring/net.c | 36 +++++++++++++++++++++++++++++++++++ >> io_uring/net.h | 3 +++ >> io_uring/opdef.c | 13 +++++++++++++ >> 4 files changed, 53 insertions(+) >> >> diff --git a/include/uapi/linux/io_uring.h b/include/uapi/linux/io_uring.h >> index 994bf7af0efe..4ef153d95c87 100644 >> --- a/include/uapi/linux/io_uring.h >> +++ b/include/uapi/linux/io_uring.h >> @@ -257,6 +257,7 @@ enum io_uring_op { >> IORING_OP_FUTEX_WAITV, >> IORING_OP_FIXED_FD_INSTALL, >> IORING_OP_FTRUNCATE, >> + IORING_OP_BIND, >> >> /* this goes last, obviously */ >> IORING_OP_LAST, >> diff --git a/io_uring/net.c b/io_uring/net.c >> index 0a48596429d9..8cbc29aff15c 100644 >> --- a/io_uring/net.c >> +++ b/io_uring/net.c >> @@ -51,6 +51,11 @@ struct io_connect { >> bool seen_econnaborted; >> }; >> >> +struct io_bind { >> + struct file *file; >> + int addr_len; >> +}; >> + >> struct io_sr_msg { >> struct file *file; >> union { >> @@ -1715,6 +1720,37 @@ int io_connect(struct io_kiocb *req, unsigned int issue_flags) >> return IOU_OK; >> } >> >> +int io_bind_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe) >> +{ >> + struct io_bind *bind = io_kiocb_to_cmd(req, struct io_bind); >> + struct sockaddr __user *uaddr; >> + struct io_async_msghdr *io; >> + >> + if (sqe->len || sqe->buf_index || sqe->rw_flags || sqe->splice_fd_in) >> + return -EINVAL; >> + >> + uaddr = u64_to_user_ptr(READ_ONCE(sqe->addr)); >> + bind->addr_len = READ_ONCE(sqe->addr2); > ^^ > nit: double space Thanks for spotting those, I can just remove those two while applying. Mostly just a note to Grabriel, no need to re-post for that. -- Jens Axboe