From: "Michael S. Tsirkin" <mst@redhat.com>
To: "Marc-André Lureau" <marcandre.lureau@redhat.com>
Cc: qemu-devel@nongnu.org, berrange@redhat.com, kraxel@redhat.com,
stefanb@linux.vnet.ibm.com
Subject: Re: [Qemu-devel] [PATCH] virtio-gpu: fix crashes upon warm reboot with vga mode
Date: Tue, 7 Aug 2018 00:16:23 +0300 [thread overview]
Message-ID: <20180807001146-mutt-send-email-mst@kernel.org> (raw)
In-Reply-To: <20180803153235.4134-1-marcandre.lureau@redhat.com>
On Fri, Aug 03, 2018 at 05:32:35PM +0200, Marc-André Lureau wrote:
> With vga=775 on the Linux command line a first boot of the VM running
> Linux works fine. After a warm reboot it crashes during Linux boot.
>
> Before that, valgrind points out bad memory write to console
> surface. The VGA code is not aware that virtio-gpu got a message
> surface scanout when the display is disabled. Let's reset VGA graphic
> mode when it is the case, so that a new display surface is created
> when doing further VGA operations.
>
> https://bugs.launchpad.net/qemu/+bug/1784900/
>
> Reported-by: Stefan Berger <stefanb@linux.vnet.ibm.com>
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
> include/hw/virtio/virtio-gpu.h | 1 +
> hw/display/virtio-gpu.c | 5 +++++
> hw/display/virtio-vga.c | 11 +++++++++++
> 3 files changed, 17 insertions(+)
>
> diff --git a/include/hw/virtio/virtio-gpu.h b/include/hw/virtio/virtio-gpu.h
> index 9780f755ef..d0321672f4 100644
> --- a/include/hw/virtio/virtio-gpu.h
> +++ b/include/hw/virtio/virtio-gpu.h
> @@ -125,6 +125,7 @@ typedef struct VirtIOGPU {
> uint32_t bytes_3d;
> } stats;
>
> + void (*disable_scanout)(struct VirtIOGPU *g, int scanout_id);
> Error *migration_blocker;
> } VirtIOGPU;
>
> diff --git a/hw/display/virtio-gpu.c b/hw/display/virtio-gpu.c
> index ec366f4c35..3ddd29c0de 100644
> --- a/hw/display/virtio-gpu.c
> +++ b/hw/display/virtio-gpu.c
> @@ -421,6 +421,11 @@ static void virtio_gpu_disable_scanout(VirtIOGPU *g, int scanout_id)
> scanout->height ?: 480,
> "Guest disabled display.");
> }
> +
> + if (g->disable_scanout) {
> + g->disable_scanout(g, scanout_id);
> + }
> +
> dpy_gfx_replace_surface(scanout->con, ds);
> scanout->resource_id = 0;
> scanout->ds = NULL;
> diff --git a/hw/display/virtio-vga.c b/hw/display/virtio-vga.c
> index 2b36f2899a..672b7f9ce2 100644
> --- a/hw/display/virtio-vga.c
> +++ b/hw/display/virtio-vga.c
> @@ -75,6 +75,16 @@ static void virtio_vga_gl_block(void *opaque, bool block)
> }
> }
>
> +static void virtio_vga_disable_scanout(VirtIOGPU *g, int scanout_id)
> +{
> + VirtIOVGA *vvga = container_of(g, VirtIOVGA, vdev);
> +
> + if (scanout_id == 0) {
> + /* reset surface if needed */
> + vvga->vga.graphic_mode = -1;
> + }
> +}
> +
> static const GraphicHwOps virtio_vga_ops = {
> .invalidate = virtio_vga_invalidate_display,
> .gfx_update = virtio_vga_update_display,
Would it make sense to add
vga_disable_scanout() to hw/display/vga_int.h and
poke at graphic_mode there?
I'll leave the decision to you.
> @@ -156,6 +166,7 @@ static void virtio_vga_realize(VirtIOPCIProxy *vpci_dev, Error **errp)
> vvga->vga_mrs, true);
>
> vga->con = g->scanout[0].con;
> + g->disable_scanout = virtio_vga_disable_scanout;
> graphic_console_set_hwops(vga->con, &virtio_vga_ops, vvga);
>
> for (i = 0; i < g->conf.max_outputs; i++) {
While I really know very little about vga, it seems
like that's the standard way to force full update so
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
--
MST
next prev parent reply other threads:[~2018-08-06 21:16 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-08-03 15:32 [Qemu-devel] [PATCH] virtio-gpu: fix crashes upon warm reboot with vga mode Marc-André Lureau
2018-08-03 16:48 ` Stefan Berger
2018-08-06 13:39 ` Peter Maydell
2018-08-06 13:47 ` Marc-André Lureau
2018-08-06 16:55 ` Peter Maydell
2018-08-06 21:16 ` Michael S. Tsirkin [this message]
2018-08-06 22:43 ` Marc-André Lureau
2018-08-07 12:55 ` Gerd Hoffmann
2018-08-07 13:02 ` Marc-André Lureau
2018-08-07 13:41 ` Gerd Hoffmann
2018-08-07 15:07 ` Peter Maydell
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=20180807001146-mutt-send-email-mst@kernel.org \
--to=mst@redhat.com \
--cc=berrange@redhat.com \
--cc=kraxel@redhat.com \
--cc=marcandre.lureau@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=stefanb@linux.vnet.ibm.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.