From: Jason Wang <jasowang@redhat.com>
To: Kangjie Xu <kangjie.xu@linux.alibaba.com>
Cc: "Michael S. Tsirkin" <mst@redhat.com>,
qemu-devel <qemu-devel@nongnu.org>,
"Marcel Apfelbaum" <marcel.apfelbaum@gmail.com>,
"Philippe Mathieu-Daudé" <f4bug@amsat.org>,
"Eduardo Habkost" <eduardo@habkost.net>,
wangyanan55@huawei.com, "Heng Qi" <hengqi@linux.alibaba.com>,
"Xuan Zhuo" <xuanzhuo@linux.alibaba.com>
Subject: Re: [PATCH v2 07/24] virtio-pci: support queue enable
Date: Thu, 25 Aug 2022 10:52:09 +0800 [thread overview]
Message-ID: <CACGkMEvrzc2asJfWVynh=Y=6mjrGLG5EOTDhfrDWV69SX7Yb1g@mail.gmail.com> (raw)
In-Reply-To: <a5cb0b2d-1a76-86eb-acd7-6421a5f6d3eb@linux.alibaba.com>
On Wed, Aug 24, 2022 at 7:27 PM Kangjie Xu <kangjie.xu@linux.alibaba.com> wrote:
>
>
> 在 2022/8/24 16:59, Jason Wang 写道:
>
>
> 在 2022/8/23 16:20, Kangjie Xu 写道:
>
>
> 在 2022/8/23 15:44, Jason Wang 写道:
>
>
> 在 2022/8/16 09:06, Kangjie Xu 写道:
>
> PCI devices support vq enable.
>
>
>
> Nit: it might be "support device specific vq enable"
>
>
> Get it.
>
>
> Based on this function, the driver can re-enable the virtqueue after the
> virtqueue is reset.
>
> Signed-off-by: Kangjie Xu <kangjie.xu@linux.alibaba.com>
> Signed-off-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com>
> ---
> hw/virtio/virtio-pci.c | 1 +
> 1 file changed, 1 insertion(+)
>
> diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c
> index ec8e92052f..3d560e45ad 100644
> --- a/hw/virtio/virtio-pci.c
> +++ b/hw/virtio/virtio-pci.c
> @@ -1335,6 +1335,7 @@ static void virtio_pci_common_write(void *opaque, hwaddr addr,
> proxy->vqs[vdev->queue_sel].avail[0],
> ((uint64_t)proxy->vqs[vdev->queue_sel].used[1]) << 32 |
> proxy->vqs[vdev->queue_sel].used[0]);
> + virtio_queue_enable(vdev, vdev->queue_sel);
> proxy->vqs[vdev->queue_sel].enabled = 1;
> proxy->vqs[vdev->queue_sel].reset = 0;
>
>
>
> Any reason we do it before the assignment of 1? It probably means the device specific method can't depend on virtio_queue_enabled()?
>
> Thanks
>
> Sorry, I don't get why device specific method can't depend on virtio_queue_enabled().
>
>
>
> I meant if the device specific method call virtio_queue_enabled() it will return false in this case, is this intended?
>
> Yes, I intend it to behave in this way.
>
>
>
> Before virtio_queue_enable() is done, virtqueue should always be not ready and disabled.
>
> Otherwise, If we put it after the assignment of enabled to 1, the virtqueue may be accessed illegally and may cause panic, because the virtqueue is still being intialized and being configured.
>
>
>
> How? Shouldn't we make transport ready before making device virtqueue(device) ready?
>
> Thanks
>
> I am not experienced in this field, could you tell me why we should make the transport ready first?
That's a must for the device to work.
E.g for PCI device, I can't image the device is ready to work before
PCI is ready.
>
> I make the transport ready later than making device ready for two aspects:
>
> 1. In QEMU, the virtio_queue_enabled() is used only when we start the device/queue pair (vhost_dev_start_one), or reading VIRTIO_PCI_COMMON_Q_ENABLE. These two operations and resetting the queue will be synchronized using iothread lock, so we do not need to worry about the case currently.
Note that virtio_queue_enabled() is an exported helper, you can't
assume how it will be used in the future.
>
> 2. Suppose we use virtio_queue_enabled() or access the enabled status asynchronously, and we make the transport ready first.
>
> After enabled set to true, and before virtio_queue_enable() is finished, somewhere that call virtio_queue_enabled() or access the enabled status of VirtIOPCIQueue. Then the caller will consider the virtqueue as enabled(enabled = true in VirtIOPCIQueue). The caller might access the virtqueue(access avail ring / desc table). But I think the access here is illegal because the virtqueue might still be unintialized status.
>
How can this happen, won't we call device specific method after we set
queue_enabled as true? It's the charge of the device specific method
to synchronize the necessary external I/O in this case.
Thanks
> Thus, from my perspective, to prevent illegal access, we need to make transport ready after virtio_queue_enable().
>
> Thanks
>
>
>
> Thanks
>
>
> } else {
>
>
next prev parent reply other threads:[~2022-08-25 2:54 UTC|newest]
Thread overview: 77+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-08-16 1:06 [PATCH 00/24] Support VIRTIO_F_RING_RESET for virtio-net, vhost-user, vhost-kernel in virtio pci-modern Kangjie Xu
2022-08-16 1:06 ` [PATCH v2 01/24] virtio: sync relevant definitions with linux Kangjie Xu
2022-08-16 1:06 ` [PATCH v2 02/24] virtio: introduce __virtio_queue_reset() Kangjie Xu
2022-08-23 7:31 ` Jason Wang
2022-08-16 1:06 ` [PATCH v2 03/24] virtio: introduce virtio_queue_reset() Kangjie Xu
2022-08-23 7:32 ` Jason Wang
2022-08-16 1:06 ` [PATCH v2 04/24] virtio: introduce virtio_queue_enable() Kangjie Xu
2022-08-23 7:37 ` Jason Wang
2022-08-16 1:06 ` [PATCH v2 05/24] virtio: core: vq reset feature negotation support Kangjie Xu
2022-08-23 7:34 ` Jason Wang
2022-08-23 7:42 ` Kangjie Xu
2022-08-16 1:06 ` [PATCH v2 06/24] virtio-pci: support queue reset Kangjie Xu
2022-08-23 7:40 ` Jason Wang
2022-08-23 7:52 ` Kangjie Xu
2022-08-24 8:56 ` Jason Wang
2022-08-16 1:06 ` [PATCH v2 07/24] virtio-pci: support queue enable Kangjie Xu
2022-08-23 7:44 ` Jason Wang
2022-08-23 8:20 ` Kangjie Xu
2022-08-24 8:59 ` Jason Wang
2022-08-24 11:27 ` Kangjie Xu
2022-08-25 2:52 ` Jason Wang [this message]
2022-08-25 3:38 ` Kangjie Xu
2022-08-16 1:06 ` [PATCH v2 08/24] vhost: extract the logic of unmapping the vrings and desc Kangjie Xu
2022-08-23 7:45 ` Jason Wang
2022-08-16 1:06 ` [PATCH v2 09/24] vhost: introduce vhost_dev_virtqueue_stop() Kangjie Xu
2022-08-23 7:52 ` Jason Wang
2022-08-23 8:03 ` Kangjie Xu
2022-08-24 2:40 ` Jason Wang
2022-08-16 1:06 ` [PATCH v2 10/24] vhost: introduce vhost_dev_virtqueue_restart() Kangjie Xu
2022-08-24 2:37 ` Jason Wang
2022-08-24 2:44 ` Kangjie Xu
2022-08-16 1:06 ` [PATCH v2 11/24] vhost-net: vhost-kernel: introduce vhost_net_virtqueue_stop() Kangjie Xu
2022-08-24 2:40 ` Jason Wang
2022-08-24 2:46 ` Kangjie Xu
2022-08-24 3:33 ` Kangjie Xu
2022-08-24 9:00 ` Jason Wang
2022-08-16 1:06 ` [PATCH v2 12/24] vhost-net: vhost-kernel: introduce vhost_net_virtqueue_restart() Kangjie Xu
2022-08-24 2:44 ` Jason Wang
2022-08-24 2:53 ` Kangjie Xu
2022-08-24 9:01 ` Jason Wang
2022-08-24 9:03 ` Kangjie Xu
2022-08-16 1:06 ` [PATCH v2 13/24] docs: vhost-user: add VHOST_USER_RESET_VRING message Kangjie Xu
2022-08-24 2:46 ` Jason Wang
2022-08-16 1:06 ` [PATCH v2 14/24] vhost-user: introduce vhost_reset_vring() interface Kangjie Xu
2022-08-24 2:50 ` Jason Wang
2022-08-24 3:03 ` Kangjie Xu
2022-08-16 1:06 ` [PATCH v2 15/24] vhost-user: add op to enable or disable a single vring Kangjie Xu
2022-08-24 2:53 ` Jason Wang
2022-08-24 3:09 ` Kangjie Xu
2022-08-24 9:02 ` Jason Wang
2022-08-24 9:09 ` Kangjie Xu
2022-08-16 1:06 ` [PATCH v2 16/24] vhost: vhost-user: update vhost_dev_virtqueue_stop() Kangjie Xu
2022-08-24 3:56 ` Jason Wang
2022-08-24 4:59 ` Kangjie Xu
2022-08-16 1:06 ` [PATCH v2 17/24] vhost: vhost-user: update vhost_dev_virtqueue_restart() Kangjie Xu
2022-08-24 4:03 ` Jason Wang
2022-08-24 5:04 ` Kangjie Xu
2022-08-16 1:06 ` [PATCH v2 18/24] vhost-net: vhost-user: update vhost_net_virtqueue_stop() Kangjie Xu
2022-08-24 4:05 ` Jason Wang
2022-08-24 4:57 ` Kangjie Xu
2022-08-24 9:04 ` Jason Wang
2022-08-24 9:18 ` Kangjie Xu
2022-08-16 1:06 ` [PATCH v2 19/24] vhost-net: vhost-user: update vhost_net_virtqueue_restart() Kangjie Xu
2022-08-24 4:06 ` Jason Wang
2022-08-16 1:06 ` [PATCH v2 20/24] virtio-net: introduce flush_or_purge_queued_packets() Kangjie Xu
2022-08-16 1:06 ` [PATCH v2 21/24] virtio-net: support queue reset Kangjie Xu
2022-08-16 1:06 ` [PATCH v2 22/24] virtio-net: support queue_enable Kangjie Xu
2022-08-16 1:06 ` [PATCH v2 23/24] vhost: vhost-kernel: enable vq reset feature Kangjie Xu
2022-08-16 1:06 ` [PATCH v2 24/24] vhost: vhost-user: " Kangjie Xu
2022-08-16 6:14 ` [PATCH 00/24] Support VIRTIO_F_RING_RESET for virtio-net, vhost-user, vhost-kernel in virtio pci-modern Michael S. Tsirkin
2022-08-16 6:15 ` Xuan Zhuo
2022-08-16 6:22 ` Michael S. Tsirkin
2022-08-16 6:40 ` Xuan Zhuo
2022-08-17 6:46 ` Kangjie Xu
2022-08-23 1:49 ` Kangjie Xu
2022-08-24 4:10 ` Jason Wang
2022-08-24 4:11 ` Jason Wang
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='CACGkMEvrzc2asJfWVynh=Y=6mjrGLG5EOTDhfrDWV69SX7Yb1g@mail.gmail.com' \
--to=jasowang@redhat.com \
--cc=eduardo@habkost.net \
--cc=f4bug@amsat.org \
--cc=hengqi@linux.alibaba.com \
--cc=kangjie.xu@linux.alibaba.com \
--cc=marcel.apfelbaum@gmail.com \
--cc=mst@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=wangyanan55@huawei.com \
--cc=xuanzhuo@linux.alibaba.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).