All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Michael S. Tsirkin" <mst@redhat.com>
To: Jason Wang <jasowang@redhat.com>
Cc: Tiwei Bie <tiwei.bie@intel.com>,
	Junichi Uekawa <uekawa@chromium.org>,
	LKML <linux-kernel@vger.kernel.org>,
	virtualization@lists.linux-foundation.org,
	Yuan Yao <yuanyaogoog@chromium.org>,
	Takaya Saeki <takayas@chromium.org>,
	Xuan Zhuo <xuanzhuo@linux.alibaba.com>,
	"David S. Miller" <davem@davemloft.net>
Subject: Re: [PATCH] virtio_ring: fix avail_wrap_counter in virtqueue_add_packed
Date: Tue, 8 Aug 2023 01:59:43 -0400	[thread overview]
Message-ID: <20230808015921-mutt-send-email-mst@kernel.org> (raw)
In-Reply-To: <CACGkMEt53ziY_bmgJHVdJ6pkppTyVqKX3=Czygv+yhJR8_KiFA@mail.gmail.com>

On Tue, Aug 08, 2023 at 01:43:02PM +0800, Jason Wang wrote:
> On Tue, Aug 8, 2023 at 1:11 PM Yuan Yao <yuanyaogoog@chromium.org> wrote:
> >
> > In current packed virtqueue implementation, the avail_wrap_counter won't
> > flip, in the case when the driver supplies a descriptor chain with a
> > length equals to the queue size; total_sg == vq->packed.vring.num.
> >
> > Let’s assume the following situation:
> > vq->packed.vring.num=4
> > vq->packed.next_avail_idx: 1
> > vq->packed.avail_wrap_counter: 0
> >
> > Then the driver adds a descriptor chain containing 4 descriptors.
> >
> > We expect the following result with avail_wrap_counter flipped:
> > vq->packed.next_avail_idx: 1
> > vq->packed.avail_wrap_counter: 1
> >
> > But, the current implementation gives the following result:
> > vq->packed.next_avail_idx: 1
> > vq->packed.avail_wrap_counter: 0
> >
> > To reproduce the bug, you can set a packed queue size as small as
> > possible, so that the driver is more likely to provide a descriptor
> > chain with a length equal to the packed queue size. For example, in
> > qemu run following commands:
> > sudo qemu-system-x86_64 \
> > -enable-kvm \
> > -nographic \
> > -kernel "path/to/kernel_image" \
> > -m 1G \
> > -drive file="path/to/rootfs",if=none,id=disk \
> > -device virtio-blk,drive=disk \
> > -drive file="path/to/disk_image",if=none,id=rwdisk \
> > -device virtio-blk,drive=rwdisk,packed=on,queue-size=4,\
> > indirect_desc=off \
> > -append "console=ttyS0 root=/dev/vda rw init=/bin/bash"
> >
> > Inside the VM, create a directory and mount the rwdisk device on it. The
> > rwdisk will hang and mount operation will not complete.
> >
> > This commit fixes the wrap counter error by flipping the
> > packed.avail_wrap_counter, when start of descriptor chain equals to the
> > end of descriptor chain (head == i).
> >
> > Fixes: 1ce9e6055fa0 ("virtio_ring: introduce packed ring support")
> > Signed-off-by: Yuan Yao <yuanyaogoog@chromium.org>
> > ---
> >
> >  drivers/virtio/virtio_ring.c | 2 +-
> >  1 file changed, 1 insertion(+), 1 deletion(-)
> >
> > diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c
> > index c5310eaf8b46..da1150d127c2 100644
> > --- a/drivers/virtio/virtio_ring.c
> > +++ b/drivers/virtio/virtio_ring.c
> > @@ -1461,7 +1461,7 @@ static inline int virtqueue_add_packed(struct virtqueue *_vq,
> >                 }
> >         }
> >
> > -       if (i < head)
> > +       if (i <= head)
> >                 vq->packed.avail_wrap_counter ^= 1;
> 
> Would it be better to move the flipping to the place where we flip
> avail_used_flags?

I think I prefer this patch for stable, refactoring can
be done on top.

>                         if ((unlikely(++i >= vq->packed.vring.num))) {
>                                 i = 0;
>                                 vq->packed.avail_used_flags ^=
>                                         1 << VRING_PACKED_DESC_F_AVAIL |
>                                         1 << VRING_PACKED_DESC_F_USED;
>                         }
> 
> Thanks
> 
> >
> >         /* We're using some buffers from the free list. */
> > --
> > 2.41.0.640.ga95def55d0-goog
> >

_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

WARNING: multiple messages have this Message-ID (diff)
From: "Michael S. Tsirkin" <mst@redhat.com>
To: Jason Wang <jasowang@redhat.com>
Cc: Yuan Yao <yuanyaogoog@chromium.org>,
	LKML <linux-kernel@vger.kernel.org>,
	Keiichi Watanabe <keiichiw@chromium.org>,
	Daniel Verkamp <dverkamp@chromium.org>,
	Takaya Saeki <takayas@chromium.org>,
	Junichi Uekawa <uekawa@chromium.org>,
	"David S. Miller" <davem@davemloft.net>,
	Tiwei Bie <tiwei.bie@intel.com>,
	Xuan Zhuo <xuanzhuo@linux.alibaba.com>,
	virtualization@lists.linux-foundation.org
Subject: Re: [PATCH] virtio_ring: fix avail_wrap_counter in virtqueue_add_packed
Date: Tue, 8 Aug 2023 01:59:43 -0400	[thread overview]
Message-ID: <20230808015921-mutt-send-email-mst@kernel.org> (raw)
In-Reply-To: <CACGkMEt53ziY_bmgJHVdJ6pkppTyVqKX3=Czygv+yhJR8_KiFA@mail.gmail.com>

On Tue, Aug 08, 2023 at 01:43:02PM +0800, Jason Wang wrote:
> On Tue, Aug 8, 2023 at 1:11 PM Yuan Yao <yuanyaogoog@chromium.org> wrote:
> >
> > In current packed virtqueue implementation, the avail_wrap_counter won't
> > flip, in the case when the driver supplies a descriptor chain with a
> > length equals to the queue size; total_sg == vq->packed.vring.num.
> >
> > Let’s assume the following situation:
> > vq->packed.vring.num=4
> > vq->packed.next_avail_idx: 1
> > vq->packed.avail_wrap_counter: 0
> >
> > Then the driver adds a descriptor chain containing 4 descriptors.
> >
> > We expect the following result with avail_wrap_counter flipped:
> > vq->packed.next_avail_idx: 1
> > vq->packed.avail_wrap_counter: 1
> >
> > But, the current implementation gives the following result:
> > vq->packed.next_avail_idx: 1
> > vq->packed.avail_wrap_counter: 0
> >
> > To reproduce the bug, you can set a packed queue size as small as
> > possible, so that the driver is more likely to provide a descriptor
> > chain with a length equal to the packed queue size. For example, in
> > qemu run following commands:
> > sudo qemu-system-x86_64 \
> > -enable-kvm \
> > -nographic \
> > -kernel "path/to/kernel_image" \
> > -m 1G \
> > -drive file="path/to/rootfs",if=none,id=disk \
> > -device virtio-blk,drive=disk \
> > -drive file="path/to/disk_image",if=none,id=rwdisk \
> > -device virtio-blk,drive=rwdisk,packed=on,queue-size=4,\
> > indirect_desc=off \
> > -append "console=ttyS0 root=/dev/vda rw init=/bin/bash"
> >
> > Inside the VM, create a directory and mount the rwdisk device on it. The
> > rwdisk will hang and mount operation will not complete.
> >
> > This commit fixes the wrap counter error by flipping the
> > packed.avail_wrap_counter, when start of descriptor chain equals to the
> > end of descriptor chain (head == i).
> >
> > Fixes: 1ce9e6055fa0 ("virtio_ring: introduce packed ring support")
> > Signed-off-by: Yuan Yao <yuanyaogoog@chromium.org>
> > ---
> >
> >  drivers/virtio/virtio_ring.c | 2 +-
> >  1 file changed, 1 insertion(+), 1 deletion(-)
> >
> > diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c
> > index c5310eaf8b46..da1150d127c2 100644
> > --- a/drivers/virtio/virtio_ring.c
> > +++ b/drivers/virtio/virtio_ring.c
> > @@ -1461,7 +1461,7 @@ static inline int virtqueue_add_packed(struct virtqueue *_vq,
> >                 }
> >         }
> >
> > -       if (i < head)
> > +       if (i <= head)
> >                 vq->packed.avail_wrap_counter ^= 1;
> 
> Would it be better to move the flipping to the place where we flip
> avail_used_flags?

I think I prefer this patch for stable, refactoring can
be done on top.

>                         if ((unlikely(++i >= vq->packed.vring.num))) {
>                                 i = 0;
>                                 vq->packed.avail_used_flags ^=
>                                         1 << VRING_PACKED_DESC_F_AVAIL |
>                                         1 << VRING_PACKED_DESC_F_USED;
>                         }
> 
> Thanks
> 
> >
> >         /* We're using some buffers from the free list. */
> > --
> > 2.41.0.640.ga95def55d0-goog
> >


  reply	other threads:[~2023-08-08  5:59 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-08-08  5:10 [PATCH] virtio_ring: fix avail_wrap_counter in virtqueue_add_packed Yuan Yao
2023-08-08  5:43 ` Jason Wang
2023-08-08  5:43   ` Jason Wang
2023-08-08  5:59   ` Michael S. Tsirkin [this message]
2023-08-08  5:59     ` Michael S. Tsirkin
2023-08-08  6:05     ` Jason Wang
2023-08-08  6:05       ` Jason Wang
     [not found]   ` <CAOJyEHaXqmHStJnHrT0H4QsTJBxjBxVe+33EuWm9H3wApPKtxQ@mail.gmail.com>
2023-08-08  6:05     ` Jason Wang
2023-08-08  6:05       ` Jason Wang
     [not found]       ` <CAOJyEHaR1Y3VsKNpLqxf-ewAEf8JJDChjmnFM_0mv=hOg+X-vA@mail.gmail.com>
2023-08-08  9:13         ` Michael S. Tsirkin
2023-08-08  9:13           ` Michael S. Tsirkin
     [not found]           ` <CAOJyEHYgvw7za0ksKNPu9TF1+8MwVFbctMbukgbAoQnf9da+hA@mail.gmail.com>
     [not found]             ` <CAOJyEHZs=59nZ=XTYu-mZWTz18OT7f6TknCxWksYeQZbPy2oUQ@mail.gmail.com>
2023-08-28  4:43               ` Michael S. Tsirkin
2023-08-28  4:43                 ` Michael S. Tsirkin
  -- strict thread matches above, loose matches on Subject: below --
2023-08-08  8:32 Yuan Yao
     [not found] ` <CAOJyEHb_KjPawwH+U30iJCDjB-VqH_FR-4qAsUk9T6Sn8FZMBQ@mail.gmail.com>
2023-08-10 19:19   ` Michael S. Tsirkin
2023-08-10 19:19     ` Michael S. Tsirkin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20230808015921-mutt-send-email-mst@kernel.org \
    --to=mst@redhat.com \
    --cc=davem@davemloft.net \
    --cc=jasowang@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=takayas@chromium.org \
    --cc=tiwei.bie@intel.com \
    --cc=uekawa@chromium.org \
    --cc=virtualization@lists.linux-foundation.org \
    --cc=xuanzhuo@linux.alibaba.com \
    --cc=yuanyaogoog@chromium.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.