From: Breno Leitao <leitao@debian.org>
To: sdf@google.com, axboe@kernel.dk, asml.silence@gmail.com,
willemdebruijn.kernel@gmail.com, kuba@kernel.org,
pabeni@redhat.com, martin.lau@linux.dev, krisman@suse.de
Cc: bpf@vger.kernel.org, linux-kernel@vger.kernel.org,
netdev@vger.kernel.org, io-uring@vger.kernel.org
Subject: [PATCH v7 00/11] io_uring: Initial support for {s,g}etsockopt commands
Date: Mon, 16 Oct 2023 06:47:38 -0700 [thread overview]
Message-ID: <20231016134750.1381153-1-leitao@debian.org> (raw)
This patchset adds support for getsockopt (SOCKET_URING_OP_GETSOCKOPT)
and setsockopt (SOCKET_URING_OP_SETSOCKOPT) in io_uring commands.
SOCKET_URING_OP_SETSOCKOPT implements generic case, covering all levels
and optnames. SOCKET_URING_OP_GETSOCKOPT is limited, for now, to
SOL_SOCKET level, which seems to be the most common level parameter for
get/setsockopt(2).
In order to keep the implementation (and tests) simple, some refactors
were done prior to the changes, as follows:
Patches 1-2: Make BPF cgroup filters sockptr aware
Patches 3-4: Remove the core {s,g}etsockopt() core function from
__sys_{g,s}etsockopt, so, the code could be reused by other callers, such as
io_uring.
Patch 5: Pass compat mode to the file/socket callbacks
Patch 6-7: Move io_uring helpers from io_uring_zerocopy_tx to a generic
io_uring headers. This simplify the test case (last patch). Also copy the
io_uring UAPI to the tests directory.
Patch 8: Protect io_uring_cmd_sock() to not be called if CONFIG_NET is
disabled.
These changes were tested with a new test[1] in liburing, LTP sockopt*
tests, as also with bpf/progs/sockopt test case, which is now adapted to
run using both system calls and io_uring commands.
[1] Link: https://github.com/leitao/liburing/blob/getsock/test/socket-getsetsock-cmd.c
RFC -> V1:
* Copy user memory at io_uring subsystem, and call proto_ops
callbacks using kernel memory
* Implement all the cases for SOCKET_URING_OP_SETSOCKOPT
V1 -> V2
* Implemented the BPF part
* Using user pointers from optval to avoid kmalloc in io_uring part.
V2 -> V3:
* Break down __sys_setsockopt and reuse the core code, avoiding
duplicated code. This removed the requirement to expose
sock_use_custom_sol_socket().
* Added io_uring test to selftests/bpf/sockopt.
* Fixed compat argument, by passing it to the issue_flags.
V3 -> V4:
* Rebase on top of commit 1ded5e5a5931b ("net: annotate data-races around sock->ops")
* Also broke down __sys_setsockopt() to reuse the core function
from io_uring.
* Create a new patch to return -EOPNOTSUPP if CONFIG_NET is
disabled.
* Added two SOL_SOCKET tests in bpf/prog_tests/sockopt.
V4 -> V5:
* Do not use sockptr anymore, by changing the optlen getsock argument
to be a user pointer (instead of a kernel pointer). This change also drop
the limitation on getsockopt from previous versions, and now all
levels are supported.
* Simplified the BPF sockopt test, since there is no more limitation on
the io_uring commands.
* No more changes in the BPF subsystem.
* Moved the optlen field in the SQE struct. It is now a pointer instead
of u32.
V5 -> V6:
* Removed the need for #ifdef CONFIG_NET as suggested by Gabriel
Krisman.
* Changed the variable declaration order to respect the reverse
xmas declaration as suggested by Paolo Abeni.
V6 -> V7:
* Changed the optlen back to a value in the SQE instead of
user-pointer. This is similar to version 4.
[https://lore.kernel.org/all/20231009095518.288a5573@kernel.org/]
* Imported the io_uring.h into tools/include/uapi/linux to be able to
run the tests in machines without liburing.
[https://lore.kernel.org/all/77405214-ae42-d58b-1d40-c639683a0cb1@linux.dev/]
Breno Leitao (11):
bpf: Leverage sockptr_t in BPF getsockopt hook
bpf: Leverage sockptr_t in BPF setsockopt hook
net/socket: Break down __sys_setsockopt
net/socket: Break down __sys_getsockopt
io_uring/cmd: Pass compat mode in issue_flags
tools headers: Grab copy of io_uring.h
selftests/net: Extract uring helpers to be reusable
io_uring/cmd: return -EOPNOTSUPP if net is disabled
io_uring/cmd: Introduce SOCKET_URING_OP_GETSOCKOPT
io_uring/cmd: Introduce SOCKET_URING_OP_SETSOCKOPT
selftests/bpf/sockopt: Add io_uring support
Breno Leitao (11):
bpf: Add sockptr support for getsockopt
bpf: Add sockptr support for setsockopt
net/socket: Break down __sys_setsockopt
net/socket: Break down __sys_getsockopt
io_uring/cmd: Pass compat mode in issue_flags
tools headers: Grab copy of io_uring.h
selftests/net: Extract uring helpers to be reusable
io_uring/cmd: return -EOPNOTSUPP if net is disabled
io_uring/cmd: Introduce SOCKET_URING_OP_GETSOCKOPT
io_uring/cmd: Introduce SOCKET_URING_OP_SETSOCKOPT
selftests/bpf/sockopt: Add io_uring support
include/linux/bpf-cgroup.h | 9 +-
include/linux/io_uring.h | 1 +
include/net/sock.h | 6 +-
include/uapi/linux/io_uring.h | 8 +
io_uring/uring_cmd.c | 53 ++
kernel/bpf/cgroup.c | 25 +-
net/core/sock.c | 8 -
net/socket.c | 103 ++-
tools/include/io_uring/mini_liburing.h | 282 +++++++
tools/include/uapi/linux/io_uring.h | 757 ++++++++++++++++++
.../selftests/bpf/prog_tests/sockopt.c | 113 ++-
tools/testing/selftests/net/Makefile | 1 +
.../selftests/net/io_uring_zerocopy_tx.c | 268 +------
13 files changed, 1300 insertions(+), 334 deletions(-)
create mode 100644 tools/include/io_uring/mini_liburing.h
create mode 100644 tools/include/uapi/linux/io_uring.h
--
2.34.1
next reply other threads:[~2023-10-16 14:02 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-10-16 13:47 Breno Leitao [this message]
2023-10-16 13:47 ` [PATCH v7 01/11] bpf: Add sockptr support for getsockopt Breno Leitao
2023-10-19 19:24 ` Martin KaFai Lau
2023-10-16 13:47 ` [PATCH v7 02/11] bpf: Add sockptr support for setsockopt Breno Leitao
2023-10-19 19:32 ` Martin KaFai Lau
2023-10-16 13:47 ` [PATCH v7 03/11] net/socket: Break down __sys_setsockopt Breno Leitao
2023-10-19 0:20 ` Jakub Kicinski
2023-10-19 19:38 ` Martin KaFai Lau
2023-10-16 13:47 ` [PATCH v7 04/11] net/socket: Break down __sys_getsockopt Breno Leitao
2023-10-19 0:20 ` Jakub Kicinski
2023-10-19 19:12 ` Martin KaFai Lau
2023-10-19 20:04 ` Jens Axboe
2023-10-19 20:37 ` Martin KaFai Lau
2023-10-19 22:32 ` Jens Axboe
2023-10-16 13:47 ` [PATCH v7 05/11] io_uring/cmd: Pass compat mode in issue_flags Breno Leitao
2023-10-16 13:47 ` [PATCH v7 06/11] tools headers: Grab copy of io_uring.h Breno Leitao
2023-10-16 18:56 ` Gabriel Krisman Bertazi
[not found] ` <652d877c.250a0220.b0af2.3a66SMTPIN_ADDED_BROKEN@mx.google.com>
2023-10-17 12:34 ` Breno Leitao
2023-10-16 13:47 ` [PATCH v7 07/11] selftests/net: Extract uring helpers to be reusable Breno Leitao
2023-10-16 13:47 ` [PATCH v7 08/11] io_uring/cmd: return -EOPNOTSUPP if net is disabled Breno Leitao
2023-10-16 13:47 ` [PATCH v7 09/11] io_uring/cmd: Introduce SOCKET_URING_OP_GETSOCKOPT Breno Leitao
2023-10-16 18:33 ` Gabriel Krisman Bertazi
2023-10-16 13:47 ` [PATCH v7 10/11] io_uring/cmd: Introduce SOCKET_URING_OP_SETSOCKOPT Breno Leitao
2023-10-16 18:33 ` Gabriel Krisman Bertazi
2023-10-16 13:47 ` [PATCH v7 11/11] selftests/bpf/sockopt: Add io_uring support Breno Leitao
2023-10-19 19:51 ` Martin KaFai Lau
2023-10-19 14:58 ` [PATCH v7 00/11] io_uring: Initial support for {s,g}etsockopt commands Jens Axboe
2023-10-19 15:33 ` Jakub Kicinski
2023-10-19 15:40 ` Jens Axboe
2023-10-19 15:41 ` Jens Axboe
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20231016134750.1381153-1-leitao@debian.org \
--to=leitao@debian.org \
--cc=asml.silence@gmail.com \
--cc=axboe@kernel.dk \
--cc=bpf@vger.kernel.org \
--cc=io-uring@vger.kernel.org \
--cc=krisman@suse.de \
--cc=kuba@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=martin.lau@linux.dev \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=sdf@google.com \
--cc=willemdebruijn.kernel@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.