Thread (30 messages) flat view 30 messages, 4 authors, 2021-03-10

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 here
Right, 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.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help