Skip to content

Commit ad48d53

Browse files
fengidrimstsirkin
authored andcommitted
virtio_ring: separate the logic of reset/enable from virtqueue_resize
The subsequent reset function will reuse these logic. Signed-off-by: Xuan Zhuo <[email protected]> Acked-by: Jason Wang <[email protected]> Message-Id: <[email protected]> Signed-off-by: Michael S. Tsirkin <[email protected]>
1 parent 4d09f24 commit ad48d53

File tree

1 file changed

+39
-19
lines changed

1 file changed

+39
-19
lines changed

drivers/virtio/virtio_ring.c

Lines changed: 39 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2152,6 +2152,43 @@ static int virtqueue_resize_packed(struct virtqueue *_vq, u32 num)
21522152
return -ENOMEM;
21532153
}
21542154

2155+
static int virtqueue_disable_and_recycle(struct virtqueue *_vq,
2156+
void (*recycle)(struct virtqueue *vq, void *buf))
2157+
{
2158+
struct vring_virtqueue *vq = to_vvq(_vq);
2159+
struct virtio_device *vdev = vq->vq.vdev;
2160+
void *buf;
2161+
int err;
2162+
2163+
if (!vq->we_own_ring)
2164+
return -EPERM;
2165+
2166+
if (!vdev->config->disable_vq_and_reset)
2167+
return -ENOENT;
2168+
2169+
if (!vdev->config->enable_vq_after_reset)
2170+
return -ENOENT;
2171+
2172+
err = vdev->config->disable_vq_and_reset(_vq);
2173+
if (err)
2174+
return err;
2175+
2176+
while ((buf = virtqueue_detach_unused_buf(_vq)) != NULL)
2177+
recycle(_vq, buf);
2178+
2179+
return 0;
2180+
}
2181+
2182+
static int virtqueue_enable_after_reset(struct virtqueue *_vq)
2183+
{
2184+
struct vring_virtqueue *vq = to_vvq(_vq);
2185+
struct virtio_device *vdev = vq->vq.vdev;
2186+
2187+
if (vdev->config->enable_vq_after_reset(_vq))
2188+
return -EBUSY;
2189+
2190+
return 0;
2191+
}
21552192

21562193
/*
21572194
* Generic functions and exported symbols.
@@ -2702,13 +2739,8 @@ int virtqueue_resize(struct virtqueue *_vq, u32 num,
27022739
void (*recycle)(struct virtqueue *vq, void *buf))
27032740
{
27042741
struct vring_virtqueue *vq = to_vvq(_vq);
2705-
struct virtio_device *vdev = vq->vq.vdev;
2706-
void *buf;
27072742
int err;
27082743

2709-
if (!vq->we_own_ring)
2710-
return -EPERM;
2711-
27122744
if (num > vq->vq.num_max)
27132745
return -E2BIG;
27142746

@@ -2718,28 +2750,16 @@ int virtqueue_resize(struct virtqueue *_vq, u32 num,
27182750
if ((vq->packed_ring ? vq->packed.vring.num : vq->split.vring.num) == num)
27192751
return 0;
27202752

2721-
if (!vdev->config->disable_vq_and_reset)
2722-
return -ENOENT;
2723-
2724-
if (!vdev->config->enable_vq_after_reset)
2725-
return -ENOENT;
2726-
2727-
err = vdev->config->disable_vq_and_reset(_vq);
2753+
err = virtqueue_disable_and_recycle(_vq, recycle);
27282754
if (err)
27292755
return err;
27302756

2731-
while ((buf = virtqueue_detach_unused_buf(_vq)) != NULL)
2732-
recycle(_vq, buf);
2733-
27342757
if (vq->packed_ring)
27352758
err = virtqueue_resize_packed(_vq, num);
27362759
else
27372760
err = virtqueue_resize_split(_vq, num);
27382761

2739-
if (vdev->config->enable_vq_after_reset(_vq))
2740-
return -EBUSY;
2741-
2742-
return err;
2762+
return virtqueue_enable_after_reset(_vq);
27432763
}
27442764
EXPORT_SYMBOL_GPL(virtqueue_resize);
27452765

0 commit comments

Comments
 (0)