Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

bpf: fix ktls panic with sockmap and add tests #8509

Open
wants to merge 2 commits into
base: bpf-next_base
Choose a base branch
from

Conversation

kernel-patches-daemon-bpf[bot]
Copy link

Pull request for series with
subject: bpf: fix ktls panic with sockmap and add tests
version: 2
url: https://patchwork.kernel.org/project/netdevbpf/list/?series=935422

@kernel-patches-daemon-bpf
Copy link
Author

Upstream branch: 654765b
series: https://patchwork.kernel.org/project/netdevbpf/list/?series=935422
version: 2

@kernel-patches-daemon-bpf
Copy link
Author

Upstream branch: d0da259
series: https://patchwork.kernel.org/project/netdevbpf/list/?series=935422
version: 2

@kernel-patches-daemon-bpf
Copy link
Author

Upstream branch: e8af068
series: https://patchwork.kernel.org/project/netdevbpf/list/?series=935422
version: 2

@kernel-patches-daemon-bpf
Copy link
Author

Upstream branch: ac13c50
series: https://patchwork.kernel.org/project/netdevbpf/list/?series=935422
version: 2

@kernel-patches-daemon-bpf
Copy link
Author

Upstream branch: 7042882
series: https://patchwork.kernel.org/project/netdevbpf/list/?series=935422
version: 2

@kernel-patches-daemon-bpf
Copy link
Author

Upstream branch: bd4319b
series: https://patchwork.kernel.org/project/netdevbpf/list/?series=935422
version: 2

@kernel-patches-daemon-bpf
Copy link
Author

Upstream branch: e0525cd
series: https://patchwork.kernel.org/project/netdevbpf/list/?series=935422
version: 2

@kernel-patches-daemon-bpf
Copy link
Author

Upstream branch: 63817c7
series: https://patchwork.kernel.org/project/netdevbpf/list/?series=935422
version: 2

@kernel-patches-daemon-bpf
Copy link
Author

Upstream branch: 201b62c
series: https://patchwork.kernel.org/project/netdevbpf/list/?series=935422
version: 2

@kernel-patches-daemon-bpf
Copy link
Author

Upstream branch: 7e437dc
series: https://patchwork.kernel.org/project/netdevbpf/list/?series=935422
version: 2

@kernel-patches-daemon-bpf
Copy link
Author

Upstream branch: f282146
series: https://patchwork.kernel.org/project/netdevbpf/list/?series=935422
version: 2

@kernel-patches-daemon-bpf
Copy link
Author

Upstream branch: 79d93c8
series: https://patchwork.kernel.org/project/netdevbpf/list/?series=935422
version: 2

@kernel-patches-daemon-bpf
Copy link
Author

Upstream branch: 74f36a9
series: https://patchwork.kernel.org/project/netdevbpf/list/?series=935422
version: 2

@kernel-patches-daemon-bpf
Copy link
Author

Upstream branch: 157a502
series: https://patchwork.kernel.org/project/netdevbpf/list/?series=935422
version: 2

@kernel-patches-daemon-bpf
Copy link
Author

Upstream branch: 233732b
series: https://patchwork.kernel.org/project/netdevbpf/list/?series=935422
version: 2

@kernel-patches-daemon-bpf
Copy link
Author

Upstream branch: a68894a
series: https://patchwork.kernel.org/project/netdevbpf/list/?series=935422
version: 2

@kernel-patches-daemon-bpf
Copy link
Author

Upstream branch: be741c7
series: https://patchwork.kernel.org/project/netdevbpf/list/?series=935422
version: 2

mrpre added 2 commits March 12, 2025 16:39
[ 2172.936997] ------------[ cut here ]------------
[ 2172.936999] kernel BUG at lib/iov_iter.c:629!
......
[ 2172.944996] PKRU: 55555554
[ 2172.945155] Call Trace:
[ 2172.945299]  <TASK>
[ 2172.945428]  ? die+0x36/0x90
[ 2172.945601]  ? do_trap+0xdd/0x100
[ 2172.945795]  ? iov_iter_revert+0x178/0x180
[ 2172.946031]  ? iov_iter_revert+0x178/0x180
[ 2172.946267]  ? do_error_trap+0x7d/0x110
[ 2172.946499]  ? iov_iter_revert+0x178/0x180
[ 2172.946736]  ? exc_invalid_op+0x50/0x70
[ 2172.946961]  ? iov_iter_revert+0x178/0x180
[ 2172.947197]  ? asm_exc_invalid_op+0x1a/0x20
[ 2172.947446]  ? iov_iter_revert+0x178/0x180
[ 2172.947683]  ? iov_iter_revert+0x5c/0x180
[ 2172.947913]  tls_sw_sendmsg_locked.isra.0+0x794/0x840
[ 2172.948206]  tls_sw_sendmsg+0x52/0x80
[ 2172.948420]  ? inet_sendmsg+0x1f/0x70
[ 2172.948634]  __sys_sendto+0x1cd/0x200
[ 2172.948848]  ? find_held_lock+0x2b/0x80
[ 2172.949072]  ? syscall_trace_enter+0x140/0x270
[ 2172.949330]  ? __lock_release.isra.0+0x5e/0x170
[ 2172.949595]  ? find_held_lock+0x2b/0x80
[ 2172.949817]  ? syscall_trace_enter+0x140/0x270
[ 2172.950211]  ? lockdep_hardirqs_on_prepare+0xda/0x190
[ 2172.950632]  ? ktime_get_coarse_real_ts64+0xc2/0xd0
[ 2172.951036]  __x64_sys_sendto+0x24/0x30
[ 2172.951382]  do_syscall_64+0x90/0x170
......

After calling bpf_exec_tx_verdict(), the size of msg_pl->sg may increase,
e.g., when the BPF program executes bpf_msg_push_data().

If the BPF program sets cork_bytes and sg.size is smaller than cork_bytes,
it will return -ENOSPC and attempt to roll back to the non-zero copy
logic. However, during rollback, msg->msg_iter is reset, but since
msg_pl->sg.size has been increased, subsequent executions will exceed the
actual size of msg_iter.
'''
iov_iter_revert(&msg->msg_iter, msg_pl->sg.size - orig_size);
'''

The changes in this commit are based on the following considerations:

1. When cork_bytes is set, rolling back to non-zero copy logic is
pointless and can directly go to zero-copy logic.

2. We can not calculate the correct number of bytes to revert msg_iter.

Assume the original data is "abcdefgh" (8 bytes), and after 3 pushes
by the BPF program, it becomes 11-byte data: "abc?de?fgh?".
Then, we set cork_bytes to 6, which means the first 6 bytes have been
processed, and the remaining 5 bytes "?fgh?" will be cached until the
length meets the cork_bytes requirement.

However, some data in "?fgh?" is not within 'sg->msg_iter'
(but in msg_pl instead), especially the data "?" we pushed.

So it doesn't seem as simple as just reverting through an offset of
msg_iter.

3. For non-TLS sockets in tcp_bpf_sendmsg, when a "cork" situation occurs,
the user-space send() doesn't return an error, and the returned length is
the same as the input length parameter, even if some data is cached.

Additionally, I saw that the current non-zero-copy logic for handling
corking is written as:
'''
line 1177
else if (ret != -EAGAIN) {
	if (ret == -ENOSPC)
		ret = 0;
	goto send_end;
'''

So it's ok to just return 'copied' without error when a "cork" situation
occurs.

Fixes: fcb14cb ("new iov_iter flavour - ITER_UBUF")
Fixes: d3b18ad ("tls: add bpf support to sk_msg handling")
Signed-off-by: Jiayuan Chen <[email protected]>
add ktls selftest for sockmap

Test results:
sockmap_ktls/sockmap_ktls disconnect_after_delete IPv4 SOCKMAP:OK
sockmap_ktls/sockmap_ktls update_fails_when_sock_has_ulp IPv4 SOCKMAP:OK
sockmap_ktls/sockmap_ktls disconnect_after_delete IPv4 SOCKMAP:OK
sockmap_ktls/sockmap_ktls update_fails_when_sock_has_ulp IPv4 SOCKMAP:OK
sockmap_ktls/sockmap_ktls disconnect_after_delete IPv4 SOCKMAP:OK
sockmap_ktls/sockmap_ktls update_fails_when_sock_has_ulp IPv4 SOCKMAP:OK
sockmap_ktls/sockmap_ktls disconnect_after_delete IPv4 SOCKMAP:OK
sockmap_ktls/sockmap_ktls update_fails_when_sock_has_ulp IPv4 SOCKMAP:OK
sockmap_ktls/tls simple offload:OK
sockmap_ktls/tls tx cork:OK
sockmap_ktls/tls tx cork with push:OK
sockmap_ktls/tls simple offload:OK
sockmap_ktls/tls tx cork:OK
sockmap_ktls/tls tx cork with push:OK
sockmap_ktls:OK

Signed-off-by: Jiayuan Chen <[email protected]>
@kernel-patches-daemon-bpf
Copy link
Author

Upstream branch: 46d38f4
series: https://patchwork.kernel.org/project/netdevbpf/list/?series=935422
version: 2

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant