public inbox for [email protected]
 help / color / mirror / Atom feed
* [RFC PATCH 0/3] io_uring: Initial support for {s,g}etsockopt commands
@ 2023-07-19 10:27 Breno Leitao
  2023-07-19 10:27 ` [RFC PATCH 1/3] net: expose sock_use_custom_sol_socket Breno Leitao
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Breno Leitao @ 2023-07-19 10:27 UTC (permalink / raw)
  To: asml.silence, axboe
  Cc: io-uring, netdev, davem, kuba, edumazet, pabeni, linux-kernel

This patchset adds support for SOL_SOCKET level getsockopt and
setsockopt in io_uring, using the command op. SOL_SOCKET seems to be the
most common level parameter for get/setsockopt(2).

This implementation benefits from the work done to leverage sockptr_t in
SOL_SOCKET path.

For getsockopt command, the optlen field is not a userspace
pointers, but an absolute value, so this is slightly different from
getsockopt(2) behaviour. The updated value is returned in cqe->res.

If this approach is good enough, I am planning to extend the support for
those "levels" that have already implemented sockptr_t support

This patch was tested with a new test[1] in liburing.
This patch depends on "io_uring: Add io_uring command support for sockets"[2]

[1] Link: https://github.com/leitao/liburing/blob/getsock/test/socket-getsetsock-cmd.c
[2] Link: https://lore.kernel.org/all/[email protected]/

Breno Leitao (3):
  net: expose sock_use_custom_sol_socket
  io_uring/cmd: Add support for getsockopt command
  io_uring/cmd: Add support for set_sockopt

 include/linux/net.h           |  5 ++++
 include/uapi/linux/io_uring.h |  8 ++++++
 io_uring/uring_cmd.c          | 51 +++++++++++++++++++++++++++++++++++
 net/socket.c                  |  5 ----
 4 files changed, 64 insertions(+), 5 deletions(-)

-- 
2.34.1


^ permalink raw reply	[flat|nested] 4+ messages in thread

* [RFC PATCH 1/3] net: expose sock_use_custom_sol_socket
  2023-07-19 10:27 [RFC PATCH 0/3] io_uring: Initial support for {s,g}etsockopt commands Breno Leitao
@ 2023-07-19 10:27 ` Breno Leitao
  2023-07-19 10:27 ` [RFC PATCH 2/3] io_uring/cmd: Add support for getsockopt command Breno Leitao
  2023-07-19 10:27 ` [RFC PATCH 3/3] io_uring/cmd: Add support for set_sockopt Breno Leitao
  2 siblings, 0 replies; 4+ messages in thread
From: Breno Leitao @ 2023-07-19 10:27 UTC (permalink / raw)
  To: asml.silence, axboe, David S. Miller, Eric Dumazet,
	Jakub Kicinski, Paolo Abeni
  Cc: io-uring, netdev, linux-kernel

Exposing function sock_use_custom_sol_socket(), so it could be used by
io_uring subsystem.

This function will be used in the function io_uring_cmd_setsockopt() in
the coming patch, so, let's move it to the socket.h header file.

Signed-off-by: Breno Leitao <[email protected]>
---
 include/linux/net.h | 5 +++++
 net/socket.c        | 5 -----
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/include/linux/net.h b/include/linux/net.h
index 41c608c1b02c..14a956e4530e 100644
--- a/include/linux/net.h
+++ b/include/linux/net.h
@@ -355,4 +355,9 @@ u32 kernel_sock_ip_overhead(struct sock *sk);
 #define MODULE_ALIAS_NET_PF_PROTO_NAME(pf, proto, name) \
 	MODULE_ALIAS("net-pf-" __stringify(pf) "-proto-" __stringify(proto) \
 		     name)
+
+static inline bool sock_use_custom_sol_socket(const struct socket *sock)
+{
+	return test_bit(SOCK_CUSTOM_SOCKOPT, &sock->flags);
+}
 #endif	/* _LINUX_NET_H */
diff --git a/net/socket.c b/net/socket.c
index 1dc23f5298ba..8df54352af83 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -2216,11 +2216,6 @@ SYSCALL_DEFINE4(recv, int, fd, void __user *, ubuf, size_t, size,
 	return __sys_recvfrom(fd, ubuf, size, flags, NULL, NULL);
 }
 
-static bool sock_use_custom_sol_socket(const struct socket *sock)
-{
-	return test_bit(SOCK_CUSTOM_SOCKOPT, &sock->flags);
-}
-
 /*
  *	Set a socket option. Because we don't know the option lengths we have
  *	to pass the user mode parameter for the protocols to sort out.
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [RFC PATCH 2/3] io_uring/cmd: Add support for getsockopt command
  2023-07-19 10:27 [RFC PATCH 0/3] io_uring: Initial support for {s,g}etsockopt commands Breno Leitao
  2023-07-19 10:27 ` [RFC PATCH 1/3] net: expose sock_use_custom_sol_socket Breno Leitao
@ 2023-07-19 10:27 ` Breno Leitao
  2023-07-19 10:27 ` [RFC PATCH 3/3] io_uring/cmd: Add support for set_sockopt Breno Leitao
  2 siblings, 0 replies; 4+ messages in thread
From: Breno Leitao @ 2023-07-19 10:27 UTC (permalink / raw)
  To: asml.silence, axboe
  Cc: io-uring, netdev, davem, kuba, edumazet, pabeni, linux-kernel

Add support for getsockopt function, where level is SOL_SOCKET. This is
leveraging the sockptr_t infrastructure, where a sockptr_t is either
userspace or kernel space, and handled as such.

Function io_uring_cmd_getsockopt() is inspired by __sys_getsockopt().

Differently from the getsockopt(2), the optlen field is not a userspace
pointers. In getsockopt(2), userspace provides a pointer, which is
overwritten by the kernel.

In this implementation, userspace passes a u32, and the new value is
returned in cqe->res.

Signed-off-by: Breno Leitao <[email protected]>
---
 include/uapi/linux/io_uring.h |  7 +++++++
 io_uring/uring_cmd.c          | 27 +++++++++++++++++++++++++++
 2 files changed, 34 insertions(+)

diff --git a/include/uapi/linux/io_uring.h b/include/uapi/linux/io_uring.h
index 9fc7195f25df..8152151080db 100644
--- a/include/uapi/linux/io_uring.h
+++ b/include/uapi/linux/io_uring.h
@@ -43,6 +43,10 @@ struct io_uring_sqe {
 	union {
 		__u64	addr;	/* pointer to buffer or iovecs */
 		__u64	splice_off_in;
+		struct {
+			__u32	level;
+			__u32	optname;
+		};
 	};
 	__u32	len;		/* buffer size or number of iovecs */
 	union {
@@ -79,6 +83,7 @@ struct io_uring_sqe {
 	union {
 		__s32	splice_fd_in;
 		__u32	file_index;
+		__u32	optlen;
 		struct {
 			__u16	addr_len;
 			__u16	__pad3[1];
@@ -89,6 +94,7 @@ struct io_uring_sqe {
 			__u64	addr3;
 			__u64	__pad2[1];
 		};
+		__u64	optval;
 		/*
 		 * If the ring is initialized with IORING_SETUP_SQE128, then
 		 * this field is used for 80 bytes of arbitrary command data
@@ -729,6 +735,7 @@ struct io_uring_recvmsg_out {
 enum {
 	SOCKET_URING_OP_SIOCINQ		= 0,
 	SOCKET_URING_OP_SIOCOUTQ,
+	SOCKET_URING_OP_GETSOCKOPT,
 };
 
 #ifdef __cplusplus
diff --git a/io_uring/uring_cmd.c b/io_uring/uring_cmd.c
index 8e7a03c1b20e..28fd09351be7 100644
--- a/io_uring/uring_cmd.c
+++ b/io_uring/uring_cmd.c
@@ -166,6 +166,31 @@ int io_uring_cmd_import_fixed(u64 ubuf, unsigned long len, int rw,
 }
 EXPORT_SYMBOL_GPL(io_uring_cmd_import_fixed);
 
+static inline int io_uring_cmd_getsockopt(struct socket *sock,
+					  struct io_uring_cmd *cmd)
+{
+	void __user *optval = u64_to_user_ptr(READ_ONCE(cmd->sqe->optval));
+	int optlen = READ_ONCE(cmd->sqe->optlen);
+	int optname = READ_ONCE(cmd->sqe->optname);
+	int level = READ_ONCE(cmd->sqe->level);
+	int err;
+
+	err = security_socket_getsockopt(sock, level, optname);
+	if (err)
+		return err;
+
+	if (level == SOL_SOCKET) {
+		err = sk_getsockopt(sock->sk, level, optname,
+				    USER_SOCKPTR(optval),
+				    KERNEL_SOCKPTR(&optlen));
+		if (err < 0)
+			return err;
+		return optlen;
+	}
+
+	return -EOPNOTSUPP;
+}
+
 int io_uring_cmd_sock(struct io_uring_cmd *cmd, unsigned int issue_flags)
 {
 	struct socket *sock = cmd->file->private_data;
@@ -187,6 +212,8 @@ int io_uring_cmd_sock(struct io_uring_cmd *cmd, unsigned int issue_flags)
 		if (ret)
 			return ret;
 		return arg;
+	case SOCKET_URING_OP_GETSOCKOPT:
+		return io_uring_cmd_getsockopt(sock, cmd);
 	default:
 		return -EOPNOTSUPP;
 	}
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [RFC PATCH 3/3] io_uring/cmd: Add support for set_sockopt
  2023-07-19 10:27 [RFC PATCH 0/3] io_uring: Initial support for {s,g}etsockopt commands Breno Leitao
  2023-07-19 10:27 ` [RFC PATCH 1/3] net: expose sock_use_custom_sol_socket Breno Leitao
  2023-07-19 10:27 ` [RFC PATCH 2/3] io_uring/cmd: Add support for getsockopt command Breno Leitao
@ 2023-07-19 10:27 ` Breno Leitao
  2 siblings, 0 replies; 4+ messages in thread
From: Breno Leitao @ 2023-07-19 10:27 UTC (permalink / raw)
  To: asml.silence, axboe
  Cc: io-uring, netdev, davem, kuba, edumazet, pabeni, linux-kernel

Add initial support for setsockopt for SOL_SOCKET level, by leveraging
the sockptr infrastructure.

Function io_uring_cmd_setsockopt is inspired by the function
__sys_setsockopt(), which handles the system call case.

Signed-off-by: Breno Leitao <[email protected]>
---
 include/uapi/linux/io_uring.h |  1 +
 io_uring/uring_cmd.c          | 24 ++++++++++++++++++++++++
 2 files changed, 25 insertions(+)

diff --git a/include/uapi/linux/io_uring.h b/include/uapi/linux/io_uring.h
index 8152151080db..3fe82df06abf 100644
--- a/include/uapi/linux/io_uring.h
+++ b/include/uapi/linux/io_uring.h
@@ -736,6 +736,7 @@ enum {
 	SOCKET_URING_OP_SIOCINQ		= 0,
 	SOCKET_URING_OP_SIOCOUTQ,
 	SOCKET_URING_OP_GETSOCKOPT,
+	SOCKET_URING_OP_SETSOCKOPT,
 };
 
 #ifdef __cplusplus
diff --git a/io_uring/uring_cmd.c b/io_uring/uring_cmd.c
index 28fd09351be7..7c06634e744a 100644
--- a/io_uring/uring_cmd.c
+++ b/io_uring/uring_cmd.c
@@ -191,6 +191,28 @@ static inline int io_uring_cmd_getsockopt(struct socket *sock,
 	return -EOPNOTSUPP;
 }
 
+static inline int io_uring_cmd_setsockopt(struct socket *sock,
+					  struct io_uring_cmd *cmd)
+{
+	void __user *optval = u64_to_user_ptr(READ_ONCE(cmd->sqe->optval));
+	int optlen = READ_ONCE(cmd->sqe->optlen);
+	int optname = READ_ONCE(cmd->sqe->optname);
+	int level = READ_ONCE(cmd->sqe->level);
+	int err;
+
+	err = security_socket_setsockopt(sock, level, optname);
+	if (err)
+		return err;
+
+	if (level == SOL_SOCKET && !sock_use_custom_sol_socket(sock)) {
+		err = sock_setsockopt(sock, level, optname,
+				      USER_SOCKPTR(optval), optlen);
+		return err;
+	}
+
+	return -EOPNOTSUPP;
+}
+
 int io_uring_cmd_sock(struct io_uring_cmd *cmd, unsigned int issue_flags)
 {
 	struct socket *sock = cmd->file->private_data;
@@ -214,6 +236,8 @@ int io_uring_cmd_sock(struct io_uring_cmd *cmd, unsigned int issue_flags)
 		return arg;
 	case SOCKET_URING_OP_GETSOCKOPT:
 		return io_uring_cmd_getsockopt(sock, cmd);
+	case SOCKET_URING_OP_SETSOCKOPT:
+		return io_uring_cmd_setsockopt(sock, cmd);
 	default:
 		return -EOPNOTSUPP;
 	}
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2023-07-19 10:29 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-07-19 10:27 [RFC PATCH 0/3] io_uring: Initial support for {s,g}etsockopt commands Breno Leitao
2023-07-19 10:27 ` [RFC PATCH 1/3] net: expose sock_use_custom_sol_socket Breno Leitao
2023-07-19 10:27 ` [RFC PATCH 2/3] io_uring/cmd: Add support for getsockopt command Breno Leitao
2023-07-19 10:27 ` [RFC PATCH 3/3] io_uring/cmd: Add support for set_sockopt Breno Leitao

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox