>> This adds XDP meta data support to the code path receive_small().
>>
>> mrg_rxbuf=off is required on qemu, because receive_mergeable() still
>> doesn't support XDP meta data.
>
>
>What's the reason for this?

I didn't have enough time to add support XDP meta data to
receive_mergeable(). But I'll try it a little more. Please wait for the
next patch.

>>
>> Fixes: de8f3a83b0a0 ("bpf: add meta pointer for direct access")
>> Signed-off-by: Yuya Kusakabe <yuya.kusak...@gmail.com>
>
>
>Could you please cc virtio maintainer through get_maintainer.pl?
>
>Thanks

Sorry. I added them.

Thanks.

> ---
>   drivers/net/virtio_net.c | 10 ++++++++--
>   1 file changed, 8 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
> index 4f3de0ac8b0b..14165c5edb7d 100644
> --- a/drivers/net/virtio_net.c
> +++ b/drivers/net/virtio_net.c
> @@ -644,6 +644,7 @@ static struct sk_buff *receive_small(struct net_device 
> *dev,
>       unsigned int delta = 0;
>       struct page *xdp_page;
>       int err;
> +     unsigned int metasize = 0;
>   
>       len -= vi->hdr_len;
>       stats->bytes += len;
> @@ -683,8 +684,8 @@ static struct sk_buff *receive_small(struct net_device 
> *dev,
>   
>               xdp.data_hard_start = buf + VIRTNET_RX_PAD + vi->hdr_len;
>               xdp.data = xdp.data_hard_start + xdp_headroom;
> -             xdp_set_data_meta_invalid(&xdp);
>               xdp.data_end = xdp.data + len;
> +             xdp.data_meta = xdp.data;
>               xdp.rxq = &rq->xdp_rxq;
>               orig_data = xdp.data;
>               act = bpf_prog_run_xdp(xdp_prog, &xdp);
> @@ -695,9 +696,11 @@ static struct sk_buff *receive_small(struct net_device 
> *dev,
>                       /* Recalculate length in case bpf program changed it */
>                       delta = orig_data - xdp.data;
>                       len = xdp.data_end - xdp.data;
> +                     metasize = xdp.data - xdp.data_meta;
>                       break;
>               case XDP_TX:
>                       stats->xdp_tx++;
> +                     xdp.data_meta = xdp.data;
>                       xdpf = convert_to_xdp_frame(&xdp);
>                       if (unlikely(!xdpf))
>                               goto err_xdp;
> @@ -735,11 +738,14 @@ static struct sk_buff *receive_small(struct net_device 
> *dev,
>       }
>       skb_reserve(skb, headroom - delta);
>       skb_put(skb, len);
> -     if (!delta) {
> +     if (!delta && !metasize) {
>               buf += header_offset;
>               memcpy(skb_vnet_hdr(skb), buf, vi->hdr_len);
>       } /* keep zeroed vnet hdr since packet was changed by bpf */
>   
> +     if (metasize)
> +             skb_metadata_set(skb, metasize);
> +
>   err:
>       return skb;
>   

Reply via email to