[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20220424024044.94749-17-xuanzhuo@linux.alibaba.com>
Date: Sun, 24 Apr 2022 10:40:44 +0800
From: Xuan Zhuo <xuanzhuo@...ux.alibaba.com>
To: linux-kernel@...r.kernel.org
Cc: "Michael S. Tsirkin" <mst@...hat.com>,
Jason Wang <jasowang@...hat.com>,
virtualization@...ts.linux-foundation.org
Subject: [RFC PATCH 16/16] virtio_ring: virtqueue_resize() no longer call recycle() directly
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@...ux.alibaba.com>
---
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
Powered by blists - more mailing lists