Extract vq's initialization function __vring_init_virtqueue() from
__vring_new_virtqueue()

Signed-off-by: Xuan Zhuo <[email protected]>
---
 drivers/virtio/virtio_ring.c | 61 +++++++++++++++++++++++++-----------
 1 file changed, 42 insertions(+), 19 deletions(-)

diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c
index b6434e36c447..4e1d345b0557 100644
--- a/drivers/virtio/virtio_ring.c
+++ b/drivers/virtio/virtio_ring.c
@@ -2167,23 +2167,17 @@ irqreturn_t vring_interrupt(int irq, void *_vq)
 EXPORT_SYMBOL_GPL(vring_interrupt);
 
 /* Only available for split ring */
-struct virtqueue *__vring_new_virtqueue(unsigned int index,
-                                       struct vring vring,
-                                       struct virtio_device *vdev,
-                                       bool weak_barriers,
-                                       bool context,
-                                       bool (*notify)(struct virtqueue *),
-                                       void (*callback)(struct virtqueue *),
-                                       const char *name)
+static int __vring_init_virtqueue(struct virtqueue *_vq,
+                                 unsigned int index,
+                                 struct vring vring,
+                                 struct virtio_device *vdev,
+                                 bool weak_barriers,
+                                 bool context,
+                                 bool (*notify)(struct virtqueue *),
+                                 void (*callback)(struct virtqueue *),
+                                 const char *name)
 {
-       struct vring_virtqueue *vq;
-
-       if (virtio_has_feature(vdev, VIRTIO_F_RING_PACKED))
-               return NULL;
-
-       vq = kmalloc(sizeof(*vq), GFP_KERNEL);
-       if (!vq)
-               return NULL;
+       struct vring_virtqueue *vq = to_vvq(_vq);
 
        vq->packed_ring = false;
        vq->vq.callback = callback;
@@ -2243,13 +2237,42 @@ struct virtqueue *__vring_new_virtqueue(unsigned int 
index,
        spin_lock(&vdev->vqs_list_lock);
        list_add_tail(&vq->vq.list, &vdev->vqs);
        spin_unlock(&vdev->vqs_list_lock);
-       return &vq->vq;
+       return 0;
 
 err_extra:
        kfree(vq->split.desc_state);
 err_state:
-       kfree(vq);
-       return NULL;
+       return -ENOMEM;
+}
+
+struct virtqueue *__vring_new_virtqueue(unsigned int index,
+                                       struct vring vring,
+                                       struct virtio_device *vdev,
+                                       bool weak_barriers,
+                                       bool context,
+                                       bool (*notify)(struct virtqueue *),
+                                       void (*callback)(struct virtqueue *),
+                                       const char *name)
+{
+       struct vring_virtqueue *vq;
+       int err;
+
+       if (virtio_has_feature(vdev, VIRTIO_F_RING_PACKED))
+               return NULL;
+
+       vq = kmalloc(sizeof(*vq), GFP_KERNEL);
+       if (!vq)
+               return NULL;
+
+       err = __vring_init_virtqueue(&vq->vq, index, vring, vdev, weak_barriers,
+                                    context, notify, callback, name);
+
+       if (err) {
+               kfree(vq);
+               return NULL;
+       }
+
+       return &vq->vq;
 }
 EXPORT_SYMBOL_GPL(__vring_new_virtqueue);
 
-- 
2.31.0

_______________________________________________
Virtualization mailing list
[email protected]
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

Reply via email to