From: "Michael S. Tsirkin" <mst@redhat.com>
To: John Levon <john.levon@nutanix.com>
Cc: Jason Wang <jasowang@redhat.com>,
"qemu-devel@nongnu.org" <qemu-devel@nongnu.org>,
Peter Xu <peterx@redhat.com>,
Markus Armbruster <armbru@redhat.com>,
Stefan Hajnoczi <stefanha@redhat.com>,
Felipe Franciosi <felipe@nutanix.com>,
Paolo Bonzini <pbonzini@redhat.com>
Subject: Re: [PATCH] virtio: reset device on bad guest index in virtio_load()
Date: Wed, 2 Dec 2020 04:50:15 -0500 [thread overview]
Message-ID: <20201202044937-mutt-send-email-mst@kernel.org> (raw)
In-Reply-To: <20201120185103.GA442386@sent>
On Fri, Nov 20, 2020 at 06:51:07PM +0000, John Levon wrote:
>
> If we find a queue with an inconsistent guest index value, explicitly mark the
> device as needing a reset - and broken - via virtio_error().
>
> There's at least one driver implementation - the virtio-win NetKVM driver - that
> is able to handle a VIRTIO_CONFIG_S_NEEDS_RESET notification and successfully
> restore the device to a working state. Other implementations do not correctly
> handle this, but as the VQ is not in a functional state anyway, this is still
> worth doing.
>
> Signed-off-by: John Levon <john.levon@nutanix.com>
I tagged this for after the release. pls ping me after the release
to help make sure it does not get lost.
> ---
> hw/virtio/virtio.c | 15 +++++++++------
> 1 file changed, 9 insertions(+), 6 deletions(-)
>
> diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c
> index ceb58fda6c..eff35fab7c 100644
> --- a/hw/virtio/virtio.c
> +++ b/hw/virtio/virtio.c
> @@ -3161,12 +3161,15 @@ int virtio_load(VirtIODevice *vdev, QEMUFile *f, int version_id)
> nheads = vring_avail_idx(&vdev->vq[i]) - vdev->vq[i].last_avail_idx;
> /* Check it isn't doing strange things with descriptor numbers. */
> if (nheads > vdev->vq[i].vring.num) {
> - qemu_log_mask(LOG_GUEST_ERROR,
> - "VQ %d size 0x%x Guest index 0x%x "
> - "inconsistent with Host index 0x%x: delta 0x%x",
> - i, vdev->vq[i].vring.num,
> - vring_avail_idx(&vdev->vq[i]),
> - vdev->vq[i].last_avail_idx, nheads);
> + virtio_error(vdev, "VQ %d size 0x%x Guest index 0x%x "
> + "inconsistent with Host index 0x%x: delta 0x%x",
> + i, vdev->vq[i].vring.num,
> + vring_avail_idx(&vdev->vq[i]),
> + vdev->vq[i].last_avail_idx, nheads);
> + vdev->vq[i].used_idx = 0;
> + vdev->vq[i].shadow_avail_idx = 0;
> + vdev->vq[i].inuse = 0;
> + continue;
> }
> vdev->vq[i].used_idx = vring_used_idx(&vdev->vq[i]);
> vdev->vq[i].shadow_avail_idx = vring_avail_idx(&vdev->vq[i]);
> --
> 2.22.3
>
next prev parent reply other threads:[~2020-12-02 10:47 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-11-20 18:51 [PATCH] virtio: reset device on bad guest index in virtio_load() John Levon
2020-11-30 15:51 ` John Levon
2020-11-30 15:52 ` Michael S. Tsirkin
2020-12-02 9:50 ` Michael S. Tsirkin [this message]
-- strict thread matches above, loose matches on Subject: below --
2020-11-20 17:47 John Levon
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=20201202044937-mutt-send-email-mst@kernel.org \
--to=mst@redhat.com \
--cc=armbru@redhat.com \
--cc=felipe@nutanix.com \
--cc=jasowang@redhat.com \
--cc=john.levon@nutanix.com \
--cc=pbonzini@redhat.com \
--cc=peterx@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@redhat.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 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.