2023-10-08 18:39:54

by Willem de Bruijn

[permalink] [raw]
Subject: Re: [RFC PATCH 1/7] net: skbuff: Add tun_vnet_hash flag

On Sun, Oct 8, 2023 at 7:22 AM Akihiko Odaki <[email protected]> wrote:
>
> tun_vnet_hash can use this flag to indicate it stored virtio-net hash
> cache to cb.
>
> Signed-off-by: Akihiko Odaki <[email protected]>
> ---
> include/linux/skbuff.h | 2 ++
> 1 file changed, 2 insertions(+)
>
> diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
> index 4174c4b82d13..e638f157c13c 100644
> --- a/include/linux/skbuff.h
> +++ b/include/linux/skbuff.h
> @@ -837,6 +837,7 @@ typedef unsigned char *sk_buff_data_t;
> * @truesize: Buffer size
> * @users: User count - see {datagram,tcp}.c
> * @extensions: allocated extensions, valid if active_extensions is nonzero
> + * @tun_vnet_hash: tun stored virtio-net hash cache to cb
> */
>
> struct sk_buff {
> @@ -989,6 +990,7 @@ struct sk_buff {
> #if IS_ENABLED(CONFIG_IP_SCTP)
> __u8 csum_not_inet:1;
> #endif
> + __u8 tun_vnet_hash:1;

sk_buff space is very limited.

No need to extend it, especially for code that stays within a single
subsystem (tun).

To a lesser extent the same point applies to the qdisc_skb_cb.


2023-10-08 19:53:29

by Akihiko Odaki

[permalink] [raw]
Subject: Re: [RFC PATCH 1/7] net: skbuff: Add tun_vnet_hash flag

On 2023/10/09 3:39, Willem de Bruijn wrote:
> On Sun, Oct 8, 2023 at 7:22 AM Akihiko Odaki <[email protected]> wrote:
>>
>> tun_vnet_hash can use this flag to indicate it stored virtio-net hash
>> cache to cb.
>>
>> Signed-off-by: Akihiko Odaki <[email protected]>
>> ---
>> include/linux/skbuff.h | 2 ++
>> 1 file changed, 2 insertions(+)
>>
>> diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
>> index 4174c4b82d13..e638f157c13c 100644
>> --- a/include/linux/skbuff.h
>> +++ b/include/linux/skbuff.h
>> @@ -837,6 +837,7 @@ typedef unsigned char *sk_buff_data_t;
>> * @truesize: Buffer size
>> * @users: User count - see {datagram,tcp}.c
>> * @extensions: allocated extensions, valid if active_extensions is nonzero
>> + * @tun_vnet_hash: tun stored virtio-net hash cache to cb
>> */
>>
>> struct sk_buff {
>> @@ -989,6 +990,7 @@ struct sk_buff {
>> #if IS_ENABLED(CONFIG_IP_SCTP)
>> __u8 csum_not_inet:1;
>> #endif
>> + __u8 tun_vnet_hash:1;
>
> sk_buff space is very limited.
>
> No need to extend it, especially for code that stays within a single
> subsystem (tun).
>
> To a lesser extent the same point applies to the qdisc_skb_cb.

I had to extend sk_buff because it does not stay in tun but moves back
and forth between qdisc and tun.

The new members of sk_buff and qdisc_skb_cb are stored by tun's
ndo_select_queue(). The control will go back to qdisc after
ndo_select_queue() function finishes. Eventually tun's ndo_start_xmit()
will be called by qdisc and consumes the stored members. qdisc is
required to keep the stored members intact.

tun_vnet_hash is a bit special. It is put into sk_buff because
ndo_select_queue() is not always called and it may be left
uninitialized. ndo_start_xmit() may read some garbage from cb's old user
if it is put into cb.