All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH 0/3] Fix incoming migration regression of QXL in VGA mode
@ 2017-04-06 12:05 Marc-André Lureau
  2017-04-06 12:05 ` [Qemu-devel] [PATCH 1/3] console: add same surface replace pre-condition Marc-André Lureau
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: Marc-André Lureau @ 2017-04-06 12:05 UTC (permalink / raw)
  To: qemu-devel; +Cc: kraxel, dgilbert, Marc-André Lureau

Hi,

Commit cd958edb1fae85d introduced a migration regression in QXL VGA
mode. The last patch fixes it. The first two patches helped me reason
about the related console code.

Marc-André Lureau (3):
  console: add same surface replace pre-condition
  console: add same displaychangelistener registration pre-condition
  qxl: switch display on entering VGA

 hw/display/qxl.c | 1 +
 ui/console.c     | 4 ++++
 2 files changed, 5 insertions(+)

-- 
2.12.0.191.gc5d8de91d

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [Qemu-devel] [PATCH 1/3] console: add same surface replace pre-condition
  2017-04-06 12:05 [Qemu-devel] [PATCH 0/3] Fix incoming migration regression of QXL in VGA mode Marc-André Lureau
@ 2017-04-06 12:05 ` Marc-André Lureau
  2017-04-06 12:05 ` [Qemu-devel] [PATCH 2/3] console: add same displaychangelistener registration pre-condition Marc-André Lureau
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: Marc-André Lureau @ 2017-04-06 12:05 UTC (permalink / raw)
  To: qemu-devel; +Cc: kraxel, dgilbert, Marc-André Lureau

Catch an invalid state early, before a potential use-after-free. This is
mainly useful for documentation purposes.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 ui/console.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/ui/console.c b/ui/console.c
index 419b098c11..0cbe5033dd 100644
--- a/ui/console.c
+++ b/ui/console.c
@@ -1538,6 +1538,8 @@ void dpy_gfx_replace_surface(QemuConsole *con,
     DisplaySurface *old_surface = con->surface;
     DisplayChangeListener *dcl;
 
+    assert(old_surface != surface);
+
     con->surface = surface;
     QLIST_FOREACH(dcl, &s->listeners, next) {
         if (con != (dcl->con ? dcl->con : active_console)) {
-- 
2.12.0.191.gc5d8de91d

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [Qemu-devel] [PATCH 2/3] console: add same displaychangelistener registration pre-condition
  2017-04-06 12:05 [Qemu-devel] [PATCH 0/3] Fix incoming migration regression of QXL in VGA mode Marc-André Lureau
  2017-04-06 12:05 ` [Qemu-devel] [PATCH 1/3] console: add same surface replace pre-condition Marc-André Lureau
@ 2017-04-06 12:05 ` Marc-André Lureau
  2017-04-06 12:05 ` [Qemu-devel] [PATCH 3/3] qxl: switch display on entering VGA Marc-André Lureau
  2017-04-07 10:30 ` [Qemu-devel] [PATCH 0/3] Fix incoming migration regression of QXL in VGA mode Gerd Hoffmann
  3 siblings, 0 replies; 5+ messages in thread
From: Marc-André Lureau @ 2017-04-06 12:05 UTC (permalink / raw)
  To: qemu-devel; +Cc: kraxel, dgilbert, Marc-André Lureau

Catch an invalid state. Mainly useful for documentation purposes.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 ui/console.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/ui/console.c b/ui/console.c
index 0cbe5033dd..189eecfd29 100644
--- a/ui/console.c
+++ b/ui/console.c
@@ -1410,6 +1410,8 @@ void register_displaychangelistener(DisplayChangeListener *dcl)
     static DisplaySurface *dummy;
     QemuConsole *con;
 
+    assert(!dcl->ds);
+
     if (dcl->ops->dpy_gl_ctx_create) {
         /* display has opengl support */
         assert(dcl->con);
-- 
2.12.0.191.gc5d8de91d

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [Qemu-devel] [PATCH 3/3] qxl: switch display on entering VGA
  2017-04-06 12:05 [Qemu-devel] [PATCH 0/3] Fix incoming migration regression of QXL in VGA mode Marc-André Lureau
  2017-04-06 12:05 ` [Qemu-devel] [PATCH 1/3] console: add same surface replace pre-condition Marc-André Lureau
  2017-04-06 12:05 ` [Qemu-devel] [PATCH 2/3] console: add same displaychangelistener registration pre-condition Marc-André Lureau
@ 2017-04-06 12:05 ` Marc-André Lureau
  2017-04-07 10:30 ` [Qemu-devel] [PATCH 0/3] Fix incoming migration regression of QXL in VGA mode Gerd Hoffmann
  3 siblings, 0 replies; 5+ messages in thread
From: Marc-André Lureau @ 2017-04-06 12:05 UTC (permalink / raw)
  To: qemu-devel; +Cc: kraxel, dgilbert, Marc-André Lureau

Since commit cd958edb1fae85d, same size console resize is skipped. This
change broke QXL incoming migration in VGA mode,
qemu_spice_display_switch() is no longer called during qxl_post_load(),
because default message surface is of the same size, and during
displaychangelistener registration, PCIQXLDevice.mode is
QXL_MODE_UNDEFINED. This triggers a later crash on refresh:

==2634== Invalid read of size 4
==3516== at 0x65F3050: pixman_image_get_data (in /usr/lib64/libpixman-1.so.0.34.0)
==3516== by 0x6F0CEB: qemu_spice_create_update (spice-display.c:215)
==3516== by 0x6F1CC7: qemu_spice_display_refresh (spice-display.c:502)
==3516== by 0x58CF77: display_refresh (qxl.c:1948)
==3516== by 0x6E8084: do_safe_dpy_refresh (console.c:1591)
==3516== by 0x6E80D5: dpy_refresh (console.c:1604)
==3516== by 0x6E4508: gui_update (console.c:201)
==3516== by 0x81898E: timerlist_run_timers (qemu-timer.c:536)
==3516== by 0x8189D6: qemu_clock_run_timers (qemu-timer.c:547)
==3516== by 0x818D98: qemu_clock_run_all_timers (qemu-timer.c:662)
==3516== by 0x81952A: main_loop_wait (main-loop.c:514)
==3516== by 0x4ADD29: main_loop (vl.c:1898)

One way to solve this is to explicitely call qemu_spice_display_switch()
on entering VGA mode, which is called during qxl_post_load().

Fixes:
"null pointer access on migration resume of systemrescuecd boot menu with qxl-vga"
https://bugs.launchpad.net/qemu/+bug/1679126
https://bugzilla.redhat.com/show_bug.cgi?id=1438566

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 hw/display/qxl.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/hw/display/qxl.c b/hw/display/qxl.c
index 0d02f0efe6..c31b293bb7 100644
--- a/hw/display/qxl.c
+++ b/hw/display/qxl.c
@@ -1146,6 +1146,7 @@ static void qxl_enter_vga_mode(PCIQXLDevice *d)
     update_displaychangelistener(&d->ssd.dcl, GUI_REFRESH_INTERVAL_DEFAULT);
     qemu_spice_create_host_primary(&d->ssd);
     d->mode = QXL_MODE_VGA;
+    qemu_spice_display_switch(&d->ssd, d->ssd.ds);
     vga_dirty_log_start(&d->vga);
     graphic_hw_update(d->vga.con);
 }
-- 
2.12.0.191.gc5d8de91d

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [Qemu-devel] [PATCH 0/3] Fix incoming migration regression of QXL in VGA mode
  2017-04-06 12:05 [Qemu-devel] [PATCH 0/3] Fix incoming migration regression of QXL in VGA mode Marc-André Lureau
                   ` (2 preceding siblings ...)
  2017-04-06 12:05 ` [Qemu-devel] [PATCH 3/3] qxl: switch display on entering VGA Marc-André Lureau
@ 2017-04-07 10:30 ` Gerd Hoffmann
  3 siblings, 0 replies; 5+ messages in thread
From: Gerd Hoffmann @ 2017-04-07 10:30 UTC (permalink / raw)
  To: Marc-André Lureau; +Cc: qemu-devel, dgilbert

On Do, 2017-04-06 at 14:05 +0200, Marc-André Lureau wrote:
> Hi,
> 
> Commit cd958edb1fae85d introduced a migration regression in QXL VGA
> mode. The last patch fixes it. The first two patches helped me reason
> about the related console code.
> 
> Marc-André Lureau (3):
>   console: add same surface replace pre-condition
>   console: add same displaychangelistener registration pre-condition
>   qxl: switch display on entering VGA
> 
>  hw/display/qxl.c | 1 +
>  ui/console.c     | 4 ++++
>  2 files changed, 5 insertions(+)
> 

Added to vga queue.  Will cherry-pick 3/3 for 2.9

cheers,
  Gerd

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2017-04-07 10:30 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-04-06 12:05 [Qemu-devel] [PATCH 0/3] Fix incoming migration regression of QXL in VGA mode Marc-André Lureau
2017-04-06 12:05 ` [Qemu-devel] [PATCH 1/3] console: add same surface replace pre-condition Marc-André Lureau
2017-04-06 12:05 ` [Qemu-devel] [PATCH 2/3] console: add same displaychangelistener registration pre-condition Marc-André Lureau
2017-04-06 12:05 ` [Qemu-devel] [PATCH 3/3] qxl: switch display on entering VGA Marc-André Lureau
2017-04-07 10:30 ` [Qemu-devel] [PATCH 0/3] Fix incoming migration regression of QXL in VGA mode Gerd Hoffmann

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.