Re: [Patch bpf-next v2 2/9] sock: introduce sk_prot->update_proto()
From: Cong Wang <hidden>
Date: 2021-03-09 17:54:18
Also in:
bpf
Subsystem:
bpf [l7 framework] (sockmap), the rest · Maintainers:
John Fastabend, Jakub Sitnicki, Jiayuan Chen, Linus Torvalds
On Fri, Mar 5, 2021 at 5:55 PM John Fastabend [off-list ref] wrote:
Cong Wang wrote:quoted
On Fri, Mar 5, 2021 at 4:27 PM John Fastabend [off-list ref] wrote:quoted
Cong Wang wrote:quoted
On Tue, Mar 2, 2021 at 10:23 AM Cong Wang [off-list ref] wrote:quoted
On Tue, Mar 2, 2021 at 8:22 AM Lorenz Bauer [off-list ref] wrote:quoted
On Tue, 2 Mar 2021 at 02:37, Cong Wang [off-list ref] wrote: ...quoted
static inline void sk_psock_restore_proto(struct sock *sk, struct sk_psock *psock) { sk->sk_prot->unhash = psock->saved_unhash;Not related to your patch set, but why do an extra restore of sk_prot->unhash here? At this point sk->sk_prot is one of our tcp_bpf / udp_bpf protos, so overwriting that seems wrong?"extra"? restore_proto should only be called when the psock ref count is zero and we need to transition back to the original socks proto handlers. To trigger this we can simply delete a sock from the map. In the case where we are deleting the psock overwriting the tcp_bpf protos is exactly what we want.?Why do you want to overwrite tcp_bpf_prots->unhash? Overwriting tcp_bpf_prots is correct, but overwriting tcp_bpf_prots->unhash is not. Because once you overwrite it, the next time you use it to replace sk->sk_prot, it would be a different one rather than sock_map_unhash(): // tcp_bpf_prots->unhash == sock_map_unhash sk_psock_restore_proto(); // Now tcp_bpf_prots->unhash is inet_unhash ... sk_psock_update_proto(); // sk->sk_proto is now tcp_bpf_prots again, // so its ->unhash now is inet_unhash // but it should be sock_map_unhash hereRight, we can fix this on the TLS side. I'll push a fix shortly.
Are you still working on this? If kTLS still needs it, then we can have something like this:
diff --git a/include/linux/skmsg.h b/include/linux/skmsg.h
index 8edbbf5f2f93..5eb617df7f48 100644
--- a/include/linux/skmsg.h
+++ b/include/linux/skmsg.h@@ -349,8 +349,8 @@ static inline void sk_psock_update_proto(struct sock *sk, static inline void sk_psock_restore_proto(struct sock *sk, struct sk_psock *psock) { - sk->sk_prot->unhash = psock->saved_unhash; if (inet_csk_has_ulp(sk)) { + sk->sk_prot->unhash = psock->saved_unhash; tcp_update_ulp(sk, psock->sk_proto, psock->saved_write_space); } else { sk->sk_write_space = psock->saved_write_space;
Thanks.