2023-07-19 10:59:40

by Breno Leitao

[permalink] [raw]
Subject: [RFC PATCH 0/3] io_uring: Initial support for {s,g}etsockopt commands

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



2023-07-19 11:00:08

by Breno Leitao

[permalink] [raw]
Subject: [RFC PATCH 1/3] net: expose sock_use_custom_sol_socket

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