Since this will be called in other circumstances(freeze), we must check whether it is xsk's buffer in this function. It cannot be judged outside this function. Signed-off-by: Xuan Zhuo <xuanzhuo@xxxxxxxxxxxxxxxxx> --- drivers/net/virtio/main.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/drivers/net/virtio/main.c b/drivers/net/virtio/main.c index ced9a37f706b..43249c78484a 100644 --- a/drivers/net/virtio/main.c +++ b/drivers/net/virtio/main.c @@ -3296,8 +3296,21 @@ static void virtnet_sq_free_unused_buf(struct virtqueue *vq, void *buf) void virtnet_rq_free_unused_buf(struct virtqueue *vq, void *buf) { struct virtnet_info *vi = vq->vdev->priv; + struct xsk_buff_pool *pool; int i = vq2rxq(vq); + rcu_read_lock(); + pool = rcu_dereference(vi->rq[i].xsk.pool); + if (pool) { + struct xdp_buff *xdp; + + xdp = (struct xdp_buff *)buf; + xsk_buff_free(xdp); + rcu_read_unlock(); + return; + } + rcu_read_unlock(); + if (vi->mergeable_rx_bufs) put_page(virt_to_head_page(buf)); else if (vi->big_packets) -- 2.32.0.3.g01195cf9f