Separating the logic of allocating indirect desc and checking queue
status to the upper layer function.

The proposal of this is convenient to refactor virtqueue_add_packed()
for premapped.

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

diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c
index 560ee30d942c..42b1ff87518e 100644
--- a/drivers/virtio/virtio_ring.c
+++ b/drivers/virtio/virtio_ring.c
@@ -1330,25 +1330,14 @@ static int virtqueue_add_indirect_packed(struct 
vring_virtqueue *vq,
                                         unsigned int out_sgs,
                                         unsigned int in_sgs,
                                         void *data,
-                                        gfp_t gfp)
+                                        struct vring_packed_desc *desc)
 {
-       struct vring_packed_desc *desc;
        struct scatterlist *sg;
        unsigned int i, n, err_idx;
        u16 head, id;
        dma_addr_t addr;
 
        head = vq->packed.next_avail_idx;
-       desc = alloc_indirect_packed(total_sg, gfp);
-       if (!desc)
-               return -ENOMEM;
-
-       if (unlikely(vq->vq.num_free < 1)) {
-               pr_debug("Can't add buf len 1 - avail = 0\n");
-               kfree(desc);
-               END_USE(vq);
-               return -ENOSPC;
-       }
 
        i = 0;
        id = vq->free_head;
@@ -1470,11 +1459,17 @@ static inline int virtqueue_add_packed(struct virtqueue 
*_vq,
        BUG_ON(total_sg == 0);
 
        if (virtqueue_use_indirect(vq, total_sg)) {
-               err = virtqueue_add_indirect_packed(vq, sgs, total_sg, out_sgs,
-                                                   in_sgs, data, gfp);
-               if (err != -ENOMEM) {
-                       END_USE(vq);
-                       return err;
+               desc = alloc_indirect_packed(total_sg, gfp);
+               if (desc) {
+                       if (unlikely(vq->vq.num_free < 1)) {
+                               pr_debug("Can't add buf len 1 - avail = 0\n");
+                               kfree(desc);
+                               END_USE(vq);
+                               return -ENOSPC;
+                       }
+
+                       return virtqueue_add_indirect_packed(vq, sgs, total_sg, 
out_sgs,
+                                                            in_sgs, data, 
desc);
                }
 
                /* fall back on direct */
-- 
2.32.0.3.g01195cf9f

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

Reply via email to