[RFC PATCH 16/16] virtio_ring: virtqueue_resize() no longer call recycle() directly
From: Xuan Zhuo
Date: Sat Apr 23 2022 - 22:42:04 EST
virtqueue_resize() no longer calls the recycle callback to release the
buffer. These bufs are reused by virtqueue_resize_* first, and if they
cannot be used, the buffers that cannot be reused will be released
Signed-off-by: Xuan Zhuo <xuanzhuo@xxxxxxxxxxxxxxxxx>
---
drivers/virtio/virtio_ring.c | 12 +++++++-----
1 file changed, 7 insertions(+), 5 deletions(-)
diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c
index 730c8dded4c7..51dab35a54c9 100644
--- a/drivers/virtio/virtio_ring.c
+++ b/drivers/virtio/virtio_ring.c
@@ -2895,7 +2895,6 @@ int virtqueue_resize(struct virtqueue *_vq, u32 num,
struct vring_virtqueue *vq = to_vvq(_vq);
struct virtio_device *vdev = vq->vq.vdev;
bool packed;
- void *buf;
int err;
if (!vq->we_own_ring)
@@ -2922,16 +2921,19 @@ int virtqueue_resize(struct virtqueue *_vq, u32 num,
if (err)
return err;
- while ((buf = virtqueue_detach_unused_buf(_vq)) != NULL)
- recycle(_vq, buf);
-
if (packed)
err = virtqueue_resize_packed(_vq, num, recycle);
else
err = virtqueue_resize_split(_vq, num, recycle);
- if (vdev->config->enable_reset_vq(_vq))
+ if (vdev->config->enable_reset_vq(_vq)) {
return -EBUSY;
+ } else if (!err) {
+ num = packed ? vq->packed.vring.num : vq->split.vring.num;
+
+ if (num != vq->vq.num_free)
+ virtqueue_kick(_vq);
+ }
return err;
}
--
2.31.0