netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH bpf-next v6 0/2] virtio_net: add XDP meta data support
@ 2020-02-25  3:31 Yuya Kusakabe
  2020-02-25  3:32 ` [PATCH bpf-next v6 1/2] virtio_net: keep vnet header zeroed if XDP is loaded for small buffer Yuya Kusakabe
  2020-02-25 21:59 ` [PATCH bpf-next v6 0/2] virtio_net: add XDP meta data support Daniel Borkmann
  0 siblings, 2 replies; 8+ messages in thread
From: Yuya Kusakabe @ 2020-02-25  3:31 UTC (permalink / raw)
  To: jasowang
  Cc: andriin, ast, bpf, daniel, davem, hawk, john.fastabend, kafai,
	kuba, linux-kernel, mst, netdev, songliubraving, yhs,
	yuya.kusakabe

This patch series has 2 patches.

Patch 1/2: keep vnet header zeroed if XDP is loaded for small buffer
With this fix, we do not need to care about vnet header in XDP meta data
support for small buffer, even though XDP meta data uses in front of
packet as same as vnet header.
It would be best if this patch goes into stable.
This patch is based on the feedback by Jason Wang and Michael S. Tsirkin.
https://lore.kernel.org/netdev/9a0a1469-c8a7-8223-a4d5-dad656a142fc@redhat.com/
https://lore.kernel.org/netdev/20200223031314-mutt-send-email-mst@kernel.org/

Patch 2/2: add XDP meta data support

Thanks to Jason Wang, Daniel Borkmann and Michael S. Tsirkin for the feedback.

Yuya Kusakabe (2):
  virtio_net: keep vnet header zeroed if XDP is loaded for small buffer
  virtio_net: add XDP meta data support

 drivers/net/virtio_net.c | 56 ++++++++++++++++++++++++----------------
 1 file changed, 34 insertions(+), 22 deletions(-)

-- 
2.24.1


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH bpf-next v6 1/2] virtio_net: keep vnet header zeroed if XDP is loaded for small buffer
  2020-02-25  3:31 [PATCH bpf-next v6 0/2] virtio_net: add XDP meta data support Yuya Kusakabe
@ 2020-02-25  3:32 ` Yuya Kusakabe
  2020-02-25  3:32   ` [PATCH bpf-next v6 2/2] virtio_net: add XDP meta data support Yuya Kusakabe
                     ` (2 more replies)
  2020-02-25 21:59 ` [PATCH bpf-next v6 0/2] virtio_net: add XDP meta data support Daniel Borkmann
  1 sibling, 3 replies; 8+ messages in thread
From: Yuya Kusakabe @ 2020-02-25  3:32 UTC (permalink / raw)
  To: jasowang
  Cc: andriin, ast, bpf, daniel, davem, hawk, john.fastabend, kafai,
	kuba, linux-kernel, mst, netdev, songliubraving, yhs,
	yuya.kusakabe

We do not want to care about the vnet header in receive_small() if XDP
is loaded, since we can not know whether or not the packet is modified
by XDP.

Fixes: f6b10209b90d ("virtio-net: switch to use build_skb() for small buffer")
Signed-off-by: Yuya Kusakabe <yuya.kusakabe@gmail.com>
---
 drivers/net/virtio_net.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
index 2fe7a3188282..f39d0218bdaa 100644
--- a/drivers/net/virtio_net.c
+++ b/drivers/net/virtio_net.c
@@ -735,10 +735,10 @@ static struct sk_buff *receive_small(struct net_device *dev,
 	}
 	skb_reserve(skb, headroom - delta);
 	skb_put(skb, len);
-	if (!delta) {
+	if (!xdp_prog) {
 		buf += header_offset;
 		memcpy(skb_vnet_hdr(skb), buf, vi->hdr_len);
-	} /* keep zeroed vnet hdr since packet was changed by bpf */
+	} /* keep zeroed vnet hdr since XDP is loaded */
 
 err:
 	return skb;
-- 
2.24.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH bpf-next v6 2/2] virtio_net: add XDP meta data support
  2020-02-25  3:32 ` [PATCH bpf-next v6 1/2] virtio_net: keep vnet header zeroed if XDP is loaded for small buffer Yuya Kusakabe
@ 2020-02-25  3:32   ` Yuya Kusakabe
  2020-02-25  5:45     ` Jason Wang
  2020-02-25 11:19     ` Michael S. Tsirkin
  2020-02-25  5:44   ` [PATCH bpf-next v6 1/2] virtio_net: keep vnet header zeroed if XDP is loaded for small buffer Jason Wang
  2020-02-25 11:18   ` Michael S. Tsirkin
  2 siblings, 2 replies; 8+ messages in thread
From: Yuya Kusakabe @ 2020-02-25  3:32 UTC (permalink / raw)
  To: jasowang
  Cc: andriin, ast, bpf, daniel, davem, hawk, john.fastabend, kafai,
	kuba, linux-kernel, mst, netdev, songliubraving, yhs,
	yuya.kusakabe

Implement support for transferring XDP meta data into skb for
virtio_net driver; before calling into the program, xdp.data_meta points
to xdp.data, where on program return with pass verdict, we call
into skb_metadata_set().

Tested with the script at
https://github.com/higebu/virtio_net-xdp-metadata-test.

Signed-off-by: Yuya Kusakabe <yuya.kusakabe@gmail.com>
---
 drivers/net/virtio_net.c | 52 ++++++++++++++++++++++++----------------
 1 file changed, 32 insertions(+), 20 deletions(-)

diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
index f39d0218bdaa..12d115ef5e74 100644
--- a/drivers/net/virtio_net.c
+++ b/drivers/net/virtio_net.c
@@ -371,7 +371,7 @@ static struct sk_buff *page_to_skb(struct virtnet_info *vi,
 				   struct receive_queue *rq,
 				   struct page *page, unsigned int offset,
 				   unsigned int len, unsigned int truesize,
-				   bool hdr_valid)
+				   bool hdr_valid, unsigned int metasize)
 {
 	struct sk_buff *skb;
 	struct virtio_net_hdr_mrg_rxbuf *hdr;
@@ -393,6 +393,7 @@ static struct sk_buff *page_to_skb(struct virtnet_info *vi,
 	else
 		hdr_padded_len = sizeof(struct padded_vnet_hdr);
 
+	/* hdr_valid means no XDP, so we can copy the vnet header */
 	if (hdr_valid)
 		memcpy(hdr, p, hdr_len);
 
@@ -405,6 +406,11 @@ static struct sk_buff *page_to_skb(struct virtnet_info *vi,
 		copy = skb_tailroom(skb);
 	skb_put_data(skb, p, copy);
 
+	if (metasize) {
+		__skb_pull(skb, metasize);
+		skb_metadata_set(skb, metasize);
+	}
+
 	len -= copy;
 	offset += copy;
 
@@ -450,10 +456,6 @@ static int __virtnet_xdp_xmit_one(struct virtnet_info *vi,
 	struct virtio_net_hdr_mrg_rxbuf *hdr;
 	int err;
 
-	/* virtqueue want to use data area in-front of packet */
-	if (unlikely(xdpf->metasize > 0))
-		return -EOPNOTSUPP;
-
 	if (unlikely(xdpf->headroom < vi->hdr_len))
 		return -EOVERFLOW;
 
@@ -644,6 +646,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 +686,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,6 +698,7 @@ 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++;
@@ -740,6 +744,9 @@ static struct sk_buff *receive_small(struct net_device *dev,
 		memcpy(skb_vnet_hdr(skb), buf, vi->hdr_len);
 	} /* keep zeroed vnet hdr since XDP is loaded */
 
+	if (metasize)
+		skb_metadata_set(skb, metasize);
+
 err:
 	return skb;
 
@@ -760,8 +767,8 @@ static struct sk_buff *receive_big(struct net_device *dev,
 				   struct virtnet_rq_stats *stats)
 {
 	struct page *page = buf;
-	struct sk_buff *skb = page_to_skb(vi, rq, page, 0, len,
-					  PAGE_SIZE, true);
+	struct sk_buff *skb =
+		page_to_skb(vi, rq, page, 0, len, PAGE_SIZE, true, 0);
 
 	stats->bytes += len - vi->hdr_len;
 	if (unlikely(!skb))
@@ -793,6 +800,7 @@ static struct sk_buff *receive_mergeable(struct net_device *dev,
 	unsigned int truesize;
 	unsigned int headroom = mergeable_ctx_to_headroom(ctx);
 	int err;
+	unsigned int metasize = 0;
 
 	head_skb = NULL;
 	stats->bytes += len - vi->hdr_len;
@@ -839,8 +847,8 @@ static struct sk_buff *receive_mergeable(struct net_device *dev,
 		data = page_address(xdp_page) + offset;
 		xdp.data_hard_start = data - VIRTIO_XDP_HEADROOM + vi->hdr_len;
 		xdp.data = data + vi->hdr_len;
-		xdp_set_data_meta_invalid(&xdp);
 		xdp.data_end = xdp.data + (len - vi->hdr_len);
+		xdp.data_meta = xdp.data;
 		xdp.rxq = &rq->xdp_rxq;
 
 		act = bpf_prog_run_xdp(xdp_prog, &xdp);
@@ -848,24 +856,27 @@ static struct sk_buff *receive_mergeable(struct net_device *dev,
 
 		switch (act) {
 		case XDP_PASS:
+			metasize = xdp.data - xdp.data_meta;
+
 			/* recalculate offset to account for any header
-			 * adjustments. Note other cases do not build an
-			 * skb and avoid using offset
+			 * adjustments and minus the metasize to copy the
+			 * metadata in page_to_skb(). Note other cases do not
+			 * build an skb and avoid using offset
 			 */
-			offset = xdp.data -
-					page_address(xdp_page) - vi->hdr_len;
+			offset = xdp.data - page_address(xdp_page) -
+				 vi->hdr_len - metasize;
 
-			/* recalculate len if xdp.data or xdp.data_end were
-			 * adjusted
+			/* recalculate len if xdp.data, xdp.data_end or
+			 * xdp.data_meta were adjusted
 			 */
-			len = xdp.data_end - xdp.data + vi->hdr_len;
+			len = xdp.data_end - xdp.data + vi->hdr_len + metasize;
 			/* We can only create skb based on xdp_page. */
 			if (unlikely(xdp_page != page)) {
 				rcu_read_unlock();
 				put_page(page);
-				head_skb = page_to_skb(vi, rq, xdp_page,
-						       offset, len,
-						       PAGE_SIZE, false);
+				head_skb = page_to_skb(vi, rq, xdp_page, offset,
+						       len, PAGE_SIZE, false,
+						       metasize);
 				return head_skb;
 			}
 			break;
@@ -921,7 +932,8 @@ static struct sk_buff *receive_mergeable(struct net_device *dev,
 		goto err_skb;
 	}
 
-	head_skb = page_to_skb(vi, rq, page, offset, len, truesize, !xdp_prog);
+	head_skb = page_to_skb(vi, rq, page, offset, len, truesize, !xdp_prog,
+			       metasize);
 	curr_skb = head_skb;
 
 	if (unlikely(!curr_skb))
-- 
2.24.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH bpf-next v6 1/2] virtio_net: keep vnet header zeroed if XDP is loaded for small buffer
  2020-02-25  3:32 ` [PATCH bpf-next v6 1/2] virtio_net: keep vnet header zeroed if XDP is loaded for small buffer Yuya Kusakabe
  2020-02-25  3:32   ` [PATCH bpf-next v6 2/2] virtio_net: add XDP meta data support Yuya Kusakabe
@ 2020-02-25  5:44   ` Jason Wang
  2020-02-25 11:18   ` Michael S. Tsirkin
  2 siblings, 0 replies; 8+ messages in thread
From: Jason Wang @ 2020-02-25  5:44 UTC (permalink / raw)
  To: Yuya Kusakabe
  Cc: andriin, ast, bpf, daniel, davem, hawk, john.fastabend, kafai,
	kuba, linux-kernel, mst, netdev, songliubraving, yhs


On 2020/2/25 上午11:32, Yuya Kusakabe wrote:
> We do not want to care about the vnet header in receive_small() if XDP
> is loaded, since we can not know whether or not the packet is modified
> by XDP.
>
> Fixes: f6b10209b90d ("virtio-net: switch to use build_skb() for small buffer")
> Signed-off-by: Yuya Kusakabe <yuya.kusakabe@gmail.com>
> ---
>   drivers/net/virtio_net.c | 4 ++--
>   1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
> index 2fe7a3188282..f39d0218bdaa 100644
> --- a/drivers/net/virtio_net.c
> +++ b/drivers/net/virtio_net.c
> @@ -735,10 +735,10 @@ static struct sk_buff *receive_small(struct net_device *dev,
>   	}
>   	skb_reserve(skb, headroom - delta);
>   	skb_put(skb, len);
> -	if (!delta) {
> +	if (!xdp_prog) {
>   		buf += header_offset;
>   		memcpy(skb_vnet_hdr(skb), buf, vi->hdr_len);
> -	} /* keep zeroed vnet hdr since packet was changed by bpf */
> +	} /* keep zeroed vnet hdr since XDP is loaded */
>   
>   err:
>   	return skb;


Acked-by: Jason Wang <jasowang@redhat.com>


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH bpf-next v6 2/2] virtio_net: add XDP meta data support
  2020-02-25  3:32   ` [PATCH bpf-next v6 2/2] virtio_net: add XDP meta data support Yuya Kusakabe
@ 2020-02-25  5:45     ` Jason Wang
  2020-02-25 11:19     ` Michael S. Tsirkin
  1 sibling, 0 replies; 8+ messages in thread
From: Jason Wang @ 2020-02-25  5:45 UTC (permalink / raw)
  To: Yuya Kusakabe
  Cc: andriin, ast, bpf, daniel, davem, hawk, john.fastabend, kafai,
	kuba, linux-kernel, mst, netdev, songliubraving, yhs


On 2020/2/25 上午11:32, Yuya Kusakabe wrote:
> Implement support for transferring XDP meta data into skb for
> virtio_net driver; before calling into the program, xdp.data_meta points
> to xdp.data, where on program return with pass verdict, we call
> into skb_metadata_set().
>
> Tested with the script at
> https://github.com/higebu/virtio_net-xdp-metadata-test.
>
> Signed-off-by: Yuya Kusakabe <yuya.kusakabe@gmail.com>


Acked-by: Jason Wang <jasowang@redhat.com>


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH bpf-next v6 1/2] virtio_net: keep vnet header zeroed if XDP is loaded for small buffer
  2020-02-25  3:32 ` [PATCH bpf-next v6 1/2] virtio_net: keep vnet header zeroed if XDP is loaded for small buffer Yuya Kusakabe
  2020-02-25  3:32   ` [PATCH bpf-next v6 2/2] virtio_net: add XDP meta data support Yuya Kusakabe
  2020-02-25  5:44   ` [PATCH bpf-next v6 1/2] virtio_net: keep vnet header zeroed if XDP is loaded for small buffer Jason Wang
@ 2020-02-25 11:18   ` Michael S. Tsirkin
  2 siblings, 0 replies; 8+ messages in thread
From: Michael S. Tsirkin @ 2020-02-25 11:18 UTC (permalink / raw)
  To: Yuya Kusakabe
  Cc: jasowang, andriin, ast, bpf, daniel, davem, hawk, john.fastabend,
	kafai, kuba, linux-kernel, netdev, songliubraving, yhs

On Tue, Feb 25, 2020 at 12:32:11PM +0900, Yuya Kusakabe wrote:
> We do not want to care about the vnet header in receive_small() if XDP
> is loaded, since we can not know whether or not the packet is modified
> by XDP.
> 
> Fixes: f6b10209b90d ("virtio-net: switch to use build_skb() for small buffer")
> Signed-off-by: Yuya Kusakabe <yuya.kusakabe@gmail.com>

Acked-by: Michael S. Tsirkin <mst@redhat.com>


> ---
>  drivers/net/virtio_net.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
> index 2fe7a3188282..f39d0218bdaa 100644
> --- a/drivers/net/virtio_net.c
> +++ b/drivers/net/virtio_net.c
> @@ -735,10 +735,10 @@ static struct sk_buff *receive_small(struct net_device *dev,
>  	}
>  	skb_reserve(skb, headroom - delta);
>  	skb_put(skb, len);
> -	if (!delta) {
> +	if (!xdp_prog) {
>  		buf += header_offset;
>  		memcpy(skb_vnet_hdr(skb), buf, vi->hdr_len);
> -	} /* keep zeroed vnet hdr since packet was changed by bpf */
> +	} /* keep zeroed vnet hdr since XDP is loaded */
>  
>  err:
>  	return skb;
> -- 
> 2.24.1


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH bpf-next v6 2/2] virtio_net: add XDP meta data support
  2020-02-25  3:32   ` [PATCH bpf-next v6 2/2] virtio_net: add XDP meta data support Yuya Kusakabe
  2020-02-25  5:45     ` Jason Wang
@ 2020-02-25 11:19     ` Michael S. Tsirkin
  1 sibling, 0 replies; 8+ messages in thread
From: Michael S. Tsirkin @ 2020-02-25 11:19 UTC (permalink / raw)
  To: Yuya Kusakabe
  Cc: jasowang, andriin, ast, bpf, daniel, davem, hawk, john.fastabend,
	kafai, kuba, linux-kernel, netdev, songliubraving, yhs

On Tue, Feb 25, 2020 at 12:32:12PM +0900, Yuya Kusakabe wrote:
> Implement support for transferring XDP meta data into skb for
> virtio_net driver; before calling into the program, xdp.data_meta points
> to xdp.data, where on program return with pass verdict, we call
> into skb_metadata_set().
> 
> Tested with the script at
> https://github.com/higebu/virtio_net-xdp-metadata-test.
> 
> Signed-off-by: Yuya Kusakabe <yuya.kusakabe@gmail.com>
> ---

Acked-by: Michael S. Tsirkin <mst@redhat.com>

>  drivers/net/virtio_net.c | 52 ++++++++++++++++++++++++----------------
>  1 file changed, 32 insertions(+), 20 deletions(-)
> 
> diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
> index f39d0218bdaa..12d115ef5e74 100644
> --- a/drivers/net/virtio_net.c
> +++ b/drivers/net/virtio_net.c
> @@ -371,7 +371,7 @@ static struct sk_buff *page_to_skb(struct virtnet_info *vi,
>  				   struct receive_queue *rq,
>  				   struct page *page, unsigned int offset,
>  				   unsigned int len, unsigned int truesize,
> -				   bool hdr_valid)
> +				   bool hdr_valid, unsigned int metasize)
>  {
>  	struct sk_buff *skb;
>  	struct virtio_net_hdr_mrg_rxbuf *hdr;
> @@ -393,6 +393,7 @@ static struct sk_buff *page_to_skb(struct virtnet_info *vi,
>  	else
>  		hdr_padded_len = sizeof(struct padded_vnet_hdr);
>  
> +	/* hdr_valid means no XDP, so we can copy the vnet header */
>  	if (hdr_valid)
>  		memcpy(hdr, p, hdr_len);
>  
> @@ -405,6 +406,11 @@ static struct sk_buff *page_to_skb(struct virtnet_info *vi,
>  		copy = skb_tailroom(skb);
>  	skb_put_data(skb, p, copy);
>  
> +	if (metasize) {
> +		__skb_pull(skb, metasize);
> +		skb_metadata_set(skb, metasize);
> +	}
> +
>  	len -= copy;
>  	offset += copy;
>  
> @@ -450,10 +456,6 @@ static int __virtnet_xdp_xmit_one(struct virtnet_info *vi,
>  	struct virtio_net_hdr_mrg_rxbuf *hdr;
>  	int err;
>  
> -	/* virtqueue want to use data area in-front of packet */
> -	if (unlikely(xdpf->metasize > 0))
> -		return -EOPNOTSUPP;
> -
>  	if (unlikely(xdpf->headroom < vi->hdr_len))
>  		return -EOVERFLOW;
>  
> @@ -644,6 +646,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 +686,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,6 +698,7 @@ 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++;
> @@ -740,6 +744,9 @@ static struct sk_buff *receive_small(struct net_device *dev,
>  		memcpy(skb_vnet_hdr(skb), buf, vi->hdr_len);
>  	} /* keep zeroed vnet hdr since XDP is loaded */
>  
> +	if (metasize)
> +		skb_metadata_set(skb, metasize);
> +
>  err:
>  	return skb;
>  
> @@ -760,8 +767,8 @@ static struct sk_buff *receive_big(struct net_device *dev,
>  				   struct virtnet_rq_stats *stats)
>  {
>  	struct page *page = buf;
> -	struct sk_buff *skb = page_to_skb(vi, rq, page, 0, len,
> -					  PAGE_SIZE, true);
> +	struct sk_buff *skb =
> +		page_to_skb(vi, rq, page, 0, len, PAGE_SIZE, true, 0);
>  
>  	stats->bytes += len - vi->hdr_len;
>  	if (unlikely(!skb))
> @@ -793,6 +800,7 @@ static struct sk_buff *receive_mergeable(struct net_device *dev,
>  	unsigned int truesize;
>  	unsigned int headroom = mergeable_ctx_to_headroom(ctx);
>  	int err;
> +	unsigned int metasize = 0;
>  
>  	head_skb = NULL;
>  	stats->bytes += len - vi->hdr_len;
> @@ -839,8 +847,8 @@ static struct sk_buff *receive_mergeable(struct net_device *dev,
>  		data = page_address(xdp_page) + offset;
>  		xdp.data_hard_start = data - VIRTIO_XDP_HEADROOM + vi->hdr_len;
>  		xdp.data = data + vi->hdr_len;
> -		xdp_set_data_meta_invalid(&xdp);
>  		xdp.data_end = xdp.data + (len - vi->hdr_len);
> +		xdp.data_meta = xdp.data;
>  		xdp.rxq = &rq->xdp_rxq;
>  
>  		act = bpf_prog_run_xdp(xdp_prog, &xdp);
> @@ -848,24 +856,27 @@ static struct sk_buff *receive_mergeable(struct net_device *dev,
>  
>  		switch (act) {
>  		case XDP_PASS:
> +			metasize = xdp.data - xdp.data_meta;
> +
>  			/* recalculate offset to account for any header
> -			 * adjustments. Note other cases do not build an
> -			 * skb and avoid using offset
> +			 * adjustments and minus the metasize to copy the
> +			 * metadata in page_to_skb(). Note other cases do not
> +			 * build an skb and avoid using offset
>  			 */
> -			offset = xdp.data -
> -					page_address(xdp_page) - vi->hdr_len;
> +			offset = xdp.data - page_address(xdp_page) -
> +				 vi->hdr_len - metasize;
>  
> -			/* recalculate len if xdp.data or xdp.data_end were
> -			 * adjusted
> +			/* recalculate len if xdp.data, xdp.data_end or
> +			 * xdp.data_meta were adjusted
>  			 */
> -			len = xdp.data_end - xdp.data + vi->hdr_len;
> +			len = xdp.data_end - xdp.data + vi->hdr_len + metasize;
>  			/* We can only create skb based on xdp_page. */
>  			if (unlikely(xdp_page != page)) {
>  				rcu_read_unlock();
>  				put_page(page);
> -				head_skb = page_to_skb(vi, rq, xdp_page,
> -						       offset, len,
> -						       PAGE_SIZE, false);
> +				head_skb = page_to_skb(vi, rq, xdp_page, offset,
> +						       len, PAGE_SIZE, false,
> +						       metasize);
>  				return head_skb;
>  			}
>  			break;
> @@ -921,7 +932,8 @@ static struct sk_buff *receive_mergeable(struct net_device *dev,
>  		goto err_skb;
>  	}
>  
> -	head_skb = page_to_skb(vi, rq, page, offset, len, truesize, !xdp_prog);
> +	head_skb = page_to_skb(vi, rq, page, offset, len, truesize, !xdp_prog,
> +			       metasize);
>  	curr_skb = head_skb;
>  
>  	if (unlikely(!curr_skb))
> -- 
> 2.24.1


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH bpf-next v6 0/2] virtio_net: add XDP meta data support
  2020-02-25  3:31 [PATCH bpf-next v6 0/2] virtio_net: add XDP meta data support Yuya Kusakabe
  2020-02-25  3:32 ` [PATCH bpf-next v6 1/2] virtio_net: keep vnet header zeroed if XDP is loaded for small buffer Yuya Kusakabe
@ 2020-02-25 21:59 ` Daniel Borkmann
  1 sibling, 0 replies; 8+ messages in thread
From: Daniel Borkmann @ 2020-02-25 21:59 UTC (permalink / raw)
  To: Yuya Kusakabe, jasowang
  Cc: andriin, ast, bpf, davem, hawk, john.fastabend, kafai, kuba,
	linux-kernel, mst, netdev, songliubraving, yhs

On 2/25/20 4:31 AM, Yuya Kusakabe wrote:
> This patch series has 2 patches.
> 
> Patch 1/2: keep vnet header zeroed if XDP is loaded for small buffer
> With this fix, we do not need to care about vnet header in XDP meta data
> support for small buffer, even though XDP meta data uses in front of
> packet as same as vnet header.
> It would be best if this patch goes into stable.
> This patch is based on the feedback by Jason Wang and Michael S. Tsirkin.
> https://lore.kernel.org/netdev/9a0a1469-c8a7-8223-a4d5-dad656a142fc@redhat.com/
> https://lore.kernel.org/netdev/20200223031314-mutt-send-email-mst@kernel.org/
> 
> Patch 2/2: add XDP meta data support
> 
> Thanks to Jason Wang, Daniel Borkmann and Michael S. Tsirkin for the feedback.
> 
> Yuya Kusakabe (2):
>    virtio_net: keep vnet header zeroed if XDP is loaded for small buffer
>    virtio_net: add XDP meta data support
> 
>   drivers/net/virtio_net.c | 56 ++++++++++++++++++++++++----------------
>   1 file changed, 34 insertions(+), 22 deletions(-)
> 

Applied, thanks!

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2020-02-25 21:59 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-02-25  3:31 [PATCH bpf-next v6 0/2] virtio_net: add XDP meta data support Yuya Kusakabe
2020-02-25  3:32 ` [PATCH bpf-next v6 1/2] virtio_net: keep vnet header zeroed if XDP is loaded for small buffer Yuya Kusakabe
2020-02-25  3:32   ` [PATCH bpf-next v6 2/2] virtio_net: add XDP meta data support Yuya Kusakabe
2020-02-25  5:45     ` Jason Wang
2020-02-25 11:19     ` Michael S. Tsirkin
2020-02-25  5:44   ` [PATCH bpf-next v6 1/2] virtio_net: keep vnet header zeroed if XDP is loaded for small buffer Jason Wang
2020-02-25 11:18   ` Michael S. Tsirkin
2020-02-25 21:59 ` [PATCH bpf-next v6 0/2] virtio_net: add XDP meta data support Daniel Borkmann

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).