qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH 2/2] qxl: add QXL_IO_UPDATE_MEM for guest S3&S4 supp


From: Alon Levy
Subject: [Qemu-devel] [PATCH 2/2] qxl: add QXL_IO_UPDATE_MEM for guest S3&S4 support
Date: Mon, 20 Jun 2011 13:11:52 +0200

Add QXL_IO_UPDATE_MEM. Used to reduce vmexits from the guest when it resets the
spice server state before going to sleep.

The implementation requires an updated spice-server (0.8.2) with the new
worker function update_mem.

Cc: Yonit Halperin <address@hidden>
---
 hw/qxl.c |   26 ++++++++++++++++++++++++++
 1 files changed, 26 insertions(+), 0 deletions(-)

diff --git a/hw/qxl.c b/hw/qxl.c
index ca5c8b3..4945d95 100644
--- a/hw/qxl.c
+++ b/hw/qxl.c
@@ -1016,6 +1016,32 @@ static void ioport_write(void *opaque, uint32_t addr, 
uint32_t val)
     case QXL_IO_DESTROY_ALL_SURFACES:
         d->ssd.worker->destroy_surfaces(d->ssd.worker);
         break;
+    case QXL_IO_UPDATE_MEM:
+        dprint(d, 1, "QXL_IO_UPDATE_MEM (%d) entry (%s, s#=%d, res#=%d)\n",
+            val, qxl_mode_to_string(d->mode), d->guest_surfaces.count,
+            d->num_free_res);
+        switch (val) {
+        case (QXL_UPDATE_MEM_RENDER_ALL):
+            d->ssd.worker->update_mem(d->ssd.worker);
+            break;
+        case (QXL_UPDATE_MEM_FLUSH): {
+            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_UPDATE_MEM 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;
+        }
+        default:
+            fprintf(stderr, "ERROR: unexpected value to QXL_IO_UPDATE_MEM\n");
+        }
+        break;
     default:
         fprintf(stderr, "%s: ioport=0x%x, abort()\n", __FUNCTION__, io_port);
         abort();
-- 
1.7.5.2




reply via email to

[Prev in Thread] Current Thread [Next in Thread]