Message ID | 20230315015223.89137-3-xuanzhuo@linux.alibaba.com (mailing list archive) |
---|---|
State | Accepted |
Commit | 1a3bd6eabae35afc5c6dbe2651f21467cf8ad3fd |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | virtio_net: fix two bugs related to XDP | expand |
Context | Check | Description |
---|---|---|
netdev/series_format | success | Posting correctly formatted |
netdev/tree_selection | success | Clearly marked for net |
netdev/fixes_present | success | Fixes tag present in non-next series |
netdev/header_inline | success | No static functions without inline keyword in header files |
netdev/build_32bit | success | Errors and warnings before: 18 this patch: 18 |
netdev/cc_maintainers | success | CCed 15 of 15 maintainers |
netdev/build_clang | success | Errors and warnings before: 18 this patch: 18 |
netdev/verify_signedoff | success | Signed-off-by tag matches author and committer |
netdev/deprecated_api | success | None detected |
netdev/check_selftest | success | No net selftest shell script |
netdev/verify_fixes | success | Fixes tag looks correct |
netdev/build_allmodconfig_warn | success | Errors and warnings before: 18 this patch: 18 |
netdev/checkpatch | warning | WARNING: line length of 92 exceeds 80 columns |
netdev/kdoc | success | Errors and warnings before: 0 this patch: 0 |
netdev/source_inline | success | Was 0 now: 0 |
On 2023/3/15 9:52, Xuan Zhuo wrote: > build_skb_from_xdp_buff() may return NULL, in this case > we need to free the frags of xdp shinfo. > > Fixes: fab89bafa95b ("virtio-net: support multi-buffer xdp") > Signed-off-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com> > Acked-by: Michael S. Tsirkin <mst@redhat.com> > --- > drivers/net/virtio_net.c | 5 ++++- > 1 file changed, 4 insertions(+), 1 deletion(-) > > diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c > index 8ecf7a341d54..2396c28c0122 100644 > --- a/drivers/net/virtio_net.c > +++ b/drivers/net/virtio_net.c > @@ -1273,9 +1273,12 @@ static struct sk_buff *receive_mergeable(struct net_device *dev, > > switch (act) { > case XDP_PASS: > + head_skb = build_skb_from_xdp_buff(dev, vi, &xdp, xdp_frags_truesz); > + if (unlikely(!head_skb)) > + goto err_xdp_frags; LGTM. Reviewed-by: Yunsheng Lin <linyunsheng@huawei.com> Note, "stats->drops++; dev_kfree_skb(head_skb);" is also done for the above case, I assume it is ok as other "goto err_xdp_frags" case also do that. > + > if (unlikely(xdp_page != page)) > put_page(page); > - head_skb = build_skb_from_xdp_buff(dev, vi, &xdp, xdp_frags_truesz); > rcu_read_unlock(); > return head_skb; > case XDP_TX: >
On Wed, 15 Mar 2023 10:14:34 +0800, Yunsheng Lin <linyunsheng@huawei.com> wrote: > On 2023/3/15 9:52, Xuan Zhuo wrote: > > build_skb_from_xdp_buff() may return NULL, in this case > > we need to free the frags of xdp shinfo. > > > > Fixes: fab89bafa95b ("virtio-net: support multi-buffer xdp") > > Signed-off-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com> > > Acked-by: Michael S. Tsirkin <mst@redhat.com> > > --- > > drivers/net/virtio_net.c | 5 ++++- > > 1 file changed, 4 insertions(+), 1 deletion(-) > > > > diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c > > index 8ecf7a341d54..2396c28c0122 100644 > > --- a/drivers/net/virtio_net.c > > +++ b/drivers/net/virtio_net.c > > @@ -1273,9 +1273,12 @@ static struct sk_buff *receive_mergeable(struct net_device *dev, > > > > switch (act) { > > case XDP_PASS: > > + head_skb = build_skb_from_xdp_buff(dev, vi, &xdp, xdp_frags_truesz); > > + if (unlikely(!head_skb)) > > + goto err_xdp_frags; > > LGTM. > Reviewed-by: Yunsheng Lin <linyunsheng@huawei.com> > > Note, "stats->drops++; dev_kfree_skb(head_skb);" is also done for the above case, > I assume it is ok as other "goto err_xdp_frags" case also do that. Yes. It's ok. Thanks. > > > + > > if (unlikely(xdp_page != page)) > > put_page(page); > > - head_skb = build_skb_from_xdp_buff(dev, vi, &xdp, xdp_frags_truesz); > > rcu_read_unlock(); > > return head_skb; > > case XDP_TX: > >
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index 8ecf7a341d54..2396c28c0122 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c @@ -1273,9 +1273,12 @@ static struct sk_buff *receive_mergeable(struct net_device *dev, switch (act) { case XDP_PASS: + head_skb = build_skb_from_xdp_buff(dev, vi, &xdp, xdp_frags_truesz); + if (unlikely(!head_skb)) + goto err_xdp_frags; + if (unlikely(xdp_page != page)) put_page(page); - head_skb = build_skb_from_xdp_buff(dev, vi, &xdp, xdp_frags_truesz); rcu_read_unlock(); return head_skb; case XDP_TX: