Thread (5 messages) flat view 5 messages, 3 authors, 2021-09-27

Re: [PATCH] virtio_ring: check desc == NULL when packed and indirect

From: Jason Wang <hidden>
Date: 2021-09-27 03:43:40

On Mon, Sep 27, 2021 at 11:29 AM Xuan Zhuo [off-list ref] wrote:
On Mon, 27 Sep 2021 11:20:16 +0800, Jason Wang [off-list ref] wrote:
quoted
On Mon, Sep 27, 2021 at 11:06 AM Xuan Zhuo [off-list ref] wrote:
quoted
In the case of packed, use indirect desc, since desc is allocated by
kmalloc_array(), we should check whether its return value is NULL.

Fixes: 1ce9e6055fa ("virtio_ring: introduce packed ring support")
Signed-off-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com>
---
 drivers/virtio/virtio_ring.c | 27 ++++++++++++++++-----------
 1 file changed, 16 insertions(+), 11 deletions(-)
diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c
index dd95dfd85e98..7dd381eae725 100644
--- a/drivers/virtio/virtio_ring.c
+++ b/drivers/virtio/virtio_ring.c
@@ -1050,21 +1050,20 @@ static struct vring_packed_desc *alloc_indirect_packed(unsigned int total_sg,
 }

 static int virtqueue_add_indirect_packed(struct vring_virtqueue *vq,
-                                      struct scatterlist *sgs[],
-                                      unsigned int total_sg,
-                                      unsigned int out_sgs,
-                                      unsigned int in_sgs,
-                                      void *data,
-                                      gfp_t gfp)
+                                        struct scatterlist *sgs[],
+                                        struct vring_packed_desc *desc,
+                                        unsigned int total_sg,
+                                        unsigned int out_sgs,
+                                        unsigned int in_sgs,
+                                        void *data,
+                                        gfp_t gfp)
It looks to me the style changes are mixed with bug fix here.

I will make a separate patch for the next version.
Please make it a patch on top of the fix to ease the backport.
quoted
quoted
 {
-       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 (unlikely(vq->vq.num_free < 1)) {
                pr_debug("Can't add buf len 1 - avail = 0\n");
@@ -1191,9 +1190,15 @@ static inline int virtqueue_add_packed(struct virtqueue *_vq,

        BUG_ON(total_sg == 0);

-       if (virtqueue_use_indirect(_vq, total_sg))
-               return virtqueue_add_indirect_packed(vq, sgs, total_sg,
-                               out_sgs, in_sgs, data, gfp);
+       if (virtqueue_use_indirect(_vq, total_sg)) {
+               desc = alloc_indirect_packed(total_sg, gfp);
+               if (desc) {
+                       return virtqueue_add_indirect_packed(vq, sgs, desc,
+                                                            total_sg,
+                                                            out_sgs, in_sgs,
+                                                            data, gfp);
+               }
+       }
Any reason that we can't fix virtqueue_add_indirect_packed()? It can
help to reduce the changeset and ease the backport.
The purpose of this is to fall back to not using indirect when
alloc_indirect_packed returns NULL.

If we check the return value of alloc_indirect_packed() in
virtqueue_add_indirect_packed(), then MUST check the error returned by
virtqueue_add_indirect_packed() to determine whether to fall back to the mode
that does not use indirect.
Right, this aligns the behaviour of the split path. But please
describe this in the commit log.

Thanks
Thanks.
quoted
Thanks
quoted
        head = vq->packed.next_avail_idx;
        avail_used_flags = vq->packed.avail_used_flags;
--
2.31.0
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help