>> 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; >