qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH v3 1/2] qxl: send interrupt after migration in case ram->int_pending != 0, RHBZ #732949
@ 2011-09-05  5:45 Yonit Halperin
  2011-09-05  5:45 ` [Qemu-devel] [PATCH v3 2/2] qxl: s/qxl_set_irq/qxl_update_irq/ Yonit Halperin
  0 siblings, 1 reply; 2+ messages in thread
From: Yonit Halperin @ 2011-09-05  5:45 UTC (permalink / raw)
  To: qemu-devel; +Cc: Yonit Halperin, kraxel

if qxl_send_events was called from spice server context, and then
migration had completed before a call to pipe_read, the target
guest qxl driver didn't get the interrupt. In addition,
qxl_send_events ignored further interrupts of the same kind, since
ram->int_pending was set. As a result, the guest driver was stacked
or very slow (when the waiting for the interrupt was with timeout).

Signed-off-by: Yonit Halperin <yhalperi@redhat.com>
---
 hw/qxl.c |   10 ++++++++--
 1 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/hw/qxl.c b/hw/qxl.c
index b34bccf..de65a40 100644
--- a/hw/qxl.c
+++ b/hw/qxl.c
@@ -1362,7 +1362,6 @@ static void pipe_read(void *opaque)
     qxl_set_irq(d);
 }
 
-/* called from spice server thread context only */
 static void qxl_send_events(PCIQXLDevice *d, uint32_t events)
 {
     uint32_t old_pending;
@@ -1463,7 +1462,14 @@ static void qxl_vm_change_state_handler(void *opaque, int running, int reason)
     PCIQXLDevice *qxl = opaque;
     qemu_spice_vm_change_state_handler(&qxl->ssd, running, reason);
 
-    if (!running && qxl->mode == QXL_MODE_NATIVE) {
+    if (running) {
+        /*
+         * if qxl_send_events was called from spice server context before
+         * migration ended, qxl_set_irq for these events might not have been
+         * called
+         */
+         qxl_set_irq(qxl);
+    } else if (qxl->mode == QXL_MODE_NATIVE) {
         /* dirty all vram (which holds surfaces) and devram (primary surface)
          * to make sure they are saved */
         /* FIXME #1: should go out during "live" stage */
-- 
1.7.4.4

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

* [Qemu-devel] [PATCH v3 2/2] qxl: s/qxl_set_irq/qxl_update_irq/
  2011-09-05  5:45 [Qemu-devel] [PATCH v3 1/2] qxl: send interrupt after migration in case ram->int_pending != 0, RHBZ #732949 Yonit Halperin
@ 2011-09-05  5:45 ` Yonit Halperin
  0 siblings, 0 replies; 2+ messages in thread
From: Yonit Halperin @ 2011-09-05  5:45 UTC (permalink / raw)
  To: qemu-devel; +Cc: Yonit Halperin, kraxel

Signed-off-by: Yonit Halperin <yhalperi@redhat.com>
---
 hw/qxl.c |   12 ++++++------
 1 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/hw/qxl.c b/hw/qxl.c
index de65a40..f00b5d3 100644
--- a/hw/qxl.c
+++ b/hw/qxl.c
@@ -808,7 +808,7 @@ static void qxl_exit_vga_mode(PCIQXLDevice *d)
     qxl_destroy_primary(d, QXL_SYNC);
 }
 
-static void qxl_set_irq(PCIQXLDevice *d)
+static void qxl_update_irq(PCIQXLDevice *d)
 {
     uint32_t pending = le32_to_cpu(d->ram->int_pending);
     uint32_t mask    = le32_to_cpu(d->ram->int_mask);
@@ -1209,7 +1209,7 @@ async_common:
         qemu_spice_wakeup(&d->ssd);
         break;
     case QXL_IO_UPDATE_IRQ:
-        qxl_set_irq(d);
+        qxl_update_irq(d);
         break;
     case QXL_IO_NOTIFY_OOM:
         if (!SPICE_RING_IS_EMPTY(&d->ram->release_ring)) {
@@ -1359,7 +1359,7 @@ static void pipe_read(void *opaque)
     do {
         len = read(d->pipe[0], &dummy, sizeof(dummy));
     } while (len == sizeof(dummy));
-    qxl_set_irq(d);
+    qxl_update_irq(d);
 }
 
 static void qxl_send_events(PCIQXLDevice *d, uint32_t events)
@@ -1373,7 +1373,7 @@ static void qxl_send_events(PCIQXLDevice *d, uint32_t events)
         return;
     }
     if (pthread_self() == d->main) {
-        qxl_set_irq(d);
+        qxl_update_irq(d);
     } else {
         if (write(d->pipe[1], d, 1) != 1) {
             dprint(d, 1, "%s: write to pipe failed\n", __FUNCTION__);
@@ -1465,10 +1465,10 @@ static void qxl_vm_change_state_handler(void *opaque, int running, int reason)
     if (running) {
         /*
          * if qxl_send_events was called from spice server context before
-         * migration ended, qxl_set_irq for these events might not have been
+         * migration ended, qxl_update_irq for these events might not have been
          * called
          */
-         qxl_set_irq(qxl);
+         qxl_update_irq(qxl);
     } else if (qxl->mode == QXL_MODE_NATIVE) {
         /* dirty all vram (which holds surfaces) and devram (primary surface)
          * to make sure they are saved */
-- 
1.7.4.4

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

end of thread, other threads:[~2011-09-05  5:46 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-09-05  5:45 [Qemu-devel] [PATCH v3 1/2] qxl: send interrupt after migration in case ram->int_pending != 0, RHBZ #732949 Yonit Halperin
2011-09-05  5:45 ` [Qemu-devel] [PATCH v3 2/2] qxl: s/qxl_set_irq/qxl_update_irq/ Yonit Halperin

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).