diff options
author | David S. Miller <davem@davemloft.net> | 2018-05-23 13:36:19 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2018-05-23 13:36:19 -0400 |
commit | a43ad59a908055d288e524e559494805a6c7299e (patch) | |
tree | b3483469c110e3f8256b77efc2e66c2a5be1c6c3 | |
parent | 419fc888e5396968620bb8f85beb7ab55293f04f (diff) | |
parent | 3d62b2a0db505bbf9ed0755f254e45d775f9807f (diff) |
Merge branch 'virtio_net-mergeable-XDP'
Jason Wang says:
====================
Fix several issues of virtio-net mergeable XDP
Please review the patches that tries to fix several issues of
virtio-net mergeable XDP.
Changes from V1:
- check against 1 before decreasing instead of resetting to 1
- typoe fixes
====================
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/virtio_net.c | 21 |
1 files changed, 10 insertions, 11 deletions
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index 770422e953f7..032e1ac10a30 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c | |||
@@ -707,6 +707,13 @@ static struct sk_buff *receive_mergeable(struct net_device *dev, | |||
707 | void *data; | 707 | void *data; |
708 | u32 act; | 708 | u32 act; |
709 | 709 | ||
710 | /* Transient failure which in theory could occur if | ||
711 | * in-flight packets from before XDP was enabled reach | ||
712 | * the receive path after XDP is loaded. | ||
713 | */ | ||
714 | if (unlikely(hdr->hdr.gso_type)) | ||
715 | goto err_xdp; | ||
716 | |||
710 | /* This happens when rx buffer size is underestimated | 717 | /* This happens when rx buffer size is underestimated |
711 | * or headroom is not enough because of the buffer | 718 | * or headroom is not enough because of the buffer |
712 | * was refilled before XDP is set. This should only | 719 | * was refilled before XDP is set. This should only |
@@ -727,14 +734,6 @@ static struct sk_buff *receive_mergeable(struct net_device *dev, | |||
727 | xdp_page = page; | 734 | xdp_page = page; |
728 | } | 735 | } |
729 | 736 | ||
730 | /* Transient failure which in theory could occur if | ||
731 | * in-flight packets from before XDP was enabled reach | ||
732 | * the receive path after XDP is loaded. In practice I | ||
733 | * was not able to create this condition. | ||
734 | */ | ||
735 | if (unlikely(hdr->hdr.gso_type)) | ||
736 | goto err_xdp; | ||
737 | |||
738 | /* Allow consuming headroom but reserve enough space to push | 737 | /* Allow consuming headroom but reserve enough space to push |
739 | * the descriptor on if we get an XDP_TX return code. | 738 | * the descriptor on if we get an XDP_TX return code. |
740 | */ | 739 | */ |
@@ -775,7 +774,7 @@ static struct sk_buff *receive_mergeable(struct net_device *dev, | |||
775 | } | 774 | } |
776 | *xdp_xmit = true; | 775 | *xdp_xmit = true; |
777 | if (unlikely(xdp_page != page)) | 776 | if (unlikely(xdp_page != page)) |
778 | goto err_xdp; | 777 | put_page(page); |
779 | rcu_read_unlock(); | 778 | rcu_read_unlock(); |
780 | goto xdp_xmit; | 779 | goto xdp_xmit; |
781 | case XDP_REDIRECT: | 780 | case XDP_REDIRECT: |
@@ -787,7 +786,7 @@ static struct sk_buff *receive_mergeable(struct net_device *dev, | |||
787 | } | 786 | } |
788 | *xdp_xmit = true; | 787 | *xdp_xmit = true; |
789 | if (unlikely(xdp_page != page)) | 788 | if (unlikely(xdp_page != page)) |
790 | goto err_xdp; | 789 | put_page(page); |
791 | rcu_read_unlock(); | 790 | rcu_read_unlock(); |
792 | goto xdp_xmit; | 791 | goto xdp_xmit; |
793 | default: | 792 | default: |
@@ -875,7 +874,7 @@ err_xdp: | |||
875 | rcu_read_unlock(); | 874 | rcu_read_unlock(); |
876 | err_skb: | 875 | err_skb: |
877 | put_page(page); | 876 | put_page(page); |
878 | while (--num_buf) { | 877 | while (num_buf-- > 1) { |
879 | buf = virtqueue_get_buf(rq->vq, &len); | 878 | buf = virtqueue_get_buf(rq->vq, &len); |
880 | if (unlikely(!buf)) { | 879 | if (unlikely(!buf)) { |
881 | pr_debug("%s: rx error: %d buffers missing\n", | 880 | pr_debug("%s: rx error: %d buffers missing\n", |