* [PATCH bpf] bpf: Add sk_is_inet check in tls_sw_has_ctx_tx/rx
@ 2024-10-29 20:28 zijianzhang
2024-10-29 23:07 ` Stanislav Fomichev
0 siblings, 1 reply; 9+ messages in thread
From: zijianzhang @ 2024-10-29 20:28 UTC (permalink / raw)
To: bpf
Cc: borisp, john.fastabend, kuba, davem, edumazet, pabeni, horms,
daniel, ast, cong.wang, Zijian Zhang
From: Zijian Zhang <zijianzhang@bytedance.com>
As the introduction of the support for vsock and unix sockets in sockmap,
tls_sw_has_ctx_tx/rx cannot presume the socket passed in must be inet.
Otherwise, tls_get_ctx may return an invalid pointer and result in page
fault in function tls_sw_ctx_rx.
BUG: unable to handle page fault for address: 0000000000040030
Workqueue: vsock-loopback vsock_loopback_work
RIP: 0010:sk_psock_strp_data_ready+0x23/0x60
Call Trace:
? __die+0x81/0xc3
? no_context+0x194/0x350
? do_page_fault+0x30/0x110
? async_page_fault+0x3e/0x50
? sk_psock_strp_data_ready+0x23/0x60
virtio_transport_recv_pkt+0x750/0x800
? update_load_avg+0x7e/0x620
vsock_loopback_work+0xd0/0x100
process_one_work+0x1a7/0x360
worker_thread+0x30/0x390
? create_worker+0x1a0/0x1a0
kthread+0x112/0x130
? __kthread_cancel_work+0x40/0x40
ret_from_fork+0x1f/0x40
Fixes: 0608c69c9a80 ("bpf: sk_msg, sock{map|hash} redirect through ULP")
Fixes: e91de6afa81c ("bpf: Fix running sk_skb program types with ktls")
Signed-off-by: Zijian Zhang <zijianzhang@bytedance.com>
---
include/net/tls.h | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/include/net/tls.h b/include/net/tls.h
index 3a33924db2bc..a65939c7ad61 100644
--- a/include/net/tls.h
+++ b/include/net/tls.h
@@ -390,8 +390,12 @@ tls_offload_ctx_tx(const struct tls_context *tls_ctx)
static inline bool tls_sw_has_ctx_tx(const struct sock *sk)
{
- struct tls_context *ctx = tls_get_ctx(sk);
+ struct tls_context *ctx;
+
+ if (!sk_is_inet(sk))
+ return false;
+ ctx = tls_get_ctx(sk);
if (!ctx)
return false;
return !!tls_sw_ctx_tx(ctx);
@@ -399,8 +403,12 @@ static inline bool tls_sw_has_ctx_tx(const struct sock *sk)
static inline bool tls_sw_has_ctx_rx(const struct sock *sk)
{
- struct tls_context *ctx = tls_get_ctx(sk);
+ struct tls_context *ctx;
+
+ if (!sk_is_inet(sk))
+ return false;
+ ctx = tls_get_ctx(sk);
if (!ctx)
return false;
return !!tls_sw_ctx_rx(ctx);
--
2.20.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH bpf] bpf: Add sk_is_inet check in tls_sw_has_ctx_tx/rx
2024-10-29 20:28 [PATCH bpf] bpf: Add sk_is_inet check in tls_sw_has_ctx_tx/rx zijianzhang
@ 2024-10-29 23:07 ` Stanislav Fomichev
2024-10-29 23:37 ` Zijian Zhang
0 siblings, 1 reply; 9+ messages in thread
From: Stanislav Fomichev @ 2024-10-29 23:07 UTC (permalink / raw)
To: zijianzhang
Cc: bpf, borisp, john.fastabend, kuba, davem, edumazet, pabeni, horms,
daniel, ast, cong.wang
On 10/29, zijianzhang@bytedance.com wrote:
> From: Zijian Zhang <zijianzhang@bytedance.com>
>
> As the introduction of the support for vsock and unix sockets in sockmap,
> tls_sw_has_ctx_tx/rx cannot presume the socket passed in must be inet.
> Otherwise, tls_get_ctx may return an invalid pointer and result in page
> fault in function tls_sw_ctx_rx.
>
> BUG: unable to handle page fault for address: 0000000000040030
> Workqueue: vsock-loopback vsock_loopback_work
> RIP: 0010:sk_psock_strp_data_ready+0x23/0x60
> Call Trace:
> ? __die+0x81/0xc3
> ? no_context+0x194/0x350
> ? do_page_fault+0x30/0x110
> ? async_page_fault+0x3e/0x50
> ? sk_psock_strp_data_ready+0x23/0x60
> virtio_transport_recv_pkt+0x750/0x800
> ? update_load_avg+0x7e/0x620
> vsock_loopback_work+0xd0/0x100
> process_one_work+0x1a7/0x360
> worker_thread+0x30/0x390
> ? create_worker+0x1a0/0x1a0
> kthread+0x112/0x130
> ? __kthread_cancel_work+0x40/0x40
> ret_from_fork+0x1f/0x40
>
> Fixes: 0608c69c9a80 ("bpf: sk_msg, sock{map|hash} redirect through ULP")
> Fixes: e91de6afa81c ("bpf: Fix running sk_skb program types with ktls")
>
> Signed-off-by: Zijian Zhang <zijianzhang@bytedance.com>
> ---
> include/net/tls.h | 12 ++++++++++--
> 1 file changed, 10 insertions(+), 2 deletions(-)
>
> diff --git a/include/net/tls.h b/include/net/tls.h
> index 3a33924db2bc..a65939c7ad61 100644
> --- a/include/net/tls.h
> +++ b/include/net/tls.h
> @@ -390,8 +390,12 @@ tls_offload_ctx_tx(const struct tls_context *tls_ctx)
>
> static inline bool tls_sw_has_ctx_tx(const struct sock *sk)
> {
> - struct tls_context *ctx = tls_get_ctx(sk);
> + struct tls_context *ctx;
> +
> + if (!sk_is_inet(sk))
> + return false;
>
> + ctx = tls_get_ctx(sk);
> if (!ctx)
> return false;
> return !!tls_sw_ctx_tx(ctx);
> @@ -399,8 +403,12 @@ static inline bool tls_sw_has_ctx_tx(const struct sock *sk)
>
> static inline bool tls_sw_has_ctx_rx(const struct sock *sk)
> {
> - struct tls_context *ctx = tls_get_ctx(sk);
> + struct tls_context *ctx;
> +
> + if (!sk_is_inet(sk))
> + return false;
>
> + ctx = tls_get_ctx(sk);
> if (!ctx)
> return false;
> return !!tls_sw_ctx_rx(ctx);
This seems like a strange place to fix it. Why does tls_get_ctx return
invalid pointer for non-tls/ulp sockets? Shouldn't it be NULL?
Is sockmap even supposed to work with vsock?
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH bpf] bpf: Add sk_is_inet check in tls_sw_has_ctx_tx/rx
2024-10-29 23:07 ` Stanislav Fomichev
@ 2024-10-29 23:37 ` Zijian Zhang
2024-10-30 0:22 ` Stanislav Fomichev
0 siblings, 1 reply; 9+ messages in thread
From: Zijian Zhang @ 2024-10-29 23:37 UTC (permalink / raw)
To: Stanislav Fomichev
Cc: bpf, borisp, john.fastabend, kuba, davem, edumazet, pabeni, horms,
daniel, ast, cong.wang
On 10/29/24 4:07 PM, Stanislav Fomichev wrote:
> On 10/29, zijianzhang@bytedance.com wrote:
>> From: Zijian Zhang <zijianzhang@bytedance.com>
>>
>> As the introduction of the support for vsock and unix sockets in sockmap,
>> tls_sw_has_ctx_tx/rx cannot presume the socket passed in must be inet.
>> Otherwise, tls_get_ctx may return an invalid pointer and result in page
>> fault in function tls_sw_ctx_rx.
>>
>> BUG: unable to handle page fault for address: 0000000000040030
>> Workqueue: vsock-loopback vsock_loopback_work
>> RIP: 0010:sk_psock_strp_data_ready+0x23/0x60
>> Call Trace:
>> ? __die+0x81/0xc3
>> ? no_context+0x194/0x350
>> ? do_page_fault+0x30/0x110
>> ? async_page_fault+0x3e/0x50
>> ? sk_psock_strp_data_ready+0x23/0x60
>> virtio_transport_recv_pkt+0x750/0x800
>> ? update_load_avg+0x7e/0x620
>> vsock_loopback_work+0xd0/0x100
>> process_one_work+0x1a7/0x360
>> worker_thread+0x30/0x390
>> ? create_worker+0x1a0/0x1a0
>> kthread+0x112/0x130
>> ? __kthread_cancel_work+0x40/0x40
>> ret_from_fork+0x1f/0x40
>>
>> Fixes: 0608c69c9a80 ("bpf: sk_msg, sock{map|hash} redirect through ULP")
>> Fixes: e91de6afa81c ("bpf: Fix running sk_skb program types with ktls")
>>
>> Signed-off-by: Zijian Zhang <zijianzhang@bytedance.com>
>> ---
>> include/net/tls.h | 12 ++++++++++--
>> 1 file changed, 10 insertions(+), 2 deletions(-)
>>
>> diff --git a/include/net/tls.h b/include/net/tls.h
>> index 3a33924db2bc..a65939c7ad61 100644
>> --- a/include/net/tls.h
>> +++ b/include/net/tls.h
>> @@ -390,8 +390,12 @@ tls_offload_ctx_tx(const struct tls_context *tls_ctx)
>>
>> static inline bool tls_sw_has_ctx_tx(const struct sock *sk)
>> {
>> - struct tls_context *ctx = tls_get_ctx(sk);
>> + struct tls_context *ctx;
>> +
>> + if (!sk_is_inet(sk))
>> + return false;
>>
>> + ctx = tls_get_ctx(sk);
>> if (!ctx)
>> return false;
>> return !!tls_sw_ctx_tx(ctx);
>> @@ -399,8 +403,12 @@ static inline bool tls_sw_has_ctx_tx(const struct sock *sk)
>>
>> static inline bool tls_sw_has_ctx_rx(const struct sock *sk)
>> {
>> - struct tls_context *ctx = tls_get_ctx(sk);
>> + struct tls_context *ctx;
>> +
>> + if (!sk_is_inet(sk))
>> + return false;
>>
>> + ctx = tls_get_ctx(sk);
>> if (!ctx)
>> return false;
>> return !!tls_sw_ctx_rx(ctx);
>
> This seems like a strange place to fix it. Why does tls_get_ctx return
> invalid pointer for non-tls/ulp sockets? Shouldn't it be NULL?
> Is sockmap even supposed to work with vsock?
Here is my understanding, please correct me if I am wrong :)
```
static inline struct tls_context *tls_get_ctx(const struct sock *sk)
{
const struct inet_connection_sock *icsk = inet_csk(sk);
return (__force void *)icsk->icsk_ulp_data;
}
```
tls_get_ctx assumes the socket passed is icsk_socket. However, unix
and vsock do not have inet_connection_sock, they have unix_sock and
vsock_sock. The offset of icsk_ulp_data are meaningless for them, and
they might point to some other values which might not be NULL.
Afaik, sockmap started to support vsock in 634f1a7110b4 ("vsock: support
sockmap"), and support unix in 94531cfcbe79 ("af_unix: Add
unix_stream_proto for sockmap").
If the above is correct, I find that using inet_test_bit(IS_ICSK, sk)
instead of sk_is_inet will be more accurate.
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH bpf] bpf: Add sk_is_inet check in tls_sw_has_ctx_tx/rx
2024-10-29 23:37 ` Zijian Zhang
@ 2024-10-30 0:22 ` Stanislav Fomichev
2024-10-30 0:55 ` Zijian Zhang
0 siblings, 1 reply; 9+ messages in thread
From: Stanislav Fomichev @ 2024-10-30 0:22 UTC (permalink / raw)
To: Zijian Zhang
Cc: bpf, borisp, john.fastabend, kuba, davem, edumazet, pabeni, horms,
daniel, ast, cong.wang
On 10/29, Zijian Zhang wrote:
>
>
> On 10/29/24 4:07 PM, Stanislav Fomichev wrote:
> > On 10/29, zijianzhang@bytedance.com wrote:
> > > From: Zijian Zhang <zijianzhang@bytedance.com>
> > >
> > > As the introduction of the support for vsock and unix sockets in sockmap,
> > > tls_sw_has_ctx_tx/rx cannot presume the socket passed in must be inet.
> > > Otherwise, tls_get_ctx may return an invalid pointer and result in page
> > > fault in function tls_sw_ctx_rx.
> > >
> > > BUG: unable to handle page fault for address: 0000000000040030
> > > Workqueue: vsock-loopback vsock_loopback_work
> > > RIP: 0010:sk_psock_strp_data_ready+0x23/0x60
> > > Call Trace:
> > > ? __die+0x81/0xc3
> > > ? no_context+0x194/0x350
> > > ? do_page_fault+0x30/0x110
> > > ? async_page_fault+0x3e/0x50
> > > ? sk_psock_strp_data_ready+0x23/0x60
> > > virtio_transport_recv_pkt+0x750/0x800
> > > ? update_load_avg+0x7e/0x620
> > > vsock_loopback_work+0xd0/0x100
> > > process_one_work+0x1a7/0x360
> > > worker_thread+0x30/0x390
> > > ? create_worker+0x1a0/0x1a0
> > > kthread+0x112/0x130
> > > ? __kthread_cancel_work+0x40/0x40
> > > ret_from_fork+0x1f/0x40
> > >
> > > Fixes: 0608c69c9a80 ("bpf: sk_msg, sock{map|hash} redirect through ULP")
> > > Fixes: e91de6afa81c ("bpf: Fix running sk_skb program types with ktls")
> > >
> > > Signed-off-by: Zijian Zhang <zijianzhang@bytedance.com>
> > > ---
> > > include/net/tls.h | 12 ++++++++++--
> > > 1 file changed, 10 insertions(+), 2 deletions(-)
> > >
> > > diff --git a/include/net/tls.h b/include/net/tls.h
> > > index 3a33924db2bc..a65939c7ad61 100644
> > > --- a/include/net/tls.h
> > > +++ b/include/net/tls.h
> > > @@ -390,8 +390,12 @@ tls_offload_ctx_tx(const struct tls_context *tls_ctx)
> > > static inline bool tls_sw_has_ctx_tx(const struct sock *sk)
> > > {
> > > - struct tls_context *ctx = tls_get_ctx(sk);
> > > + struct tls_context *ctx;
> > > +
> > > + if (!sk_is_inet(sk))
> > > + return false;
> > > + ctx = tls_get_ctx(sk);
> > > if (!ctx)
> > > return false;
> > > return !!tls_sw_ctx_tx(ctx);
> > > @@ -399,8 +403,12 @@ static inline bool tls_sw_has_ctx_tx(const struct sock *sk)
> > > static inline bool tls_sw_has_ctx_rx(const struct sock *sk)
> > > {
> > > - struct tls_context *ctx = tls_get_ctx(sk);
> > > + struct tls_context *ctx;
> > > +
> > > + if (!sk_is_inet(sk))
> > > + return false;
> > > + ctx = tls_get_ctx(sk);
> > > if (!ctx)
> > > return false;
> > > return !!tls_sw_ctx_rx(ctx);
> >
> > This seems like a strange place to fix it. Why does tls_get_ctx return
> > invalid pointer for non-tls/ulp sockets? Shouldn't it be NULL?
> > Is sockmap even supposed to work with vsock?
>
> Here is my understanding, please correct me if I am wrong :)
> ```
> static inline struct tls_context *tls_get_ctx(const struct sock *sk)
> {
> const struct inet_connection_sock *icsk = inet_csk(sk);
> return (__force void *)icsk->icsk_ulp_data;
> }
> ```
> tls_get_ctx assumes the socket passed is icsk_socket. However, unix
> and vsock do not have inet_connection_sock, they have unix_sock and
> vsock_sock. The offset of icsk_ulp_data are meaningless for them, and
> they might point to some other values which might not be NULL.
>
> Afaik, sockmap started to support vsock in 634f1a7110b4 ("vsock: support
> sockmap"), and support unix in 94531cfcbe79 ("af_unix: Add
> unix_stream_proto for sockmap").
>
> If the above is correct, I find that using inet_test_bit(IS_ICSK, sk)
> instead of sk_is_inet will be more accurate.
Thanks for the context, makes sense. And consolidating this sk_is_inet
check inside tls_get_ctx is worse because it gets called outside of
sockmap?
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH bpf] bpf: Add sk_is_inet check in tls_sw_has_ctx_tx/rx
2024-10-30 0:22 ` Stanislav Fomichev
@ 2024-10-30 0:55 ` Zijian Zhang
2024-10-30 15:38 ` Stanislav Fomichev
0 siblings, 1 reply; 9+ messages in thread
From: Zijian Zhang @ 2024-10-30 0:55 UTC (permalink / raw)
To: Stanislav Fomichev
Cc: bpf, borisp, john.fastabend, kuba, davem, edumazet, pabeni, horms,
daniel, ast, cong.wang
On 10/29/24 5:22 PM, Stanislav Fomichev wrote:
> On 10/29, Zijian Zhang wrote:
>>
>>
>> On 10/29/24 4:07 PM, Stanislav Fomichev wrote:
>>> On 10/29, zijianzhang@bytedance.com wrote:
...
>>>> diff --git a/include/net/tls.h b/include/net/tls.h
>>>> index 3a33924db2bc..a65939c7ad61 100644
>>>> --- a/include/net/tls.h
>>>> +++ b/include/net/tls.h
>>>> @@ -390,8 +390,12 @@ tls_offload_ctx_tx(const struct tls_context *tls_ctx)
>>>> static inline bool tls_sw_has_ctx_tx(const struct sock *sk)
>>>> {
>>>> - struct tls_context *ctx = tls_get_ctx(sk);
>>>> + struct tls_context *ctx;
>>>> +
>>>> + if (!sk_is_inet(sk))
>>>> + return false;
>>>> + ctx = tls_get_ctx(sk);
>>>> if (!ctx)
>>>> return false;
>>>> return !!tls_sw_ctx_tx(ctx);
>>>> @@ -399,8 +403,12 @@ static inline bool tls_sw_has_ctx_tx(const struct sock *sk)
>>>> static inline bool tls_sw_has_ctx_rx(const struct sock *sk)
>>>> {
>>>> - struct tls_context *ctx = tls_get_ctx(sk);
>>>> + struct tls_context *ctx;
>>>> +
>>>> + if (!sk_is_inet(sk))
>>>> + return false;
>>>> + ctx = tls_get_ctx(sk);
>>>> if (!ctx)
>>>> return false;
>>>> return !!tls_sw_ctx_rx(ctx);
>>>
>>> This seems like a strange place to fix it. Why does tls_get_ctx return
>>> invalid pointer for non-tls/ulp sockets? Shouldn't it be NULL?
>>> Is sockmap even supposed to work with vsock?
>>
>> Here is my understanding, please correct me if I am wrong :)
>> ```
>> static inline struct tls_context *tls_get_ctx(const struct sock *sk)
>> {
>> const struct inet_connection_sock *icsk = inet_csk(sk);
>> return (__force void *)icsk->icsk_ulp_data;
>> }
>> ```
>> tls_get_ctx assumes the socket passed is icsk_socket. However, unix
>> and vsock do not have inet_connection_sock, they have unix_sock and
>> vsock_sock. The offset of icsk_ulp_data are meaningless for them, and
>> they might point to some other values which might not be NULL.
>>
>> Afaik, sockmap started to support vsock in 634f1a7110b4 ("vsock: support
>> sockmap"), and support unix in 94531cfcbe79 ("af_unix: Add
>> unix_stream_proto for sockmap").
>>
>> If the above is correct, I find that using inet_test_bit(IS_ICSK, sk)
>> instead of sk_is_inet will be more accurate.
>
> Thanks for the context, makes sense. And consolidating this sk_is_inet
> check inside tls_get_ctx is worse because it gets called outside of
> sockmap?
Yes, tls_get_ctx is invoked in multiple locations, and I want to only
fix sockmap related calls.
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH bpf] bpf: Add sk_is_inet check in tls_sw_has_ctx_tx/rx
2024-10-30 0:55 ` Zijian Zhang
@ 2024-10-30 15:38 ` Stanislav Fomichev
2024-10-30 16:37 ` Zijian Zhang
0 siblings, 1 reply; 9+ messages in thread
From: Stanislav Fomichev @ 2024-10-30 15:38 UTC (permalink / raw)
To: Zijian Zhang
Cc: bpf, borisp, john.fastabend, kuba, davem, edumazet, pabeni, horms,
daniel, ast, cong.wang
On 10/29, Zijian Zhang wrote:
>
> On 10/29/24 5:22 PM, Stanislav Fomichev wrote:
> > On 10/29, Zijian Zhang wrote:
> > >
> > >
> > > On 10/29/24 4:07 PM, Stanislav Fomichev wrote:
> > > > On 10/29, zijianzhang@bytedance.com wrote:
> ...
> > > > > diff --git a/include/net/tls.h b/include/net/tls.h
> > > > > index 3a33924db2bc..a65939c7ad61 100644
> > > > > --- a/include/net/tls.h
> > > > > +++ b/include/net/tls.h
> > > > > @@ -390,8 +390,12 @@ tls_offload_ctx_tx(const struct tls_context *tls_ctx)
> > > > > static inline bool tls_sw_has_ctx_tx(const struct sock *sk)
> > > > > {
> > > > > - struct tls_context *ctx = tls_get_ctx(sk);
> > > > > + struct tls_context *ctx;
> > > > > +
> > > > > + if (!sk_is_inet(sk))
> > > > > + return false;
> > > > > + ctx = tls_get_ctx(sk);
> > > > > if (!ctx)
> > > > > return false;
> > > > > return !!tls_sw_ctx_tx(ctx);
> > > > > @@ -399,8 +403,12 @@ static inline bool tls_sw_has_ctx_tx(const struct sock *sk)
> > > > > static inline bool tls_sw_has_ctx_rx(const struct sock *sk)
> > > > > {
> > > > > - struct tls_context *ctx = tls_get_ctx(sk);
> > > > > + struct tls_context *ctx;
> > > > > +
> > > > > + if (!sk_is_inet(sk))
> > > > > + return false;
> > > > > + ctx = tls_get_ctx(sk);
> > > > > if (!ctx)
> > > > > return false;
> > > > > return !!tls_sw_ctx_rx(ctx);
> > > >
> > > > This seems like a strange place to fix it. Why does tls_get_ctx return
> > > > invalid pointer for non-tls/ulp sockets? Shouldn't it be NULL?
> > > > Is sockmap even supposed to work with vsock?
> > >
> > > Here is my understanding, please correct me if I am wrong :)
> > > ```
> > > static inline struct tls_context *tls_get_ctx(const struct sock *sk)
> > > {
> > > const struct inet_connection_sock *icsk = inet_csk(sk);
> > > return (__force void *)icsk->icsk_ulp_data;
> > > }
> > > ```
> > > tls_get_ctx assumes the socket passed is icsk_socket. However, unix
> > > and vsock do not have inet_connection_sock, they have unix_sock and
> > > vsock_sock. The offset of icsk_ulp_data are meaningless for them, and
> > > they might point to some other values which might not be NULL.
> > >
> > > Afaik, sockmap started to support vsock in 634f1a7110b4 ("vsock: support
> > > sockmap"), and support unix in 94531cfcbe79 ("af_unix: Add
> > > unix_stream_proto for sockmap").
> > >
> > > If the above is correct, I find that using inet_test_bit(IS_ICSK, sk)
> > > instead of sk_is_inet will be more accurate.
> >
> > Thanks for the context, makes sense. And consolidating this sk_is_inet
> > check inside tls_get_ctx is worse because it gets called outside of
> > sockmap?
>
> Yes, tls_get_ctx is invoked in multiple locations, and I want to only
> fix sockmap related calls.
Sounds convincing. Unless John/Jakub have better suggestions:
Acked-by: Stanislav Fomichev <sdf@fomichev.me>
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH bpf] bpf: Add sk_is_inet check in tls_sw_has_ctx_tx/rx
2024-10-30 15:38 ` Stanislav Fomichev
@ 2024-10-30 16:37 ` Zijian Zhang
2024-10-31 16:39 ` Stanislav Fomichev
0 siblings, 1 reply; 9+ messages in thread
From: Zijian Zhang @ 2024-10-30 16:37 UTC (permalink / raw)
To: Stanislav Fomichev
Cc: bpf, borisp, john.fastabend, kuba, davem, edumazet, pabeni, horms,
daniel, ast, cong.wang
On 10/30/24 8:38 AM, Stanislav Fomichev wrote:
> On 10/29, Zijian Zhang wrote:
>>
>> On 10/29/24 5:22 PM, Stanislav Fomichev wrote:
>>> On 10/29, Zijian Zhang wrote:
>>>>
>>>>
>>>> On 10/29/24 4:07 PM, Stanislav Fomichev wrote:
>>>>> On 10/29, zijianzhang@bytedance.com wrote:
>> ...
>>>>>> diff --git a/include/net/tls.h b/include/net/tls.h
>>>>>> index 3a33924db2bc..a65939c7ad61 100644
>>>>>> --- a/include/net/tls.h
>>>>>> +++ b/include/net/tls.h
>>>>>> @@ -390,8 +390,12 @@ tls_offload_ctx_tx(const struct tls_context *tls_ctx)
>>>>>> static inline bool tls_sw_has_ctx_tx(const struct sock *sk)
>>>>>> {
>>>>>> - struct tls_context *ctx = tls_get_ctx(sk);
>>>>>> + struct tls_context *ctx;
>>>>>> +
>>>>>> + if (!sk_is_inet(sk))
>>>>>> + return false;
>>>>>> + ctx = tls_get_ctx(sk);
>>>>>> if (!ctx)
>>>>>> return false;
>>>>>> return !!tls_sw_ctx_tx(ctx);
>>>>>> @@ -399,8 +403,12 @@ static inline bool tls_sw_has_ctx_tx(const struct sock *sk)
>>>>>> static inline bool tls_sw_has_ctx_rx(const struct sock *sk)
>>>>>> {
>>>>>> - struct tls_context *ctx = tls_get_ctx(sk);
>>>>>> + struct tls_context *ctx;
>>>>>> +
>>>>>> + if (!sk_is_inet(sk))
>>>>>> + return false;
>>>>>> + ctx = tls_get_ctx(sk);
>>>>>> if (!ctx)
>>>>>> return false;
>>>>>> return !!tls_sw_ctx_rx(ctx);
>>>>>
>>>>> This seems like a strange place to fix it. Why does tls_get_ctx return
>>>>> invalid pointer for non-tls/ulp sockets? Shouldn't it be NULL?
>>>>> Is sockmap even supposed to work with vsock?
>>>>
>>>> Here is my understanding, please correct me if I am wrong :)
>>>> ```
>>>> static inline struct tls_context *tls_get_ctx(const struct sock *sk)
>>>> {
>>>> const struct inet_connection_sock *icsk = inet_csk(sk);
>>>> return (__force void *)icsk->icsk_ulp_data;
>>>> }
>>>> ```
>>>> tls_get_ctx assumes the socket passed is icsk_socket. However, unix
>>>> and vsock do not have inet_connection_sock, they have unix_sock and
>>>> vsock_sock. The offset of icsk_ulp_data are meaningless for them, and
>>>> they might point to some other values which might not be NULL.
>>>>
>>>> Afaik, sockmap started to support vsock in 634f1a7110b4 ("vsock: support
>>>> sockmap"), and support unix in 94531cfcbe79 ("af_unix: Add
>>>> unix_stream_proto for sockmap").
>>>>
>>>> If the above is correct, I find that using inet_test_bit(IS_ICSK, sk)
>>>> instead of sk_is_inet will be more accurate.
>>>
>>> Thanks for the context, makes sense. And consolidating this sk_is_inet
>>> check inside tls_get_ctx is worse because it gets called outside of
>>> sockmap?
>>
>> Yes, tls_get_ctx is invoked in multiple locations, and I want to only
>> fix sockmap related calls.
>
> Sounds convincing. Unless John/Jakub have better suggestions:
>
> Acked-by: Stanislav Fomichev <sdf@fomichev.me>
Thanks for the Ack and reviewing!
In order to make it more accurate, I added inet_test_bit(IS_ICSK, sk)
check in version2. I just found that sk_is_inet only cannot assure
inet_csk is valid. For example, udp_sock does not have inet_connection_sock.
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH bpf] bpf: Add sk_is_inet check in tls_sw_has_ctx_tx/rx
2024-10-30 16:37 ` Zijian Zhang
@ 2024-10-31 16:39 ` Stanislav Fomichev
2024-10-31 17:54 ` Zijian Zhang
0 siblings, 1 reply; 9+ messages in thread
From: Stanislav Fomichev @ 2024-10-31 16:39 UTC (permalink / raw)
To: Zijian Zhang
Cc: bpf, borisp, john.fastabend, kuba, davem, edumazet, pabeni, horms,
daniel, ast, cong.wang
On 10/30, Zijian Zhang wrote:
> On 10/30/24 8:38 AM, Stanislav Fomichev wrote:
> > On 10/29, Zijian Zhang wrote:
> > >
> > > On 10/29/24 5:22 PM, Stanislav Fomichev wrote:
> > > > On 10/29, Zijian Zhang wrote:
> > > > >
> > > > >
> > > > > On 10/29/24 4:07 PM, Stanislav Fomichev wrote:
> > > > > > On 10/29, zijianzhang@bytedance.com wrote:
> > > ...
> > > > > > > diff --git a/include/net/tls.h b/include/net/tls.h
> > > > > > > index 3a33924db2bc..a65939c7ad61 100644
> > > > > > > --- a/include/net/tls.h
> > > > > > > +++ b/include/net/tls.h
> > > > > > > @@ -390,8 +390,12 @@ tls_offload_ctx_tx(const struct tls_context *tls_ctx)
> > > > > > > static inline bool tls_sw_has_ctx_tx(const struct sock *sk)
> > > > > > > {
> > > > > > > - struct tls_context *ctx = tls_get_ctx(sk);
> > > > > > > + struct tls_context *ctx;
> > > > > > > +
> > > > > > > + if (!sk_is_inet(sk))
> > > > > > > + return false;
> > > > > > > + ctx = tls_get_ctx(sk);
> > > > > > > if (!ctx)
> > > > > > > return false;
> > > > > > > return !!tls_sw_ctx_tx(ctx);
> > > > > > > @@ -399,8 +403,12 @@ static inline bool tls_sw_has_ctx_tx(const struct sock *sk)
> > > > > > > static inline bool tls_sw_has_ctx_rx(const struct sock *sk)
> > > > > > > {
> > > > > > > - struct tls_context *ctx = tls_get_ctx(sk);
> > > > > > > + struct tls_context *ctx;
> > > > > > > +
> > > > > > > + if (!sk_is_inet(sk))
> > > > > > > + return false;
> > > > > > > + ctx = tls_get_ctx(sk);
> > > > > > > if (!ctx)
> > > > > > > return false;
> > > > > > > return !!tls_sw_ctx_rx(ctx);
> > > > > >
> > > > > > This seems like a strange place to fix it. Why does tls_get_ctx return
> > > > > > invalid pointer for non-tls/ulp sockets? Shouldn't it be NULL?
> > > > > > Is sockmap even supposed to work with vsock?
> > > > >
> > > > > Here is my understanding, please correct me if I am wrong :)
> > > > > ```
> > > > > static inline struct tls_context *tls_get_ctx(const struct sock *sk)
> > > > > {
> > > > > const struct inet_connection_sock *icsk = inet_csk(sk);
> > > > > return (__force void *)icsk->icsk_ulp_data;
> > > > > }
> > > > > ```
> > > > > tls_get_ctx assumes the socket passed is icsk_socket. However, unix
> > > > > and vsock do not have inet_connection_sock, they have unix_sock and
> > > > > vsock_sock. The offset of icsk_ulp_data are meaningless for them, and
> > > > > they might point to some other values which might not be NULL.
> > > > >
> > > > > Afaik, sockmap started to support vsock in 634f1a7110b4 ("vsock: support
> > > > > sockmap"), and support unix in 94531cfcbe79 ("af_unix: Add
> > > > > unix_stream_proto for sockmap").
> > > > >
> > > > > If the above is correct, I find that using inet_test_bit(IS_ICSK, sk)
> > > > > instead of sk_is_inet will be more accurate.
> > > >
> > > > Thanks for the context, makes sense. And consolidating this sk_is_inet
> > > > check inside tls_get_ctx is worse because it gets called outside of
> > > > sockmap?
> > >
> > > Yes, tls_get_ctx is invoked in multiple locations, and I want to only
> > > fix sockmap related calls.
> >
> > Sounds convincing. Unless John/Jakub have better suggestions:
> >
> > Acked-by: Stanislav Fomichev <sdf@fomichev.me>
>
> Thanks for the Ack and reviewing!
>
> In order to make it more accurate, I added inet_test_bit(IS_ICSK, sk)
> check in version2. I just found that sk_is_inet only cannot assure
> inet_csk is valid. For example, udp_sock does not have inet_connection_sock.
Instead of testing IS_ICSK bit, will inet_csk_has_ulp helper work?
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH bpf] bpf: Add sk_is_inet check in tls_sw_has_ctx_tx/rx
2024-10-31 16:39 ` Stanislav Fomichev
@ 2024-10-31 17:54 ` Zijian Zhang
0 siblings, 0 replies; 9+ messages in thread
From: Zijian Zhang @ 2024-10-31 17:54 UTC (permalink / raw)
To: Stanislav Fomichev
Cc: bpf, borisp, john.fastabend, kuba, davem, edumazet, pabeni, horms,
daniel, ast, cong.wang
On 10/31/24 9:39 AM, Stanislav Fomichev wrote:
> On 10/30, Zijian Zhang wrote:
>> On 10/30/24 8:38 AM, Stanislav Fomichev wrote:
>>
>> Thanks for the Ack and reviewing!
>>
>> In order to make it more accurate, I added inet_test_bit(IS_ICSK, sk)
>> check in version2. I just found that sk_is_inet only cannot assure
>> inet_csk is valid. For example, udp_sock does not have inet_connection_sock.
>
> Instead of testing IS_ICSK bit, will inet_csk_has_ulp helper work?
Nice catch, while testing IS_ICSK bit is sufficient, inet_csk_has_ulp is
a stricter check. I am good with either approach.
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2024-10-31 17:54 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-10-29 20:28 [PATCH bpf] bpf: Add sk_is_inet check in tls_sw_has_ctx_tx/rx zijianzhang
2024-10-29 23:07 ` Stanislav Fomichev
2024-10-29 23:37 ` Zijian Zhang
2024-10-30 0:22 ` Stanislav Fomichev
2024-10-30 0:55 ` Zijian Zhang
2024-10-30 15:38 ` Stanislav Fomichev
2024-10-30 16:37 ` Zijian Zhang
2024-10-31 16:39 ` Stanislav Fomichev
2024-10-31 17:54 ` Zijian Zhang
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.