qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCHv3] qxl S3&S4 (suspend and hibernate) support
@ 2011-06-29 11:57 Alon Levy
  2011-06-29 11:57 ` [Qemu-devel] [PATCHv3] async io: suggested fixes Alon Levy
                   ` (14 more replies)
  0 siblings, 15 replies; 38+ messages in thread
From: Alon Levy @ 2011-06-29 11:57 UTC (permalink / raw)
  To: qemu-devel; +Cc: yhalperi, kraxel

Based on Gerd's tree:
 git://anongit.freedesktop.org/spice/qemu bz700134^
 (i.e. without the last patch for latency measurement marked [debug])

Changes from v2:
 1: patch uses V10 instead of 3.
 2: handle EAGAIN/EINTR
 3: fixes a deadlock because of usage of wlock for surface tracking.
 4..end-2: The same as v2, but drop patch introducing primary_created.
 end-1: Instead of adding a new primary_created tracking driver state, just
  change to UNDEFINED when doing DESTROY_ALL_SURFACES.
 end: allow io in UNDEFINED
  

Alon Levy (14):
  async io: suggested fixes
  async thread fix - handle EAGAIN/EINTR, remove fprintf
  qxl: use track_lock instead of wlock for guest_surfaces
  qxl: add mode to debugprint on destroy primary
  qxl: allow QXL_IO_LOG also in vga
  qxl: abort on panic instead of exit
  qxl-logger: add timestamp to command log
  qxl: update and add debug prints
  qxl: add dev id to guest prints
  qxl: add io_port_to_string
  qxl: update revision to QXL_REVISION_STABLE_V10
  qxl: add QXL_IO_FLUSH_{SURFACES,RELEASE} for guest S3&S4 support
  qxl: move to UNDEFINED on DESTROY_ALL_SURFACES{,_ASYNC}
  qxl: only disallow specific io's in vga mode

 hw/qxl-logger.c |    4 +-
 hw/qxl.c        |  143 +++++++++++++++++++++++++++++++++++++++++++++++--------
 hw/qxl.h        |    4 +-
 3 files changed, 129 insertions(+), 22 deletions(-)

-- 
1.7.5.4

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

* [Qemu-devel] [PATCHv3] async io: suggested fixes
  2011-06-29 11:57 [Qemu-devel] [PATCHv3] qxl S3&S4 (suspend and hibernate) support Alon Levy
@ 2011-06-29 11:57 ` Alon Levy
  2011-06-29 11:57 ` [Qemu-devel] [PATCHv3] async thread fix - handle EAGAIN/EINTR, remove fprintf Alon Levy
                   ` (13 subsequent siblings)
  14 siblings, 0 replies; 38+ messages in thread
From: Alon Levy @ 2011-06-29 11:57 UTC (permalink / raw)
  To: qemu-devel; +Cc: yhalperi, kraxel

---
 hw/qxl.c |    5 +++--
 1 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/hw/qxl.c b/hw/qxl.c
index a26fb2a..89e452e 100644
--- a/hw/qxl.c
+++ b/hw/qxl.c
@@ -1178,6 +1178,7 @@ static void ioport_write(void *opaque, uint32_t addr, uint32_t val)
     case QXL_IO_MEMSLOT_ADD_ASYNC:
         PANIC_ON(val >= NUM_MEMSLOTS);
         PANIC_ON(d->guest_slots[val].active);
+        dprint(d, 1, "QXL_IO_MEMSLOT_ADD_ASYNC %d\n", val);
         d->guest_slots[val].slot = d->ram->mem_slot;
         async = qemu_mallocz(sizeof(*async));
         qxl_add_memslot(d, val, 0, &async->memslot);
@@ -1715,7 +1716,7 @@ static PCIDeviceInfo qxl_info_primary = {
     .qdev.props = (Property[]) {
         DEFINE_PROP_UINT32("ram_size", PCIQXLDevice, vga.vram_size, 64 * 1024 * 1024),
         DEFINE_PROP_UINT32("vram_size", PCIQXLDevice, vram_size, 64 * 1024 * 1024),
-        DEFINE_PROP_UINT32("revision", PCIQXLDevice, revision, 3),
+        DEFINE_PROP_UINT32("revision", PCIQXLDevice, revision, QXL_REVISION_STABLE_V10),
         DEFINE_PROP_UINT32("debug", PCIQXLDevice, debug, 0),
         DEFINE_PROP_UINT32("guestdebug", PCIQXLDevice, guestdebug, 0),
         DEFINE_PROP_UINT32("cmdlog", PCIQXLDevice, cmdlog, 0),
@@ -1735,7 +1736,7 @@ static PCIDeviceInfo qxl_info_secondary = {
     .qdev.props = (Property[]) {
         DEFINE_PROP_UINT32("ram_size", PCIQXLDevice, vga.vram_size, 64 * 1024 * 1024),
         DEFINE_PROP_UINT32("vram_size", PCIQXLDevice, vram_size, 64 * 1024 * 1024),
-        DEFINE_PROP_UINT32("revision", PCIQXLDevice, revision, 3),
+        DEFINE_PROP_UINT32("revision", PCIQXLDevice, revision, QXL_REVISION_STABLE_V10),
         DEFINE_PROP_UINT32("debug", PCIQXLDevice, debug, 0),
         DEFINE_PROP_UINT32("guestdebug", PCIQXLDevice, guestdebug, 0),
         DEFINE_PROP_UINT32("cmdlog", PCIQXLDevice, cmdlog, 0),
-- 
1.7.5.4

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

* [Qemu-devel] [PATCHv3] async thread fix - handle EAGAIN/EINTR, remove fprintf
  2011-06-29 11:57 [Qemu-devel] [PATCHv3] qxl S3&S4 (suspend and hibernate) support Alon Levy
  2011-06-29 11:57 ` [Qemu-devel] [PATCHv3] async io: suggested fixes Alon Levy
@ 2011-06-29 11:57 ` Alon Levy
  2011-06-29 11:57 ` [Qemu-devel] [PATCHv3] qxl: use track_lock instead of wlock for guest_surfaces Alon Levy
                   ` (12 subsequent siblings)
  14 siblings, 0 replies; 38+ messages in thread
From: Alon Levy @ 2011-06-29 11:57 UTC (permalink / raw)
  To: qemu-devel; +Cc: yhalperi, kraxel

---
 hw/qxl.c |    4 +++-
 1 files changed, 3 insertions(+), 1 deletions(-)

diff --git a/hw/qxl.c b/hw/qxl.c
index 89e452e..3f84b0c 100644
--- a/hw/qxl.c
+++ b/hw/qxl.c
@@ -1025,13 +1025,15 @@ static void *ioport_write_async(void *arg)
 
     while (true) {
         ret = read(d->aio_pipe[0], &io, sizeof(io));
+        if (ret < 0 && (errno == EAGAIN || errno == EINTR)) {
+            continue;
+        }
         if (ret != sizeof(io)) {
             break;
         }
         io_port = io->port;
         val = io->val;
 
-        fprintf(stderr, "%s: 0x%x\n", __FUNCTION__, io_port);
         switch (io_port) {
         case QXL_IO_UPDATE_AREA_ASYNC:
             qxl_spice_update_area(d, io->update_surface,
-- 
1.7.5.4

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

* [Qemu-devel] [PATCHv3] qxl: use track_lock instead of wlock for guest_surfaces
  2011-06-29 11:57 [Qemu-devel] [PATCHv3] qxl S3&S4 (suspend and hibernate) support Alon Levy
  2011-06-29 11:57 ` [Qemu-devel] [PATCHv3] async io: suggested fixes Alon Levy
  2011-06-29 11:57 ` [Qemu-devel] [PATCHv3] async thread fix - handle EAGAIN/EINTR, remove fprintf Alon Levy
@ 2011-06-29 11:57 ` Alon Levy
  2011-06-29 11:57 ` [Qemu-devel] [PATCHv3] qxl: add mode to debugprint on destroy primary Alon Levy
                   ` (11 subsequent siblings)
  14 siblings, 0 replies; 38+ messages in thread
From: Alon Levy @ 2011-06-29 11:57 UTC (permalink / raw)
  To: qemu-devel; +Cc: yhalperi, kraxel

---
 hw/qxl.c |    7 +++++--
 hw/qxl.h |    2 ++
 2 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/hw/qxl.c b/hw/qxl.c
index 3f84b0c..49d7b10 100644
--- a/hw/qxl.c
+++ b/hw/qxl.c
@@ -150,10 +150,12 @@ void qxl_spice_update_area(PCIQXLDevice *qxl, uint32_t surface_id,
 void qxl_spice_destroy_surface_wait(PCIQXLDevice *qxl, uint32_t id)
 {
     qemu_mutex_lock(&qxl->ssd.wlock);
+    qemu_mutex_lock(&qxl->track_lock);
     PANIC_ON(id >= NUM_SURFACES);
     qxl->ssd.worker->destroy_surface_wait(qxl->ssd.worker, id);
     qxl->guest_surfaces.cmds[id] = 0;
     qxl->guest_surfaces.count--;
+    qemu_mutex_unlock(&qxl->track_lock);
     qemu_mutex_unlock(&qxl->ssd.wlock);
 }
 
@@ -348,7 +350,7 @@ static void qxl_track_command(PCIQXLDevice *qxl, struct QXLCommandExt *ext)
         QXLSurfaceCmd *cmd = qxl_phys2virt(qxl, ext->cmd.data, ext->group_id);
         uint32_t id = le32_to_cpu(cmd->surface_id);
         PANIC_ON(id >= NUM_SURFACES);
-        qemu_mutex_lock(&qxl->ssd.wlock);
+        qemu_mutex_lock(&qxl->track_lock);
         if (cmd->type == QXL_SURFACE_CMD_CREATE) {
             qxl->guest_surfaces.cmds[id] = ext->cmd.data;
             qxl->guest_surfaces.count++;
@@ -359,7 +361,7 @@ static void qxl_track_command(PCIQXLDevice *qxl, struct QXLCommandExt *ext)
             qxl->guest_surfaces.cmds[id] = 0;
             qxl->guest_surfaces.count--;
         }
-        qemu_mutex_unlock(&qxl->ssd.wlock);
+        qemu_mutex_unlock(&qxl->track_lock);
         break;
     }
     case QXL_CMD_CURSOR:
@@ -1432,6 +1434,7 @@ static int qxl_init_common(PCIQXLDevice *qxl)
     qxl->generation = 1;
     qxl->num_memslots = NUM_MEMSLOTS;
     qxl->num_surfaces = NUM_SURFACES;
+    qemu_mutex_init(&qxl->track_lock);
 
     switch (qxl->revision) {
     case 1: /* spice 0.4 -- qxl-1 */
diff --git a/hw/qxl.h b/hw/qxl.h
index f005943..7df594e 100644
--- a/hw/qxl.h
+++ b/hw/qxl.h
@@ -58,6 +58,8 @@ typedef struct PCIQXLDevice {
     } guest_surfaces;
     QXLPHYSICAL        guest_cursor;
 
+    QemuMutex          track_lock;
+
     /* thread signaling */
     pthread_t          main;
     int                pipe[2];
-- 
1.7.5.4

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

* [Qemu-devel] [PATCHv3] qxl: add mode to debugprint on destroy primary
  2011-06-29 11:57 [Qemu-devel] [PATCHv3] qxl S3&S4 (suspend and hibernate) support Alon Levy
                   ` (2 preceding siblings ...)
  2011-06-29 11:57 ` [Qemu-devel] [PATCHv3] qxl: use track_lock instead of wlock for guest_surfaces Alon Levy
@ 2011-06-29 11:57 ` Alon Levy
  2011-06-29 11:57 ` [Qemu-devel] [PATCHv3] qxl: allow QXL_IO_LOG also in vga Alon Levy
                   ` (10 subsequent siblings)
  14 siblings, 0 replies; 38+ messages in thread
From: Alon Levy @ 2011-06-29 11:57 UTC (permalink / raw)
  To: qemu-devel; +Cc: yhalperi, kraxel

---
 hw/qxl.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/hw/qxl.c b/hw/qxl.c
index 49d7b10..a5827fb 100644
--- a/hw/qxl.c
+++ b/hw/qxl.c
@@ -1167,7 +1167,7 @@ static void ioport_write(void *opaque, uint32_t addr, uint32_t val)
     }
     case QXL_IO_DESTROY_PRIMARY:
         PANIC_ON(val != 0);
-        dprint(d, 1, "QXL_IO_DESTROY_PRIMARY\n");
+        dprint(d, 1, "QXL_IO_DESTROY_PRIMARY (%s)\n", qxl_mode_to_string(d->mode));
         if (d->mode != QXL_MODE_UNDEFINED) {
             d->mode = QXL_MODE_UNDEFINED;
             qemu_spice_destroy_primary_surface(&d->ssd, 0);
-- 
1.7.5.4

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

* [Qemu-devel] [PATCHv3] qxl: allow QXL_IO_LOG also in vga
  2011-06-29 11:57 [Qemu-devel] [PATCHv3] qxl S3&S4 (suspend and hibernate) support Alon Levy
                   ` (3 preceding siblings ...)
  2011-06-29 11:57 ` [Qemu-devel] [PATCHv3] qxl: add mode to debugprint on destroy primary Alon Levy
@ 2011-06-29 11:57 ` Alon Levy
  2011-06-29 11:57 ` [Qemu-devel] [PATCHv3] qxl: abort on panic instead of exit Alon Levy
                   ` (9 subsequent siblings)
  14 siblings, 0 replies; 38+ messages in thread
From: Alon Levy @ 2011-06-29 11:57 UTC (permalink / raw)
  To: qemu-devel; +Cc: yhalperi, kraxel

The driver may change us to vga mode and still issue a QXL_IO_LOG,
which we can easily support.
---
 hw/qxl.c |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

diff --git a/hw/qxl.c b/hw/qxl.c
index a5827fb..d38e3c0 100644
--- a/hw/qxl.c
+++ b/hw/qxl.c
@@ -1085,6 +1085,7 @@ static void ioport_write(void *opaque, uint32_t addr, uint32_t val)
     case QXL_IO_CREATE_PRIMARY:
     case QXL_IO_CREATE_PRIMARY_ASYNC:
     case QXL_IO_UPDATE_IRQ:
+    case QXL_IO_LOG:
         break;
     default:
         if (d->mode == QXL_MODE_NATIVE || d->mode == QXL_MODE_COMPAT)
-- 
1.7.5.4

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

* [Qemu-devel] [PATCHv3] qxl: abort on panic instead of exit
  2011-06-29 11:57 [Qemu-devel] [PATCHv3] qxl S3&S4 (suspend and hibernate) support Alon Levy
                   ` (4 preceding siblings ...)
  2011-06-29 11:57 ` [Qemu-devel] [PATCHv3] qxl: allow QXL_IO_LOG also in vga Alon Levy
@ 2011-06-29 11:57 ` Alon Levy
  2011-06-29 12:44   ` Gerd Hoffmann
  2011-06-29 11:57 ` [Qemu-devel] [PATCHv3] qxl-logger: add timestamp to command log Alon Levy
                   ` (8 subsequent siblings)
  14 siblings, 1 reply; 38+ messages in thread
From: Alon Levy @ 2011-06-29 11:57 UTC (permalink / raw)
  To: qemu-devel; +Cc: yhalperi, kraxel

---
 hw/qxl.h |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/hw/qxl.h b/hw/qxl.h
index 7df594e..bf875a0 100644
--- a/hw/qxl.h
+++ b/hw/qxl.h
@@ -89,7 +89,7 @@ typedef struct PCIQXLDevice {
 
 #define PANIC_ON(x) if ((x)) {                         \
     printf("%s: PANIC %s failed\n", __FUNCTION__, #x); \
-    exit(-1);                                          \
+    abort();                                          \
 }
 
 #define dprint(_qxl, _level, _fmt, ...)                                 \
-- 
1.7.5.4

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

* [Qemu-devel] [PATCHv3] qxl-logger: add timestamp to command log
  2011-06-29 11:57 [Qemu-devel] [PATCHv3] qxl S3&S4 (suspend and hibernate) support Alon Levy
                   ` (5 preceding siblings ...)
  2011-06-29 11:57 ` [Qemu-devel] [PATCHv3] qxl: abort on panic instead of exit Alon Levy
@ 2011-06-29 11:57 ` Alon Levy
  2011-06-29 11:57 ` [Qemu-devel] [PATCHv3] qxl: update and add debug prints Alon Levy
                   ` (7 subsequent siblings)
  14 siblings, 0 replies; 38+ messages in thread
From: Alon Levy @ 2011-06-29 11:57 UTC (permalink / raw)
  To: qemu-devel; +Cc: yhalperi, kraxel

---
 hw/qxl-logger.c |    4 +++-
 1 files changed, 3 insertions(+), 1 deletions(-)

diff --git a/hw/qxl-logger.c b/hw/qxl-logger.c
index 76f43e6..74cadba 100644
--- a/hw/qxl-logger.c
+++ b/hw/qxl-logger.c
@@ -19,6 +19,7 @@
  * along with this program; if not, see <http://www.gnu.org/licenses/>.
  */
 
+#include "qemu-timer.h"
 #include "qxl.h"
 
 static const char *qxl_type[] = {
@@ -223,7 +224,8 @@ void qxl_log_command(PCIQXLDevice *qxl, const char *ring, QXLCommandExt *ext)
     if (!qxl->cmdlog) {
         return;
     }
-    fprintf(stderr, "qxl-%d/%s:", qxl->id, ring);
+    fprintf(stderr, "%ld qxl-%d/%s:", qemu_get_clock_ns(vm_clock),
+            qxl->id, ring);
     fprintf(stderr, " cmd @ 0x%" PRIx64 " %s%s", ext->cmd.data,
             qxl_name(qxl_type, ext->cmd.type),
             compat ? "(compat)" : "");
-- 
1.7.5.4

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

* [Qemu-devel] [PATCHv3] qxl: update and add debug prints
  2011-06-29 11:57 [Qemu-devel] [PATCHv3] qxl S3&S4 (suspend and hibernate) support Alon Levy
                   ` (6 preceding siblings ...)
  2011-06-29 11:57 ` [Qemu-devel] [PATCHv3] qxl-logger: add timestamp to command log Alon Levy
@ 2011-06-29 11:57 ` Alon Levy
  2011-06-29 13:01   ` Gerd Hoffmann
  2011-06-29 11:57 ` [Qemu-devel] [PATCHv3] qxl: add dev id to guest prints Alon Levy
                   ` (6 subsequent siblings)
  14 siblings, 1 reply; 38+ messages in thread
From: Alon Levy @ 2011-06-29 11:57 UTC (permalink / raw)
  To: qemu-devel; +Cc: yhalperi, kraxel

---
 hw/qxl.c |   10 +++++++---
 1 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/hw/qxl.c b/hw/qxl.c
index d38e3c0..8895b14 100644
--- a/hw/qxl.c
+++ b/hw/qxl.c
@@ -444,7 +444,7 @@ static int interface_get_command(QXLInstance *sin, struct QXLCommandExt *ext)
 
     switch (qxl->mode) {
     case QXL_MODE_VGA:
-        dprint(qxl, 2, "%s: vga\n", __FUNCTION__);
+        dprint(qxl, 4, "%s: vga\n", __FUNCTION__);
         ret = false;
         qemu_mutex_lock(&qxl->ssd.lock);
         if (qxl->ssd.update != NULL) {
@@ -783,7 +783,8 @@ static void qxl_hard_reset(PCIQXLDevice *d, int loadvm)
     qemu_spice_create_host_memslot(&d->ssd);
     qxl_soft_reset(d);
 
-    dprint(d, 1, "%s: done\n", __FUNCTION__);
+    dprint(d, 1, "%s: done (num_free_res %d, %p)\n", __FUNCTION__,
+        d->num_free_res, d->last_release);
 }
 
 static void qxl_reset_handler(DeviceState *dev)
@@ -1122,6 +1123,7 @@ static void ioport_write(void *opaque, uint32_t addr, uint32_t val)
         }
         pthread_yield();
         if (!SPICE_RING_IS_EMPTY(&d->ram->release_ring)) {
+            dprint(d, 1, "QXL_IO_NOTIFY_OOM (return after pthread_yield)\n");
             break;
         }
         d->oom_running = 1;
@@ -1138,7 +1140,8 @@ static void ioport_write(void *opaque, uint32_t addr, uint32_t val)
         }
         break;
     case QXL_IO_RESET:
-        dprint(d, 1, "QXL_IO_RESET\n");
+        dprint(d, 1, "QXL_IO_RESET %d (%p)\n", d->num_free_res,
+               d->last_release);
         qxl_hard_reset(d, 0);
         break;
     case QXL_IO_MEMSLOT_ADD:
@@ -1153,6 +1156,7 @@ static void ioport_write(void *opaque, uint32_t addr, uint32_t val)
         break;
     }
     case QXL_IO_MEMSLOT_DEL:
+        dprint(d, 1, "QXL_IO_MEMSLOT_DEL %d\n", val);
         qxl_del_memslot(d, val);
         break;
     case QXL_IO_CREATE_PRIMARY:
-- 
1.7.5.4

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

* [Qemu-devel] [PATCHv3] qxl: add dev id to guest prints
  2011-06-29 11:57 [Qemu-devel] [PATCHv3] qxl S3&S4 (suspend and hibernate) support Alon Levy
                   ` (7 preceding siblings ...)
  2011-06-29 11:57 ` [Qemu-devel] [PATCHv3] qxl: update and add debug prints Alon Levy
@ 2011-06-29 11:57 ` Alon Levy
  2011-06-29 11:57 ` [Qemu-devel] [PATCHv3] qxl: add io_port_to_string Alon Levy
                   ` (5 subsequent siblings)
  14 siblings, 0 replies; 38+ messages in thread
From: Alon Levy @ 2011-06-29 11:57 UTC (permalink / raw)
  To: qemu-devel; +Cc: yhalperi, kraxel

---
 hw/qxl.c |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)

diff --git a/hw/qxl.c b/hw/qxl.c
index 8895b14..22455af 100644
--- a/hw/qxl.c
+++ b/hw/qxl.c
@@ -1136,7 +1136,8 @@ static void ioport_write(void *opaque, uint32_t addr, uint32_t val)
         break;
     case QXL_IO_LOG:
         if (d->guestdebug) {
-            fprintf(stderr, "qxl/guest: %s", d->ram->log_buf);
+            fprintf(stderr, "qxl/guest-%d: %ld: %s", d->id,
+                    qemu_get_clock_ns(vm_clock), d->ram->log_buf);
         }
         break;
     case QXL_IO_RESET:
-- 
1.7.5.4

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

* [Qemu-devel] [PATCHv3] qxl: add io_port_to_string
  2011-06-29 11:57 [Qemu-devel] [PATCHv3] qxl S3&S4 (suspend and hibernate) support Alon Levy
                   ` (8 preceding siblings ...)
  2011-06-29 11:57 ` [Qemu-devel] [PATCHv3] qxl: add dev id to guest prints Alon Levy
@ 2011-06-29 11:57 ` Alon Levy
  2011-06-29 13:03   ` Gerd Hoffmann
  2011-06-29 11:57 ` [Qemu-devel] [PATCHv3] qxl: update revision to QXL_REVISION_STABLE_V10 Alon Levy
                   ` (4 subsequent siblings)
  14 siblings, 1 reply; 38+ messages in thread
From: Alon Levy @ 2011-06-29 11:57 UTC (permalink / raw)
  To: qemu-devel; +Cc: yhalperi, kraxel

---
 hw/qxl.c |   64 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 63 insertions(+), 1 deletions(-)

diff --git a/hw/qxl.c b/hw/qxl.c
index 22455af..0ab8074 100644
--- a/hw/qxl.c
+++ b/hw/qxl.c
@@ -433,6 +433,67 @@ static const char *qxl_mode_to_string(int mode)
     return "INVALID";
 }
 
+static const char *io_port_to_string(uint32_t io_port)
+{
+    if (io_port >= QXL_IO_RANGE_SIZE) {
+        return "out of range";
+    }
+    switch(io_port) {
+    case QXL_IO_NOTIFY_CMD:
+        return "QXL_IO_NOTIFY_CMD";
+    case QXL_IO_NOTIFY_CURSOR:
+        return "QXL_IO_NOTIFY_CURSOR";
+    case QXL_IO_UPDATE_AREA:
+        return "QXL_IO_UPDATE_AREA";
+    case QXL_IO_UPDATE_IRQ:
+        return "QXL_IO_UPDATE_IRQ";
+    case QXL_IO_NOTIFY_OOM:
+        return "QXL_IO_NOTIFY_OOM";
+    case QXL_IO_RESET:
+        return "QXL_IO_RESET";
+    case QXL_IO_SET_MODE:
+        return "QXL_IO_SET_MODE";
+    case QXL_IO_LOG:
+        return "QXL_IO_LOG";
+    case QXL_IO_MEMSLOT_ADD:
+        return "QXL_IO_MEMSLOT_ADD";
+    case QXL_IO_MEMSLOT_DEL:
+        return "QXL_IO_MEMSLOT_DEL";
+    case QXL_IO_DETACH_PRIMARY:
+        return "QXL_IO_DETACH_PRIMARY";
+    case QXL_IO_ATTACH_PRIMARY:
+        return "QXL_IO_ATTACH_PRIMARY";
+    case QXL_IO_CREATE_PRIMARY:
+        return "QXL_IO_CREATE_PRIMARY";
+    case QXL_IO_DESTROY_PRIMARY:
+        return "QXL_IO_DESTROY_PRIMARY";
+    case QXL_IO_DESTROY_SURFACE_WAIT:
+        return "QXL_IO_DESTROY_SURFACE_WAIT";
+    case QXL_IO_DESTROY_ALL_SURFACES:
+        return "QXL_IO_DESTROY_ALL_SURFACES";
+    case QXL_IO_UPDATE_AREA_ASYNC:
+        return "QXL_IO_UPDATE_AREA_ASYNC";
+    case QXL_IO_NOTIFY_OOM_ASYNC:
+        return "QXL_IO_NOTIFY_OOM_ASYNC";
+    case QXL_IO_MEMSLOT_ADD_ASYNC:
+        return "QXL_IO_MEMSLOT_ADD_ASYNC";
+    case QXL_IO_CREATE_PRIMARY_ASYNC:
+        return "QXL_IO_CREATE_PRIMARY_ASYNC";
+    case QXL_IO_DESTROY_PRIMARY_ASYNC:
+        return "QXL_IO_DESTROY_PRIMARY_ASYNC";
+    case QXL_IO_DESTROY_SURFACE_ASYNC:
+        return "QXL_IO_DESTROY_SURFACE_ASYNC";
+    case QXL_IO_DESTROY_ALL_SURFACES_ASYNC:
+        return "QXL_IO_DESTROY_ALL_SURFACES_ASYNC";
+    case QXL_IO_FLUSH_SURFACES:
+        return "QXL_IO_FLUSH_SURFACES";
+    case QXL_IO_FLUSH_RELEASE:
+        return "QXL_IO_FLUSH_RELEASE";
+    }
+    // not reached?
+    return "error in io_port_to_string";
+}
+
 /* called from spice server thread context only */
 static int interface_get_command(QXLInstance *sin, struct QXLCommandExt *ext)
 {
@@ -1091,7 +1152,8 @@ static void ioport_write(void *opaque, uint32_t addr, uint32_t val)
     default:
         if (d->mode == QXL_MODE_NATIVE || d->mode == QXL_MODE_COMPAT)
             break;
-        dprint(d, 1, "%s: unexpected port 0x%x in vga mode\n", __FUNCTION__, io_port);
+        dprint(d, 1, "%s: unexpected port 0x%x (%s) in vga mode\n",
+            __FUNCTION__, io_port, io_port_to_string(io_port));
         /* be nice to buggy guest drivers */
         if (io_port >= QXL_IO_UPDATE_AREA_ASYNC &&
             io_port <= QXL_IO_DESTROY_ALL_SURFACES_ASYNC) {
-- 
1.7.5.4

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

* [Qemu-devel] [PATCHv3] qxl: update revision to QXL_REVISION_STABLE_V10
  2011-06-29 11:57 [Qemu-devel] [PATCHv3] qxl S3&S4 (suspend and hibernate) support Alon Levy
                   ` (9 preceding siblings ...)
  2011-06-29 11:57 ` [Qemu-devel] [PATCHv3] qxl: add io_port_to_string Alon Levy
@ 2011-06-29 11:57 ` Alon Levy
  2011-06-29 11:57 ` [Qemu-devel] [PATCHv3] qxl: add QXL_IO_FLUSH_{SURFACES, RELEASE} for guest S3&S4 support Alon Levy
                   ` (3 subsequent siblings)
  14 siblings, 0 replies; 38+ messages in thread
From: Alon Levy @ 2011-06-29 11:57 UTC (permalink / raw)
  To: qemu-devel; +Cc: yhalperi, kraxel

also errors if provided revision is wrong. 0 is reserved for experimental
revision, the other valid values are as before:
 1 - V04
 2 - V06
And the new
 3 - V10
---
 hw/qxl.c |   16 +++++++++-------
 1 files changed, 9 insertions(+), 7 deletions(-)

diff --git a/hw/qxl.c b/hw/qxl.c
index 0ab8074..29425a5 100644
--- a/hw/qxl.c
+++ b/hw/qxl.c
@@ -1494,8 +1494,8 @@ static DisplayChangeListener display_listener = {
 static int qxl_init_common(PCIQXLDevice *qxl)
 {
     uint8_t* config = qxl->pci.config;
-    uint32_t pci_device_id;
-    uint32_t pci_device_rev;
+    uint32_t pci_device_id = 0;
+    uint32_t pci_device_rev = 0;
     uint32_t io_size;
 
     qxl->mode = QXL_MODE_UNDEFINED;
@@ -1505,22 +1505,24 @@ static int qxl_init_common(PCIQXLDevice *qxl)
     qemu_mutex_init(&qxl->track_lock);
 
     switch (qxl->revision) {
-    case 1: /* spice 0.4 -- qxl-1 */
+    case QXL_REVISION_STABLE_V04: /* spice 0.4 -- qxl-1 */
         pci_device_id  = QXL_DEVICE_ID_STABLE;
         pci_device_rev = QXL_REVISION_STABLE_V04;
         break;
-    case 2: /* spice 0.6 -- qxl-2 */
+    case QXL_REVISION_STABLE_V06: /* spice 0.6 -- qxl-2 */
         pci_device_id  = QXL_DEVICE_ID_STABLE;
         pci_device_rev = QXL_REVISION_STABLE_V06;
         break;
-    case 3: /* qxl-3 */
+    case QXL_REVISION_STABLE_V10: /* spice 0.10 -- qxl-3 */
         pci_device_id  = QXL_DEVICE_ID_STABLE;
-        pci_device_rev = 3;
+        pci_device_rev = QXL_REVISION_STABLE_V10;
         break;
-    default: /* experimental */
+    case 0: /* experimental */
         pci_device_id  = QXL_DEVICE_ID_DEVEL;
         pci_device_rev = 1;
         break;
+    default:
+        error_report("bad revision paramter");
     }
 
     pci_config_set_device_id(config, pci_device_id);
-- 
1.7.5.4

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

* [Qemu-devel] [PATCHv3] qxl: add QXL_IO_FLUSH_{SURFACES, RELEASE} for guest S3&S4 support
  2011-06-29 11:57 [Qemu-devel] [PATCHv3] qxl S3&S4 (suspend and hibernate) support Alon Levy
                   ` (10 preceding siblings ...)
  2011-06-29 11:57 ` [Qemu-devel] [PATCHv3] qxl: update revision to QXL_REVISION_STABLE_V10 Alon Levy
@ 2011-06-29 11:57 ` Alon Levy
  2011-06-29 13:06   ` Gerd Hoffmann
  2011-06-29 11:57 ` [Qemu-devel] [PATCHv3] qxl: move to UNDEFINED on DESTROY_ALL_SURFACES{, _ASYNC} Alon Levy
                   ` (2 subsequent siblings)
  14 siblings, 1 reply; 38+ messages in thread
From: Alon Levy @ 2011-06-29 11:57 UTC (permalink / raw)
  To: qemu-devel; +Cc: yhalperi, kraxel

Add two new IOs.
 QXL_IO_FLUSH_SURFACES - equivalent to update area for all surfaces, used
  to reduce vmexits from NumSurfaces to 1 on guest S3, S4 and resolution change (windows
  driver implementation is such that this is done on each of those occasions).
 QXL_IO_FLUSH_RELEASE - used to ensure anything on last_release is put on the release ring
  for the client to free.

Cc: Yonit Halperin <yhalperi@redhat.com>
---
 hw/qxl.c |   24 ++++++++++++++++++++++++
 1 files changed, 24 insertions(+), 0 deletions(-)

diff --git a/hw/qxl.c b/hw/qxl.c
index 29425a5..f158d45 100644
--- a/hw/qxl.c
+++ b/hw/qxl.c
@@ -1247,6 +1247,30 @@ static void ioport_write(void *opaque, uint32_t addr, uint32_t val)
     case QXL_IO_DESTROY_ALL_SURFACES:
         qxl_spice_destroy_surfaces(d);
         break;
+    case QXL_IO_FLUSH_SURFACES:
+        dprint(d, 1, "QXL_IO_FLUSH_SURFACES (%d) entry (%s, s#=%d, res#=%d)\n",
+            val, qxl_mode_to_string(d->mode), d->guest_surfaces.count,
+            d->num_free_res);
+        qemu_spice_stop(&d->ssd);
+        qemu_spice_start(&d->ssd);
+        dprint(d, 1, "QXL_IO_FLUSH_SURFACES exit (%s, s#=%d, res#=%d,%p)\n",
+            qxl_mode_to_string(d->mode), d->guest_surfaces.count,
+            d->num_free_res, d->last_release);
+        break;
+    case QXL_IO_FLUSH_RELEASE: {
+        QXLReleaseRing *ring = &d->ram->release_ring;
+        if (ring->prod - ring->cons + 1 == ring->num_items) {
+            // TODO - "return" a value to the guest and let it loop?
+            fprintf(stderr,
+                "ERROR: no flush, full release ring [p%d,%dc]\n",
+                ring->prod, ring->cons);
+        }
+        qxl_push_free_res(d, 1 /* flush */);
+        dprint(d, 1, "QXL_IO_FLUSH_RELEASE exit (%s, s#=%d, res#=%d,%p)\n",
+            qxl_mode_to_string(d->mode), d->guest_surfaces.count,
+            d->num_free_res, d->last_release);
+        break;
+    }
     case QXL_IO_MEMSLOT_ADD_ASYNC:
         PANIC_ON(val >= NUM_MEMSLOTS);
         PANIC_ON(d->guest_slots[val].active);
-- 
1.7.5.4

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

* [Qemu-devel] [PATCHv3] qxl: move to UNDEFINED on DESTROY_ALL_SURFACES{, _ASYNC}
  2011-06-29 11:57 [Qemu-devel] [PATCHv3] qxl S3&S4 (suspend and hibernate) support Alon Levy
                   ` (11 preceding siblings ...)
  2011-06-29 11:57 ` [Qemu-devel] [PATCHv3] qxl: add QXL_IO_FLUSH_{SURFACES, RELEASE} for guest S3&S4 support Alon Levy
@ 2011-06-29 11:57 ` Alon Levy
  2011-06-29 13:09   ` Gerd Hoffmann
  2011-06-29 11:57 ` [Qemu-devel] [PATCHv3] qxl: only disallow specific io's in vga mode Alon Levy
  2011-06-29 11:57 ` [Qemu-devel] [PATCHv3] (alon-local) symlink bios out of tree Alon Levy
  14 siblings, 1 reply; 38+ messages in thread
From: Alon Levy @ 2011-06-29 11:57 UTC (permalink / raw)
  To: qemu-devel; +Cc: yhalperi, kraxel

---
 hw/qxl.c |    4 +++-
 1 files changed, 3 insertions(+), 1 deletions(-)

diff --git a/hw/qxl.c b/hw/qxl.c
index f158d45..b794b2c 100644
--- a/hw/qxl.c
+++ b/hw/qxl.c
@@ -1245,6 +1245,7 @@ static void ioport_write(void *opaque, uint32_t addr, uint32_t val)
         qxl_spice_destroy_surface_wait(d, val);
         break;
     case QXL_IO_DESTROY_ALL_SURFACES:
+        d->mode = QXL_MODE_UNDEFINED;
         qxl_spice_destroy_surfaces(d);
         break;
     case QXL_IO_FLUSH_SURFACES:
@@ -1302,9 +1303,10 @@ static void ioport_write(void *opaque, uint32_t addr, uint32_t val)
         async->update_area = d->ram->update_area;
         async->update_surface = d->ram->update_surface;
         goto async_common;
+    case QXL_IO_DESTROY_ALL_SURFACES_ASYNC:
+        d->mode = QXL_MODE_UNDEFINED;
     case QXL_IO_NOTIFY_OOM_ASYNC:
     case QXL_IO_DESTROY_SURFACE_ASYNC:
-    case QXL_IO_DESTROY_ALL_SURFACES_ASYNC:
         async = qemu_mallocz(sizeof(*async));
     async_common:
         async->port = io_port;
-- 
1.7.5.4

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

* [Qemu-devel] [PATCHv3] qxl: only disallow specific io's in vga mode
  2011-06-29 11:57 [Qemu-devel] [PATCHv3] qxl S3&S4 (suspend and hibernate) support Alon Levy
                   ` (12 preceding siblings ...)
  2011-06-29 11:57 ` [Qemu-devel] [PATCHv3] qxl: move to UNDEFINED on DESTROY_ALL_SURFACES{, _ASYNC} Alon Levy
@ 2011-06-29 11:57 ` Alon Levy
  2011-06-29 11:57 ` [Qemu-devel] [PATCHv3] (alon-local) symlink bios out of tree Alon Levy
  14 siblings, 0 replies; 38+ messages in thread
From: Alon Levy @ 2011-06-29 11:57 UTC (permalink / raw)
  To: qemu-devel; +Cc: yhalperi, kraxel

Since the driver is still operation also after moving to UNDEFINED, i.e.
by destroying primary in any way.
---
 hw/qxl.c |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)

diff --git a/hw/qxl.c b/hw/qxl.c
index b794b2c..99a4708 100644
--- a/hw/qxl.c
+++ b/hw/qxl.c
@@ -1150,8 +1150,9 @@ static void ioport_write(void *opaque, uint32_t addr, uint32_t val)
     case QXL_IO_LOG:
         break;
     default:
-        if (d->mode == QXL_MODE_NATIVE || d->mode == QXL_MODE_COMPAT)
+        if (d->mode != QXL_MODE_VGA) {
             break;
+        }
         dprint(d, 1, "%s: unexpected port 0x%x (%s) in vga mode\n",
             __FUNCTION__, io_port, io_port_to_string(io_port));
         /* be nice to buggy guest drivers */
-- 
1.7.5.4

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

* [Qemu-devel] [PATCHv3] (alon-local) symlink bios out of tree
  2011-06-29 11:57 [Qemu-devel] [PATCHv3] qxl S3&S4 (suspend and hibernate) support Alon Levy
                   ` (13 preceding siblings ...)
  2011-06-29 11:57 ` [Qemu-devel] [PATCHv3] qxl: only disallow specific io's in vga mode Alon Levy
@ 2011-06-29 11:57 ` Alon Levy
  2011-06-29 13:11   ` Gerd Hoffmann
  14 siblings, 1 reply; 38+ messages in thread
From: Alon Levy @ 2011-06-29 11:57 UTC (permalink / raw)
  To: qemu-devel; +Cc: yhalperi, kraxel

---
 pc-bios/bios.bin        |  Bin 131072 -> 26 bytes
 pc-bios/vgabios-qxl.bin |  Bin 40448 -> 41 bytes
 2 files changed, 0 insertions(+), 0 deletions(-)
 mode change 100644 => 120000 pc-bios/bios.bin
 mode change 100644 => 120000 pc-bios/vgabios-qxl.bin

diff --git a/pc-bios/bios.bin b/pc-bios/bios.bin
deleted file mode 100644
index bdb48314dfb79c6db84846278a696da3cb68d4ff..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 131072
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

diff --git a/pc-bios/bios.bin b/pc-bios/bios.bin
new file mode 120000
index 0000000..d376f4e
--- /dev/null
+++ b/pc-bios/bios.bin
@@ -0,0 +1 @@
+../../seabios/out/bios.bin
\ No newline at end of file
diff --git a/pc-bios/vgabios-qxl.bin b/pc-bios/vgabios-qxl.bin
deleted file mode 100644
index 3156c6e3f1a18f011014cd983bf57fe7c5a03e96..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 40448
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
LmHvw*@Z<jjhrM_!

diff --git a/pc-bios/vgabios-qxl.bin b/pc-bios/vgabios-qxl.bin
new file mode 120000
index 0000000..332b7c1
--- /dev/null
+++ b/pc-bios/vgabios-qxl.bin
@@ -0,0 +1 @@
+../../vgabios/VGABIOS-lgpl-latest.qxl.bin
\ No newline at end of file
-- 
1.7.5.4

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

* Re: [Qemu-devel] [PATCHv3] qxl: abort on panic instead of exit
  2011-06-29 11:57 ` [Qemu-devel] [PATCHv3] qxl: abort on panic instead of exit Alon Levy
@ 2011-06-29 12:44   ` Gerd Hoffmann
  2011-06-29 14:24     ` Alon Levy
  0 siblings, 1 reply; 38+ messages in thread
From: Gerd Hoffmann @ 2011-06-29 12:44 UTC (permalink / raw)
  To: Alon Levy; +Cc: yhalperi, qemu-devel

On 06/29/11 13:57, Alon Levy wrote:
> ---
>   hw/qxl.h |    2 +-
>   1 files changed, 1 insertions(+), 1 deletions(-)
>
> diff --git a/hw/qxl.h b/hw/qxl.h
> index 7df594e..bf875a0 100644
> --- a/hw/qxl.h
> +++ b/hw/qxl.h
> @@ -89,7 +89,7 @@ typedef struct PCIQXLDevice {
>
>   #define PANIC_ON(x) if ((x)) {                         \
>       printf("%s: PANIC %s failed\n", __FUNCTION__, #x); \
> -    exit(-1);                                          \
> +    abort();                                          \
>   }

Not urgent, but I think this should change.  A bunch of the PANIC_ON 
checks are guest-triggerable.  Long-term I want invalid requests from 
the guest just be ignored by default.  Keeping an option to do something 
else is fine (log a message, abort, write out guest dump, whatever), I 
see that this can be quite useful for guest driver debugging.

cheers,
   Gerd

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

* Re: [Qemu-devel] [PATCHv3] qxl: update and add debug prints
  2011-06-29 11:57 ` [Qemu-devel] [PATCHv3] qxl: update and add debug prints Alon Levy
@ 2011-06-29 13:01   ` Gerd Hoffmann
  2011-06-29 14:24     ` Alon Levy
  0 siblings, 1 reply; 38+ messages in thread
From: Gerd Hoffmann @ 2011-06-29 13:01 UTC (permalink / raw)
  To: Alon Levy; +Cc: yhalperi, qemu-devel

   Hi,

> -    dprint(d, 1, "%s: done\n", __FUNCTION__);
> +    dprint(d, 1, "%s: done (num_free_res %d, %p)\n", __FUNCTION__,
> +        d->num_free_res, d->last_release);

>       case QXL_IO_RESET:
> -        dprint(d, 1, "QXL_IO_RESET\n");
> +        dprint(d, 1, "QXL_IO_RESET %d (%p)\n", d->num_free_res,
> +               d->last_release);

Hmm, this looks pretty much like something added to debug a specific 
issue, not something useful for tracing in general ...

cheers,
   Gerd

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

* Re: [Qemu-devel] [PATCHv3] qxl: add io_port_to_string
  2011-06-29 11:57 ` [Qemu-devel] [PATCHv3] qxl: add io_port_to_string Alon Levy
@ 2011-06-29 13:03   ` Gerd Hoffmann
  2011-06-29 14:25     ` Alon Levy
  0 siblings, 1 reply; 38+ messages in thread
From: Gerd Hoffmann @ 2011-06-29 13:03 UTC (permalink / raw)
  To: Alon Levy; +Cc: yhalperi, qemu-devel

   Hi,

> -        dprint(d, 1, "%s: unexpected port 0x%x in vga mode\n", __FUNCTION__, io_port);
> +        dprint(d, 1, "%s: unexpected port 0x%x (%s) in vga mode\n",
> +            __FUNCTION__, io_port, io_port_to_string(io_port));

Is this worth it?  Should be a quite rare event ...

cheers,
   Gerd

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

* Re: [Qemu-devel] [PATCHv3] qxl: add QXL_IO_FLUSH_{SURFACES, RELEASE} for guest S3&S4 support
  2011-06-29 11:57 ` [Qemu-devel] [PATCHv3] qxl: add QXL_IO_FLUSH_{SURFACES, RELEASE} for guest S3&S4 support Alon Levy
@ 2011-06-29 13:06   ` Gerd Hoffmann
  2011-06-29 14:27     ` Alon Levy
  2011-06-29 14:45     ` Alon Levy
  0 siblings, 2 replies; 38+ messages in thread
From: Gerd Hoffmann @ 2011-06-29 13:06 UTC (permalink / raw)
  To: Alon Levy; +Cc: yhalperi, qemu-devel

   Hi,

> +    case QXL_IO_FLUSH_SURFACES:
> +        dprint(d, 1, "QXL_IO_FLUSH_SURFACES (%d) entry (%s, s#=%d, res#=%d)\n",
> +            val, qxl_mode_to_string(d->mode), d->guest_surfaces.count,
> +            d->num_free_res);
> +        qemu_spice_stop(&d->ssd);
> +        qemu_spice_start(&d->ssd);
> +        dprint(d, 1, "QXL_IO_FLUSH_SURFACES exit (%s, s#=%d, res#=%d,%p)\n",
> +            qxl_mode_to_string(d->mode), d->guest_surfaces.count,
> +            d->num_free_res, d->last_release);
> +        break;

This should be async as we'll go sleep and wait for the spice server 
thread finish in qemu_spice_stop().

> +    case QXL_IO_FLUSH_RELEASE: {
> +        QXLReleaseRing *ring =&d->ram->release_ring;
> +        if (ring->prod - ring->cons + 1 == ring->num_items) {
> +            // TODO - "return" a value to the guest and let it loop?
                   ^^^^
Hmm.

cheers,
   Gerd

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

* Re: [Qemu-devel] [PATCHv3] qxl: move to UNDEFINED on DESTROY_ALL_SURFACES{, _ASYNC}
  2011-06-29 11:57 ` [Qemu-devel] [PATCHv3] qxl: move to UNDEFINED on DESTROY_ALL_SURFACES{, _ASYNC} Alon Levy
@ 2011-06-29 13:09   ` Gerd Hoffmann
  2011-06-29 14:29     ` Alon Levy
  0 siblings, 1 reply; 38+ messages in thread
From: Gerd Hoffmann @ 2011-06-29 13:09 UTC (permalink / raw)
  To: Alon Levy; +Cc: yhalperi, qemu-devel

   Hi,

> +    case QXL_IO_DESTROY_ALL_SURFACES_ASYNC:
> +        d->mode = QXL_MODE_UNDEFINED;

Should go to the async thread.

cheers,
   Gerd

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

* Re: [Qemu-devel] [PATCHv3] (alon-local) symlink bios out of tree
  2011-06-29 11:57 ` [Qemu-devel] [PATCHv3] (alon-local) symlink bios out of tree Alon Levy
@ 2011-06-29 13:11   ` Gerd Hoffmann
  2011-06-29 14:31     ` Alon Levy
  0 siblings, 1 reply; 38+ messages in thread
From: Gerd Hoffmann @ 2011-06-29 13:11 UTC (permalink / raw)
  To: Alon Levy; +Cc: yhalperi, qemu-devel

On 06/29/11 13:57, Alon Levy wrote:
> ---
>   pc-bios/bios.bin        |  Bin 131072 ->  26 bytes
>   pc-bios/vgabios-qxl.bin |  Bin 40448 ->  41 bytes
>   2 files changed, 0 insertions(+), 0 deletions(-)
>   mode change 100644 =>  120000 pc-bios/bios.bin
>   mode change 100644 =>  120000 pc-bios/vgabios-qxl.bin

That wasn't intentional, was it?

/me cherry-picked a bunch of patches, I'll go push an updated tree shortly.

cheers,
   Gerd

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

* Re: [Qemu-devel] [PATCHv3] qxl: abort on panic instead of exit
  2011-06-29 12:44   ` Gerd Hoffmann
@ 2011-06-29 14:24     ` Alon Levy
  2011-06-29 14:34       ` Gerd Hoffmann
  0 siblings, 1 reply; 38+ messages in thread
From: Alon Levy @ 2011-06-29 14:24 UTC (permalink / raw)
  To: Gerd Hoffmann; +Cc: yhalperi, qemu-devel

On Wed, Jun 29, 2011 at 02:44:11PM +0200, Gerd Hoffmann wrote:
> On 06/29/11 13:57, Alon Levy wrote:
> >---
> >  hw/qxl.h |    2 +-
> >  1 files changed, 1 insertions(+), 1 deletions(-)
> >
> >diff --git a/hw/qxl.h b/hw/qxl.h
> >index 7df594e..bf875a0 100644
> >--- a/hw/qxl.h
> >+++ b/hw/qxl.h
> >@@ -89,7 +89,7 @@ typedef struct PCIQXLDevice {
> >
> >  #define PANIC_ON(x) if ((x)) {                         \
> >      printf("%s: PANIC %s failed\n", __FUNCTION__, #x); \
> >-    exit(-1);                                          \
> >+    abort();                                          \
> >  }
> 
> Not urgent, but I think this should change.  A bunch of the PANIC_ON
> checks are guest-triggerable.  Long-term I want invalid requests
> from the guest just be ignored by default.  Keeping an option to do
> something else is fine (log a message, abort, write out guest dump,
> whatever), I see that this can be quite useful for guest driver
> debugging.
Agreed. So keep PANIC_ON but remove a lot of it's users, or add some wrapper
that depends on a "guest_panic" parameter that defaults off.

> 
> cheers,
>   Gerd

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

* Re: [Qemu-devel] [PATCHv3] qxl: update and add debug prints
  2011-06-29 13:01   ` Gerd Hoffmann
@ 2011-06-29 14:24     ` Alon Levy
  2011-06-29 14:36       ` Gerd Hoffmann
  0 siblings, 1 reply; 38+ messages in thread
From: Alon Levy @ 2011-06-29 14:24 UTC (permalink / raw)
  To: Gerd Hoffmann; +Cc: yhalperi, qemu-devel

On Wed, Jun 29, 2011 at 03:01:30PM +0200, Gerd Hoffmann wrote:
>   Hi,
> 
> >-    dprint(d, 1, "%s: done\n", __FUNCTION__);
> >+    dprint(d, 1, "%s: done (num_free_res %d, %p)\n", __FUNCTION__,
> >+        d->num_free_res, d->last_release);
> 
> >      case QXL_IO_RESET:
> >-        dprint(d, 1, "QXL_IO_RESET\n");
> >+        dprint(d, 1, "QXL_IO_RESET %d (%p)\n", d->num_free_res,
> >+               d->last_release);
> 
> Hmm, this looks pretty much like something added to debug a specific
> issue, not something useful for tracing in general ...

ok. can you just drop it from the queue so I can avoid sending a v4?

> 
> cheers,
>   Gerd
> 

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

* Re: [Qemu-devel] [PATCHv3] qxl: add io_port_to_string
  2011-06-29 13:03   ` Gerd Hoffmann
@ 2011-06-29 14:25     ` Alon Levy
  0 siblings, 0 replies; 38+ messages in thread
From: Alon Levy @ 2011-06-29 14:25 UTC (permalink / raw)
  To: Gerd Hoffmann; +Cc: yhalperi, qemu-devel

On Wed, Jun 29, 2011 at 03:03:32PM +0200, Gerd Hoffmann wrote:
>   Hi,
> 
> >-        dprint(d, 1, "%s: unexpected port 0x%x in vga mode\n", __FUNCTION__, io_port);
> >+        dprint(d, 1, "%s: unexpected port 0x%x (%s) in vga mode\n",
> >+            __FUNCTION__, io_port, io_port_to_string(io_port));
> 
> Is this worth it?  Should be a quite rare event ...

well, it's helpful for debugging, so I don't see why not. The extra code is not that large,
and it's already written :)

> 
> cheers,
>   Gerd
> 

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

* Re: [Qemu-devel] [PATCHv3] qxl: add QXL_IO_FLUSH_{SURFACES, RELEASE} for guest S3&S4 support
  2011-06-29 13:06   ` Gerd Hoffmann
@ 2011-06-29 14:27     ` Alon Levy
  2011-06-29 14:50       ` Gerd Hoffmann
  2011-06-29 14:45     ` Alon Levy
  1 sibling, 1 reply; 38+ messages in thread
From: Alon Levy @ 2011-06-29 14:27 UTC (permalink / raw)
  To: Gerd Hoffmann; +Cc: yhalperi, qemu-devel

On Wed, Jun 29, 2011 at 03:06:33PM +0200, Gerd Hoffmann wrote:
>   Hi,
> 
> >+    case QXL_IO_FLUSH_SURFACES:
> >+        dprint(d, 1, "QXL_IO_FLUSH_SURFACES (%d) entry (%s, s#=%d, res#=%d)\n",
> >+            val, qxl_mode_to_string(d->mode), d->guest_surfaces.count,
> >+            d->num_free_res);
> >+        qemu_spice_stop(&d->ssd);
> >+        qemu_spice_start(&d->ssd);
> >+        dprint(d, 1, "QXL_IO_FLUSH_SURFACES exit (%s, s#=%d, res#=%d,%p)\n",
> >+            qxl_mode_to_string(d->mode), d->guest_surfaces.count,
> >+            d->num_free_res, d->last_release);
> >+        break;
> 
> This should be async as we'll go sleep and wait for the spice server
> thread finish in qemu_spice_stop().

Yeah, I meant to do that, forgot, thanks for catching it.

> 
> >+    case QXL_IO_FLUSH_RELEASE: {
> >+        QXLReleaseRing *ring =&d->ram->release_ring;
> >+        if (ring->prod - ring->cons + 1 == ring->num_items) {
> >+            // TODO - "return" a value to the guest and let it loop?
>                   ^^^^
> Hmm.
So the story goes: I wrote this, but didn't actually see this happen in practice,
particularily since the driver empties the release ring. The simplest would be to
replace it with some fprintf(stderr)

> 
> cheers,
>   Gerd

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

* Re: [Qemu-devel] [PATCHv3] qxl: move to UNDEFINED on DESTROY_ALL_SURFACES{, _ASYNC}
  2011-06-29 13:09   ` Gerd Hoffmann
@ 2011-06-29 14:29     ` Alon Levy
  2011-06-29 15:00       ` Gerd Hoffmann
  0 siblings, 1 reply; 38+ messages in thread
From: Alon Levy @ 2011-06-29 14:29 UTC (permalink / raw)
  To: Gerd Hoffmann; +Cc: yhalperi, qemu-devel

On Wed, Jun 29, 2011 at 03:09:36PM +0200, Gerd Hoffmann wrote:
>   Hi,
> 
> >+    case QXL_IO_DESTROY_ALL_SURFACES_ASYNC:
> >+        d->mode = QXL_MODE_UNDEFINED;
> 
> Should go to the async thread.

doesn't it make more sense to do all state changes from the vcpu thread? async thread can run much
later, if you have a QXL_IO_DESTROY_ALL_SURFACES_ASYNC followed by a QXL_IO_CREATE_PRIMARY_ASYNC where
the driver did not wait for the completion of the ASYNC first, I would still like to support that,
but it won't work if I move this to the async thread.

> 
> cheers,
>   Gerd

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

* Re: [Qemu-devel] [PATCHv3] (alon-local) symlink bios out of tree
  2011-06-29 13:11   ` Gerd Hoffmann
@ 2011-06-29 14:31     ` Alon Levy
  2011-06-29 15:01       ` Gerd Hoffmann
  0 siblings, 1 reply; 38+ messages in thread
From: Alon Levy @ 2011-06-29 14:31 UTC (permalink / raw)
  To: Gerd Hoffmann; +Cc: yhalperi, qemu-devel

On Wed, Jun 29, 2011 at 03:11:56PM +0200, Gerd Hoffmann wrote:
> On 06/29/11 13:57, Alon Levy wrote:
> >---
> >  pc-bios/bios.bin        |  Bin 131072 ->  26 bytes
> >  pc-bios/vgabios-qxl.bin |  Bin 40448 ->  41 bytes
> >  2 files changed, 0 insertions(+), 0 deletions(-)
> >  mode change 100644 =>  120000 pc-bios/bios.bin
> >  mode change 100644 =>  120000 pc-bios/vgabios-qxl.bin
> 
> That wasn't intentional, was it?
> 

No, I forgot to delete the file and did email *..

> /me cherry-picked a bunch of patches, I'll go push an updated tree shortly.

ok - so I guess I'll wait for that and then send the S3-S4 using ASYNC
for the FLUSH_SURFACES patch separately. (I guess I'll call it FLUSH_SURFACES_ASYNC
and FLUSH_RELEASE_ASYNC? or just the former ASYNC?

> 
> cheers,
>   Gerd
> 

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

* Re: [Qemu-devel] [PATCHv3] qxl: abort on panic instead of exit
  2011-06-29 14:24     ` Alon Levy
@ 2011-06-29 14:34       ` Gerd Hoffmann
  0 siblings, 0 replies; 38+ messages in thread
From: Gerd Hoffmann @ 2011-06-29 14:34 UTC (permalink / raw)
  To: qemu-devel, yhalperi

   Hi,

> Agreed. So keep PANIC_ON but remove a lot of it's users, or add some wrapper
> that depends on a "guest_panic" parameter that defaults off.

Maybe keep PANIC_ON in case there are any which can trigger on qemu bugs 
only.  Add a new one where the name makes clear this triggers on case 
the guest driver does something wrong, maybe qxl_guest_bug() or so. 
Note this isn't a simple search/replace as qemu continues execution, but 
still has to ignore the invalid request from the guest (and maybe raise 
an error irq)?

cheers,
   Gerd

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

* Re: [Qemu-devel] [PATCHv3] qxl: update and add debug prints
  2011-06-29 14:24     ` Alon Levy
@ 2011-06-29 14:36       ` Gerd Hoffmann
  0 siblings, 0 replies; 38+ messages in thread
From: Gerd Hoffmann @ 2011-06-29 14:36 UTC (permalink / raw)
  To: qemu-devel, yhalperi

   Hi,

>> Hmm, this looks pretty much like something added to debug a specific
>> issue, not something useful for tracing in general ...
>
> ok. can you just drop it from the queue so I can avoid sending a v4?

Pushed a new bz700134 branch version with bits cherry-picked, just 
resend anything which isn't there yet, not the whole series.

cheers,
   Gerd

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

* Re: [Qemu-devel] [PATCHv3] qxl: add QXL_IO_FLUSH_{SURFACES, RELEASE} for guest S3&S4 support
  2011-06-29 13:06   ` Gerd Hoffmann
  2011-06-29 14:27     ` Alon Levy
@ 2011-06-29 14:45     ` Alon Levy
  1 sibling, 0 replies; 38+ messages in thread
From: Alon Levy @ 2011-06-29 14:45 UTC (permalink / raw)
  To: Gerd Hoffmann; +Cc: yhalperi, qemu-devel

On Wed, Jun 29, 2011 at 03:06:33PM +0200, Gerd Hoffmann wrote:
>   Hi,
> 
> >+    case QXL_IO_FLUSH_SURFACES:
> >+        dprint(d, 1, "QXL_IO_FLUSH_SURFACES (%d) entry (%s, s#=%d, res#=%d)\n",
> >+            val, qxl_mode_to_string(d->mode), d->guest_surfaces.count,
> >+            d->num_free_res);
> >+        qemu_spice_stop(&d->ssd);
> >+        qemu_spice_start(&d->ssd);
> >+        dprint(d, 1, "QXL_IO_FLUSH_SURFACES exit (%s, s#=%d, res#=%d,%p)\n",
> >+            qxl_mode_to_string(d->mode), d->guest_surfaces.count,
> >+            d->num_free_res, d->last_release);
> >+        break;
> 
> This should be async as we'll go sleep and wait for the spice server
> thread finish in qemu_spice_stop().

ok, so don't cherry-pick the ioport_to_string patch yet since I'm doing
s/FLUSH_SURFACES/FLUSH_SURFACES_ASYNC/

> 
> >+    case QXL_IO_FLUSH_RELEASE: {
> >+        QXLReleaseRing *ring =&d->ram->release_ring;
> >+        if (ring->prod - ring->cons + 1 == ring->num_items) {
> >+            // TODO - "return" a value to the guest and let it loop?
>                   ^^^^
> Hmm.
> 
> cheers,
>   Gerd
> 

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

* Re: [Qemu-devel] [PATCHv3] qxl: add QXL_IO_FLUSH_{SURFACES, RELEASE} for guest S3&S4 support
  2011-06-29 14:27     ` Alon Levy
@ 2011-06-29 14:50       ` Gerd Hoffmann
  2011-06-29 18:22         ` Alon Levy
  0 siblings, 1 reply; 38+ messages in thread
From: Gerd Hoffmann @ 2011-06-29 14:50 UTC (permalink / raw)
  To: qemu-devel, yhalperi

>>> +    case QXL_IO_FLUSH_RELEASE: {
>>> +        QXLReleaseRing *ring =&d->ram->release_ring;
>>> +        if (ring->prod - ring->cons + 1 == ring->num_items) {
>>> +            // TODO - "return" a value to the guest and let it loop?
>>                    ^^^^
>> Hmm.
> So the story goes: I wrote this, but didn't actually see this happen in practice,
> particularily since the driver empties the release ring. The simplest would be to
> replace it with some fprintf(stderr)

How do you think this could happen?  If there are no unprocessed 
requests in the pipeline (shouldn't be, all surfaces are flushed to 
device memory and destroyedv at that point) and the driver cares empty 
the release ring before calling this it should not happen, right?

cheers,
   Gerd

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

* Re: [Qemu-devel] [PATCHv3] qxl: move to UNDEFINED on DESTROY_ALL_SURFACES{, _ASYNC}
  2011-06-29 14:29     ` Alon Levy
@ 2011-06-29 15:00       ` Gerd Hoffmann
  2011-06-29 18:28         ` Alon Levy
  0 siblings, 1 reply; 38+ messages in thread
From: Gerd Hoffmann @ 2011-06-29 15:00 UTC (permalink / raw)
  To: qemu-devel, yhalperi

On 06/29/11 16:29, Alon Levy wrote:
> On Wed, Jun 29, 2011 at 03:09:36PM +0200, Gerd Hoffmann wrote:
>> Hi,
>>
>>> +    case QXL_IO_DESTROY_ALL_SURFACES_ASYNC: +        d->mode =
>>> QXL_MODE_UNDEFINED;
>>
>> Should go to the async thread.
>
> doesn't it make more sense to do all state changes from the vcpu
> thread? async thread can run much later, if you have a
> QXL_IO_DESTROY_ALL_SURFACES_ASYNC followed by a
> QXL_IO_CREATE_PRIMARY_ASYNC where the driver did not wait for the
> completion of the ASYNC first, I would still like to support that,
> but it won't work if I move this to the async thread.

I think we should disallow doing any I/O ops while one is in progress 
(except maybe QXL_IO_LOG).  Most I/O commands are I/O commands because 
they either needed for device setup or must be synchronous anyway.

QXL_IO_CREATE_PRIMARY_ASYNC wasn't exactly clever designed I think. 
Would have been better to enter native mode with another I/O command, 
then send the create request for the primary through the rings like all 
other surface commands.  But given it is a rare event it isn't that a 
big issue either.

cheers,
   Gerd

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

* Re: [Qemu-devel] [PATCHv3] (alon-local) symlink bios out of tree
  2011-06-29 14:31     ` Alon Levy
@ 2011-06-29 15:01       ` Gerd Hoffmann
  0 siblings, 0 replies; 38+ messages in thread
From: Gerd Hoffmann @ 2011-06-29 15:01 UTC (permalink / raw)
  To: qemu-devel, yhalperi

   Hi,

> ok - so I guess I'll wait for that and then send the S3-S4 using ASYNC
> for the FLUSH_SURFACES patch separately. (I guess I'll call it FLUSH_SURFACES_ASYNC
> and FLUSH_RELEASE_ASYNC? or just the former ASYNC?

Just the surfaces.  The release one doesn't go sleep.

cheers,
   Gerd

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

* Re: [Qemu-devel] [PATCHv3] qxl: add QXL_IO_FLUSH_{SURFACES, RELEASE} for guest S3&S4 support
  2011-06-29 14:50       ` Gerd Hoffmann
@ 2011-06-29 18:22         ` Alon Levy
  0 siblings, 0 replies; 38+ messages in thread
From: Alon Levy @ 2011-06-29 18:22 UTC (permalink / raw)
  To: Gerd Hoffmann; +Cc: yhalperi, qemu-devel

On Wed, Jun 29, 2011 at 04:50:10PM +0200, Gerd Hoffmann wrote:
> >>>+    case QXL_IO_FLUSH_RELEASE: {
> >>>+        QXLReleaseRing *ring =&d->ram->release_ring;
> >>>+        if (ring->prod - ring->cons + 1 == ring->num_items) {
> >>>+            // TODO - "return" a value to the guest and let it loop?
> >>                   ^^^^
> >>Hmm.
> >So the story goes: I wrote this, but didn't actually see this happen in practice,
> >particularily since the driver empties the release ring. The simplest would be to
> >replace it with some fprintf(stderr)
> 
> How do you think this could happen?  If there are no unprocessed
> requests in the pipeline (shouldn't be, all surfaces are flushed to
> device memory and destroyedv at that point) and the driver cares
> empty the release ring before calling this it should not happen,
> right?

Yes. The point was to check anyway, it should never happen with our driver,
but a check can catch an error I guess.

> 
> cheers,
>   Gerd
> 

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

* Re: [Qemu-devel] [PATCHv3] qxl: move to UNDEFINED on DESTROY_ALL_SURFACES{, _ASYNC}
  2011-06-29 15:00       ` Gerd Hoffmann
@ 2011-06-29 18:28         ` Alon Levy
  2011-06-30  7:16           ` Gerd Hoffmann
  0 siblings, 1 reply; 38+ messages in thread
From: Alon Levy @ 2011-06-29 18:28 UTC (permalink / raw)
  To: Gerd Hoffmann; +Cc: yhalperi, qemu-devel

On Wed, Jun 29, 2011 at 05:00:20PM +0200, Gerd Hoffmann wrote:
> On 06/29/11 16:29, Alon Levy wrote:
> >On Wed, Jun 29, 2011 at 03:09:36PM +0200, Gerd Hoffmann wrote:
> >>Hi,
> >>
> >>>+    case QXL_IO_DESTROY_ALL_SURFACES_ASYNC: +        d->mode =
> >>>QXL_MODE_UNDEFINED;
> >>
> >>Should go to the async thread.
> >
> >doesn't it make more sense to do all state changes from the vcpu
> >thread? async thread can run much later, if you have a
> >QXL_IO_DESTROY_ALL_SURFACES_ASYNC followed by a
> >QXL_IO_CREATE_PRIMARY_ASYNC where the driver did not wait for the
> >completion of the ASYNC first, I would still like to support that,
> >but it won't work if I move this to the async thread.
> 
> I think we should disallow doing any I/O ops while one is in
> progress (except maybe QXL_IO_LOG).  Most I/O commands are I/O
> commands because they either needed for device setup or must be
> synchronous anyway.
> 
> QXL_IO_CREATE_PRIMARY_ASYNC wasn't exactly clever designed I think.
> Would have been better to enter native mode with another I/O
> command, then send the create request for the primary through the
> rings like all other surface commands.  But given it is a rare event
> it isn't that a big issue either.
> 

So - leave or change? I prefer to leave..
Maybe add a "pending async" flag to catch such occasions?

> cheers,
>   Gerd
> 
> 

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

* Re: [Qemu-devel] [PATCHv3] qxl: move to UNDEFINED on DESTROY_ALL_SURFACES{, _ASYNC}
  2011-06-29 18:28         ` Alon Levy
@ 2011-06-30  7:16           ` Gerd Hoffmann
  0 siblings, 0 replies; 38+ messages in thread
From: Gerd Hoffmann @ 2011-06-30  7:16 UTC (permalink / raw)
  To: qemu-devel, yhalperi

   Hi,

> Maybe add a "pending async" flag to catch such occasions?

Yes, good idea.

cheers,
   Gerd

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

* [Qemu-devel] [PATCHv3] qxl: add io_port_to_string
  2011-07-12 13:55 [Qemu-devel] [PATCHv3] async + suspend reworked Alon Levy
@ 2011-07-12 13:55 ` Alon Levy
  0 siblings, 0 replies; 38+ messages in thread
From: Alon Levy @ 2011-07-12 13:55 UTC (permalink / raw)
  To: qemu-devel; +Cc: kraxel

---
 hw/qxl.c |   62 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 61 insertions(+), 1 deletions(-)

diff --git a/hw/qxl.c b/hw/qxl.c
index 6862bc8..7be7ae1 100644
--- a/hw/qxl.c
+++ b/hw/qxl.c
@@ -407,6 +407,65 @@ static const char *qxl_mode_to_string(int mode)
     return "INVALID";
 }
 
+static const char *io_port_to_string(uint32_t io_port)
+{
+    if (io_port >= QXL_IO_RANGE_SIZE) {
+        return "out of range";
+    }
+    switch(io_port) {
+    case QXL_IO_NOTIFY_CMD:
+        return "QXL_IO_NOTIFY_CMD";
+    case QXL_IO_NOTIFY_CURSOR:
+        return "QXL_IO_NOTIFY_CURSOR";
+    case QXL_IO_UPDATE_AREA:
+        return "QXL_IO_UPDATE_AREA";
+    case QXL_IO_UPDATE_IRQ:
+        return "QXL_IO_UPDATE_IRQ";
+    case QXL_IO_NOTIFY_OOM:
+        return "QXL_IO_NOTIFY_OOM";
+    case QXL_IO_RESET:
+        return "QXL_IO_RESET";
+    case QXL_IO_SET_MODE:
+        return "QXL_IO_SET_MODE";
+    case QXL_IO_LOG:
+        return "QXL_IO_LOG";
+    case QXL_IO_MEMSLOT_ADD:
+        return "QXL_IO_MEMSLOT_ADD";
+    case QXL_IO_MEMSLOT_DEL:
+        return "QXL_IO_MEMSLOT_DEL";
+    case QXL_IO_DETACH_PRIMARY:
+        return "QXL_IO_DETACH_PRIMARY";
+    case QXL_IO_ATTACH_PRIMARY:
+        return "QXL_IO_ATTACH_PRIMARY";
+    case QXL_IO_CREATE_PRIMARY:
+        return "QXL_IO_CREATE_PRIMARY";
+    case QXL_IO_DESTROY_PRIMARY:
+        return "QXL_IO_DESTROY_PRIMARY";
+    case QXL_IO_DESTROY_SURFACE_WAIT:
+        return "QXL_IO_DESTROY_SURFACE_WAIT";
+    case QXL_IO_DESTROY_ALL_SURFACES:
+        return "QXL_IO_DESTROY_ALL_SURFACES";
+    case QXL_IO_UPDATE_AREA_ASYNC:
+        return "QXL_IO_UPDATE_AREA_ASYNC";
+    case QXL_IO_MEMSLOT_ADD_ASYNC:
+        return "QXL_IO_MEMSLOT_ADD_ASYNC";
+    case QXL_IO_CREATE_PRIMARY_ASYNC:
+        return "QXL_IO_CREATE_PRIMARY_ASYNC";
+    case QXL_IO_DESTROY_PRIMARY_ASYNC:
+        return "QXL_IO_DESTROY_PRIMARY_ASYNC";
+    case QXL_IO_DESTROY_SURFACE_ASYNC:
+        return "QXL_IO_DESTROY_SURFACE_ASYNC";
+    case QXL_IO_DESTROY_ALL_SURFACES_ASYNC:
+        return "QXL_IO_DESTROY_ALL_SURFACES_ASYNC";
+    case QXL_IO_FLUSH_SURFACES_ASYNC:
+        return "QXL_IO_FLUSH_SURFACES_ASYNC";
+    case QXL_IO_FLUSH_RELEASE:
+        return "QXL_IO_FLUSH_RELEASE";
+    }
+    // not reached?
+    return "error in io_port_to_string";
+}
+
 /* called from spice server thread context only */
 static int interface_get_command(QXLInstance *sin, struct QXLCommandExt *ext)
 {
@@ -1003,7 +1062,8 @@ static void ioport_write(void *opaque, uint32_t addr, uint32_t val)
     default:
         if (d->mode == QXL_MODE_NATIVE || d->mode == QXL_MODE_COMPAT)
             break;
-        dprint(d, 1, "%s: unexpected port 0x%x in vga mode\n", __FUNCTION__, io_port);
+        dprint(d, 1, "%s: unexpected port 0x%x (%s) in vga mode\n",
+            __FUNCTION__, io_port, io_port_to_string(io_port));
         return;
     }
 
-- 
1.7.6

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

end of thread, other threads:[~2011-07-12 13:56 UTC | newest]

Thread overview: 38+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-06-29 11:57 [Qemu-devel] [PATCHv3] qxl S3&S4 (suspend and hibernate) support Alon Levy
2011-06-29 11:57 ` [Qemu-devel] [PATCHv3] async io: suggested fixes Alon Levy
2011-06-29 11:57 ` [Qemu-devel] [PATCHv3] async thread fix - handle EAGAIN/EINTR, remove fprintf Alon Levy
2011-06-29 11:57 ` [Qemu-devel] [PATCHv3] qxl: use track_lock instead of wlock for guest_surfaces Alon Levy
2011-06-29 11:57 ` [Qemu-devel] [PATCHv3] qxl: add mode to debugprint on destroy primary Alon Levy
2011-06-29 11:57 ` [Qemu-devel] [PATCHv3] qxl: allow QXL_IO_LOG also in vga Alon Levy
2011-06-29 11:57 ` [Qemu-devel] [PATCHv3] qxl: abort on panic instead of exit Alon Levy
2011-06-29 12:44   ` Gerd Hoffmann
2011-06-29 14:24     ` Alon Levy
2011-06-29 14:34       ` Gerd Hoffmann
2011-06-29 11:57 ` [Qemu-devel] [PATCHv3] qxl-logger: add timestamp to command log Alon Levy
2011-06-29 11:57 ` [Qemu-devel] [PATCHv3] qxl: update and add debug prints Alon Levy
2011-06-29 13:01   ` Gerd Hoffmann
2011-06-29 14:24     ` Alon Levy
2011-06-29 14:36       ` Gerd Hoffmann
2011-06-29 11:57 ` [Qemu-devel] [PATCHv3] qxl: add dev id to guest prints Alon Levy
2011-06-29 11:57 ` [Qemu-devel] [PATCHv3] qxl: add io_port_to_string Alon Levy
2011-06-29 13:03   ` Gerd Hoffmann
2011-06-29 14:25     ` Alon Levy
2011-06-29 11:57 ` [Qemu-devel] [PATCHv3] qxl: update revision to QXL_REVISION_STABLE_V10 Alon Levy
2011-06-29 11:57 ` [Qemu-devel] [PATCHv3] qxl: add QXL_IO_FLUSH_{SURFACES, RELEASE} for guest S3&S4 support Alon Levy
2011-06-29 13:06   ` Gerd Hoffmann
2011-06-29 14:27     ` Alon Levy
2011-06-29 14:50       ` Gerd Hoffmann
2011-06-29 18:22         ` Alon Levy
2011-06-29 14:45     ` Alon Levy
2011-06-29 11:57 ` [Qemu-devel] [PATCHv3] qxl: move to UNDEFINED on DESTROY_ALL_SURFACES{, _ASYNC} Alon Levy
2011-06-29 13:09   ` Gerd Hoffmann
2011-06-29 14:29     ` Alon Levy
2011-06-29 15:00       ` Gerd Hoffmann
2011-06-29 18:28         ` Alon Levy
2011-06-30  7:16           ` Gerd Hoffmann
2011-06-29 11:57 ` [Qemu-devel] [PATCHv3] qxl: only disallow specific io's in vga mode Alon Levy
2011-06-29 11:57 ` [Qemu-devel] [PATCHv3] (alon-local) symlink bios out of tree Alon Levy
2011-06-29 13:11   ` Gerd Hoffmann
2011-06-29 14:31     ` Alon Levy
2011-06-29 15:01       ` Gerd Hoffmann
  -- strict thread matches above, loose matches on Subject: below --
2011-07-12 13:55 [Qemu-devel] [PATCHv3] async + suspend reworked Alon Levy
2011-07-12 13:55 ` [Qemu-devel] [PATCHv3] qxl: add io_port_to_string Alon Levy

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