summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Levy <alevy@redhat.com>2011-06-05 11:01:48 +0300
committerAlon Levy <alevy@redhat.com>2011-06-17 20:37:22 +0200
commit19636164270c50d5493e930cc216d761925c0fdb (patch)
tree86be7ddc25f30a2f1db944a0baabd214e1cdd02d
parent95005e9aa268ed1c057f942e348e4f1da0faf9a7 (diff)
qxl: add QXL_IO_UPDATE_MEM for guest S3&S4 supportqemu-kvm.master.spice.v36.s3.v1
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 <yhalperi@redhat.com>
-rw-r--r--hw/qxl.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/hw/qxl.c b/hw/qxl.c
index eb0bf05e5..4ed720c20 100644
--- a/hw/qxl.c
+++ b/hw/qxl.c
@@ -1072,6 +1072,35 @@ 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;
+#if defined(FEATURE_QXL_IO_UPDATE_MEM) && (SPICE_INTERFACE_QXL_MAJOR > 3 \
+ || (SPICE_INTERFACE_QXL_MAJOR == 3 && SPICE_INTERFACE_QXL_MINOR >= 1))
+ 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;
+#endif
default:
fprintf(stderr, "%s: ioport=0x%x, abort()\n", __FUNCTION__, io_port);
abort();