[Spice-devel] [PATCH 35/35] spice: Ensure flush_resources() flushes the ring if possible

alexl at redhat.com alexl at redhat.com
Thu Sep 9 10:16:18 PDT 2010


From: Alexander Larsson <alexl at redhat.com>

The driver may be waiting on the ring, so we need to always
flush the ring on interface_flush_resources, independent of
d->num_free_res.

Additionally, the num_free_res check is changed to >= to make
sure we don't stall if it passes QXL_FREE_BUNCH_SIZE.
---
 hw/qxl.c |   12 +++++++-----
 1 files changed, 7 insertions(+), 5 deletions(-)

diff --git a/hw/qxl.c b/hw/qxl.c
index 63a96e8..51286d4 100644
--- a/hw/qxl.c
+++ b/hw/qxl.c
@@ -384,15 +384,17 @@ static int interface_req_cmd_notification(QXLInstance *sin)
 }
 
 /* called from spice server thread context only */
-static inline void qxl_push_free_res(PCIQXLDevice *d)
+static inline void qxl_push_free_res(PCIQXLDevice *d,
+				     bool flush)
 {
     QXLReleaseRing *ring = &d->ram->release_ring;
     uint64_t *item;
 
 #define QXL_FREE_BUNCH_SIZE 10
 
-    if (SPICE_RING_IS_EMPTY(ring) || (d->num_free_res == QXL_FREE_BUNCH_SIZE &&
-                                      ring->prod - ring->cons + 1 != ring->num_items)) {
+    if (SPICE_RING_IS_EMPTY(ring) ||
+	((flush || d->num_free_res >= QXL_FREE_BUNCH_SIZE) &&
+	 ring->prod - ring->cons + 1 != ring->num_items)) {
         int notify;
 
         SPICE_RING_PUSH(ring, notify);
@@ -443,7 +445,7 @@ static void interface_release_resource(QXLInstance *sin,
     }
     qxl->last_release = ext.info;
     qxl->num_free_res++;
-    qxl_push_free_res(qxl);
+    qxl_push_free_res(qxl, false);
 }
 
 /* called from spice server thread context only */
@@ -518,7 +520,7 @@ static int interface_flush_resources(QXLInstance *sin)
 
     ret = qxl->num_free_res;
     if (ret) {
-        qxl_push_free_res(qxl);
+        qxl_push_free_res(qxl, true);
     }
     return ret;
 }
-- 
1.7.0.1



More information about the Spice-devel mailing list