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@xxxxxxxxxxxxxxxxx> > Acked-by: Michael S. Tsirkin <mst@xxxxxxxxxx> > --- > 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@xxxxxxxxxx> 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: >