On 2019/6/27 上午10:33, Yuya Kusakabe wrote:
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?



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


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