Jason Wang
2018-May-21 08:35 UTC
[PATCH net 0/4] Fix several issues of virtio-net mergeable XDP
Hi: Please review the patches that tries to fix sevreal issues of virtio-net mergeable XDP. Thanks Jason Wang (4): virtio-net: correctly redirect linearized packet virtio-net: correctly transmit XDP buff after linearizing virtio-net: reset num_buf to 1 after linearizing packet virito-net: fix leaking page for gso packet during mergeable XDP drivers/net/virtio_net.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) -- 2.7.4
Jason Wang
2018-May-21 08:35 UTC
[PATCH net 1/4] virtio-net: correctly redirect linearized packet
After a linearized packet was redirected by XDP, we should not go for the err path which will try to pop buffers for the next packet and increase the drop counter. Fixing this by just drop the page refcnt for the original page. Fixes: 186b3c998c50 ("virtio-net: support XDP_REDIRECT") Reported-by: David Ahern <dsahern at gmail.com> Tested-by: David Ahern <dsahern at gmail.com> Signed-off-by: Jason Wang <jasowang at redhat.com> --- drivers/net/virtio_net.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index 770422e..c15d240 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c @@ -787,7 +787,7 @@ static struct sk_buff *receive_mergeable(struct net_device *dev, } *xdp_xmit = true; if (unlikely(xdp_page != page)) - goto err_xdp; + put_page(page); rcu_read_unlock(); goto xdp_xmit; default: -- 2.7.4
Jason Wang
2018-May-21 08:35 UTC
[PATCH net 2/4] virtio-net: correctly transmit XDP buff after linearizing
We should not go for the error path after successfully transmitting a XDP buffer after linearizing. Since the error path may try to pop and drop next packet and increase the drop counters. Fixing this by simply drop the refcnt of original page and go for xmit path. Fixes: 72979a6c3590 ("virtio_net: xdp, add slowpath case for non contiguous buffers") Cc: John Fastabend <john.fastabend at gmail.com> Signed-off-by: Jason Wang <jasowang at redhat.com> --- drivers/net/virtio_net.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index c15d240..6260d65 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c @@ -775,7 +775,7 @@ static struct sk_buff *receive_mergeable(struct net_device *dev, } *xdp_xmit = true; if (unlikely(xdp_page != page)) - goto err_xdp; + put_page(page); rcu_read_unlock(); goto xdp_xmit; case XDP_REDIRECT: -- 2.7.4
Jason Wang
2018-May-21 08:35 UTC
[PATCH net 3/4] virtio-net: reset num_buf to 1 after linearizing packet
If we successfully linearize the packets, num_buf were set to zero which was wrong since we now have only 1 buffer to be used for e.g in the error path of receive_mergeable(). Zero num_buf will lead the code try to pop the buffers of next packet and drop it. Fixing this by set num_buf to 1 if we successfully linearize the packet. Fixes: 4941d472bf95 ("virtio-net: do not reset during XDP set") Signed-off-by: Jason Wang <jasowang at redhat.com> --- drivers/net/virtio_net.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index 6260d65..165a922 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c @@ -722,6 +722,7 @@ static struct sk_buff *receive_mergeable(struct net_device *dev, &len); if (!xdp_page) goto err_xdp; + num_buf = 1; offset = VIRTIO_XDP_HEADROOM; } else { xdp_page = page; -- 2.7.4
Jason Wang
2018-May-21 08:35 UTC
[PATCH net 4/4] virito-net: fix leaking page for gso packet during mergeable XDP
We need to drop refcnt to xdp_page if we see a gso packet. Otherwise it will be leaked. Fixing this by moving the check of gso packet above the linearizing logic. Cc: John Fastabend <john.fastabend at gmail.com> Fixes: 72979a6c3590 ("virtio_net: xdp, add slowpath case for non contiguous buffers") Signed-off-by: Jason Wang <jasowang at redhat.com> --- drivers/net/virtio_net.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index 165a922..f8db809 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c @@ -707,6 +707,14 @@ static struct sk_buff *receive_mergeable(struct net_device *dev, void *data; u32 act; + /* Transient failure which in theory could occur if + * in-flight packets from before XDP was enabled reach + * the receive path after XDP is loaded. In practice I + * was not able to create this condition. + */ + if (unlikely(hdr->hdr.gso_type)) + goto err_xdp; + /* This happens when rx buffer size is underestimated * or headroom is not enough because of the buffer * was refilled before XDP is set. This should only @@ -728,14 +736,6 @@ static struct sk_buff *receive_mergeable(struct net_device *dev, xdp_page = page; } - /* Transient failure which in theory could occur if - * in-flight packets from before XDP was enabled reach - * the receive path after XDP is loaded. In practice I - * was not able to create this condition. - */ - if (unlikely(hdr->hdr.gso_type)) - goto err_xdp; - /* Allow consuming headroom but reserve enough space to push * the descriptor on if we get an XDP_TX return code. */ -- 2.7.4
Michael S. Tsirkin
2018-May-21 14:59 UTC
[PATCH net 3/4] virtio-net: reset num_buf to 1 after linearizing packet
On Mon, May 21, 2018 at 04:35:05PM +0800, Jason Wang wrote:> If we successfully linearize the packets, num_buf were set to zero > which was wrong since we now have only 1 buffer to be used for e.g in > the error path of receive_mergeable(). Zero num_buf will lead the code > try to pop the buffers of next packet and drop it. Fixing this by set > num_buf to 1 if we successfully linearize the packet. > > Fixes: 4941d472bf95 ("virtio-net: do not reset during XDP set") > Signed-off-by: Jason Wang <jasowang at redhat.com> > --- > drivers/net/virtio_net.c | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c > index 6260d65..165a922 100644 > --- a/drivers/net/virtio_net.c > +++ b/drivers/net/virtio_net.c > @@ -722,6 +722,7 @@ static struct sk_buff *receive_mergeable(struct net_device *dev, > &len); > if (!xdp_page) > goto err_xdp; > + num_buf = 1;So this is tweaked here for the benefit of err_skb below. That's confusing and we won't remember to change it if we change the error handling. How about fixing the error path? - while (--num_buf) { + while (num_buf-- > 1) { Seems more robust to me.> offset = VIRTIO_XDP_HEADROOM; > } else { > xdp_page = page; > -- > 2.7.4
Michael S. Tsirkin
2018-May-21 15:01 UTC
[PATCH net 4/4] virito-net: fix leaking page for gso packet during mergeable XDP
On Mon, May 21, 2018 at 04:35:06PM +0800, Jason Wang wrote:> We need to drop refcnt to xdp_page if we see a gso packet. Otherwise > it will be leaked. Fixing this by moving the check of gso packet above > the linearizing logic. > > Cc: John Fastabend <john.fastabend at gmail.com> > Fixes: 72979a6c3590 ("virtio_net: xdp, add slowpath case for non contiguous buffers") > Signed-off-by: Jason Wang <jasowang at redhat.com>typo in subject> --- > drivers/net/virtio_net.c | 16 ++++++++-------- > 1 file changed, 8 insertions(+), 8 deletions(-) > > diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c > index 165a922..f8db809 100644 > --- a/drivers/net/virtio_net.c > +++ b/drivers/net/virtio_net.c > @@ -707,6 +707,14 @@ static struct sk_buff *receive_mergeable(struct net_device *dev, > void *data; > u32 act; > > + /* Transient failure which in theory could occur if > + * in-flight packets from before XDP was enabled reach > + * the receive path after XDP is loaded. In practice I > + * was not able to create this condition.BTW we should probably drop the last sentence. It says in theory, should be enough.> + */ > + if (unlikely(hdr->hdr.gso_type)) > + goto err_xdp; > + > /* This happens when rx buffer size is underestimated > * or headroom is not enough because of the buffer > * was refilled before XDP is set. This should only > @@ -728,14 +736,6 @@ static struct sk_buff *receive_mergeable(struct net_device *dev, > xdp_page = page; > } > > - /* Transient failure which in theory could occur if > - * in-flight packets from before XDP was enabled reach > - * the receive path after XDP is loaded. In practice I > - * was not able to create this condition. > - */ > - if (unlikely(hdr->hdr.gso_type)) > - goto err_xdp; > - > /* Allow consuming headroom but reserve enough space to push > * the descriptor on if we get an XDP_TX return code. > */ > -- > 2.7.4
Michael S. Tsirkin
2018-May-21 15:03 UTC
[PATCH net 1/4] virtio-net: correctly redirect linearized packet
On Mon, May 21, 2018 at 04:35:03PM +0800, Jason Wang wrote:> After a linearized packet was redirected by XDP, we should not go for > the err path which will try to pop buffers for the next packet and > increase the drop counter. Fixing this by just drop the page refcnt > for the original page. > > Fixes: 186b3c998c50 ("virtio-net: support XDP_REDIRECT") > Reported-by: David Ahern <dsahern at gmail.com> > Tested-by: David Ahern <dsahern at gmail.com> > Signed-off-by: Jason Wang <jasowang at redhat.com>Acked-by: Michael S. Tsirkin <mst at redhat.com>> --- > drivers/net/virtio_net.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c > index 770422e..c15d240 100644 > --- a/drivers/net/virtio_net.c > +++ b/drivers/net/virtio_net.c > @@ -787,7 +787,7 @@ static struct sk_buff *receive_mergeable(struct net_device *dev, > } > *xdp_xmit = true; > if (unlikely(xdp_page != page)) > - goto err_xdp; > + put_page(page); > rcu_read_unlock(); > goto xdp_xmit; > default: > -- > 2.7.4
Michael S. Tsirkin
2018-May-21 15:03 UTC
[PATCH net 2/4] virtio-net: correctly transmit XDP buff after linearizing
On Mon, May 21, 2018 at 04:35:04PM +0800, Jason Wang wrote:> We should not go for the error path after successfully transmitting a > XDP buffer after linearizing. Since the error path may try to pop and > drop next packet and increase the drop counters. Fixing this by simply > drop the refcnt of original page and go for xmit path. > > Fixes: 72979a6c3590 ("virtio_net: xdp, add slowpath case for non contiguous buffers") > Cc: John Fastabend <john.fastabend at gmail.com> > Signed-off-by: Jason Wang <jasowang at redhat.com>Acked-by: Michael S. Tsirkin <mst at redhat.com>> --- > drivers/net/virtio_net.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c > index c15d240..6260d65 100644 > --- a/drivers/net/virtio_net.c > +++ b/drivers/net/virtio_net.c > @@ -775,7 +775,7 @@ static struct sk_buff *receive_mergeable(struct net_device *dev, > } > *xdp_xmit = true; > if (unlikely(xdp_page != page)) > - goto err_xdp; > + put_page(page); > rcu_read_unlock(); > goto xdp_xmit; > case XDP_REDIRECT: > -- > 2.7.4
Michael S. Tsirkin
2018-May-21 15:04 UTC
[PATCH net 0/4] Fix several issues of virtio-net mergeable XDP
On Mon, May 21, 2018 at 04:35:02PM +0800, Jason Wang wrote:> Hi: > > Please review the patches that tries to fix sevreal issues of > virtio-net mergeable XDP. > > ThanksI think we should do 3/4 differently. The rest looks good, and probably needed on stable. Thanks!> Jason Wang (4): > virtio-net: correctly redirect linearized packet > virtio-net: correctly transmit XDP buff after linearizing > virtio-net: reset num_buf to 1 after linearizing packet > virito-net: fix leaking page for gso packet during mergeable XDP > > drivers/net/virtio_net.c | 21 +++++++++++---------- > 1 file changed, 11 insertions(+), 10 deletions(-) > > -- > 2.7.4