virtio_net: split free_unused_bufs()
[ Upstream commit6e345f8c7c
] This patch separates two functions for freeing sq buf and rq buf from free_unused_bufs(). When supporting the enable/disable tx/rq queue in the future, it is necessary to support separate recovery of a sq buf or a rq buf. Signed-off-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com> Acked-by: Jason Wang <jasowang@redhat.com> Message-Id: <20220801063902.129329-40-xuanzhuo@linux.alibaba.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com> Stable-dep-of:f8bb510439
("virtio_net: suppress cpu stall when free_unused_bufs") Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
0773270b13
commit
c043714ef2
@ -2747,6 +2747,27 @@ static void free_receive_page_frags(struct virtnet_info *vi)
|
|||||||
put_page(vi->rq[i].alloc_frag.page);
|
put_page(vi->rq[i].alloc_frag.page);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void virtnet_sq_free_unused_buf(struct virtqueue *vq, void *buf)
|
||||||
|
{
|
||||||
|
if (!is_xdp_frame(buf))
|
||||||
|
dev_kfree_skb(buf);
|
||||||
|
else
|
||||||
|
xdp_return_frame(ptr_to_xdp(buf));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void virtnet_rq_free_unused_buf(struct virtqueue *vq, void *buf)
|
||||||
|
{
|
||||||
|
struct virtnet_info *vi = vq->vdev->priv;
|
||||||
|
int i = vq2rxq(vq);
|
||||||
|
|
||||||
|
if (vi->mergeable_rx_bufs)
|
||||||
|
put_page(virt_to_head_page(buf));
|
||||||
|
else if (vi->big_packets)
|
||||||
|
give_pages(&vi->rq[i], buf);
|
||||||
|
else
|
||||||
|
put_page(virt_to_head_page(buf));
|
||||||
|
}
|
||||||
|
|
||||||
static void free_unused_bufs(struct virtnet_info *vi)
|
static void free_unused_bufs(struct virtnet_info *vi)
|
||||||
{
|
{
|
||||||
void *buf;
|
void *buf;
|
||||||
@ -2754,26 +2775,14 @@ static void free_unused_bufs(struct virtnet_info *vi)
|
|||||||
|
|
||||||
for (i = 0; i < vi->max_queue_pairs; i++) {
|
for (i = 0; i < vi->max_queue_pairs; i++) {
|
||||||
struct virtqueue *vq = vi->sq[i].vq;
|
struct virtqueue *vq = vi->sq[i].vq;
|
||||||
while ((buf = virtqueue_detach_unused_buf(vq)) != NULL) {
|
while ((buf = virtqueue_detach_unused_buf(vq)) != NULL)
|
||||||
if (!is_xdp_frame(buf))
|
virtnet_sq_free_unused_buf(vq, buf);
|
||||||
dev_kfree_skb(buf);
|
|
||||||
else
|
|
||||||
xdp_return_frame(ptr_to_xdp(buf));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < vi->max_queue_pairs; i++) {
|
for (i = 0; i < vi->max_queue_pairs; i++) {
|
||||||
struct virtqueue *vq = vi->rq[i].vq;
|
struct virtqueue *vq = vi->rq[i].vq;
|
||||||
|
while ((buf = virtqueue_detach_unused_buf(vq)) != NULL)
|
||||||
while ((buf = virtqueue_detach_unused_buf(vq)) != NULL) {
|
virtnet_rq_free_unused_buf(vq, buf);
|
||||||
if (vi->mergeable_rx_bufs) {
|
|
||||||
put_page(virt_to_head_page(buf));
|
|
||||||
} else if (vi->big_packets) {
|
|
||||||
give_pages(&vi->rq[i], buf);
|
|
||||||
} else {
|
|
||||||
put_page(virt_to_head_page(buf));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user