virtio_net: split free_unused_bufs()
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>
This commit is contained in:
parent
8597b5ddcb
commit
6e345f8c7c
@ -3168,6 +3168,27 @@ static void free_receive_page_frags(struct virtnet_info *vi)
|
||||
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)
|
||||
{
|
||||
void *buf;
|
||||
@ -3175,26 +3196,14 @@ static void free_unused_bufs(struct virtnet_info *vi)
|
||||
|
||||
for (i = 0; i < vi->max_queue_pairs; i++) {
|
||||
struct virtqueue *vq = vi->sq[i].vq;
|
||||
while ((buf = virtqueue_detach_unused_buf(vq)) != NULL) {
|
||||
if (!is_xdp_frame(buf))
|
||||
dev_kfree_skb(buf);
|
||||
else
|
||||
xdp_return_frame(ptr_to_xdp(buf));
|
||||
}
|
||||
while ((buf = virtqueue_detach_unused_buf(vq)) != NULL)
|
||||
virtnet_sq_free_unused_buf(vq, buf);
|
||||
}
|
||||
|
||||
for (i = 0; i < vi->max_queue_pairs; i++) {
|
||||
struct virtqueue *vq = vi->rq[i].vq;
|
||||
|
||||
while ((buf = virtqueue_detach_unused_buf(vq)) != NULL) {
|
||||
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));
|
||||
}
|
||||
}
|
||||
while ((buf = virtqueue_detach_unused_buf(vq)) != NULL)
|
||||
virtnet_rq_free_unused_buf(vq, buf);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user