mvadkert / rpms / qemu

Forked from rpms/qemu 6 years ago
Clone
fc5c27b
>From b2b956cfda5fb144d9faa10b7c5894833feb7d30 Mon Sep 17 00:00:00 2001
13f703f
From: Gerd Hoffmann <kraxel@redhat.com>
13f703f
Date: Wed, 29 Jun 2011 10:24:05 +0200
fc5c27b
Subject: [PATCH 15/28] qxl: fix surface tracking & locking
13f703f
13f703f
Surface tracking needs proper locking since it is used from vcpu and spice
13f703f
worker threads, add it.  Also reset the surface counter when zapping all
13f703f
surfaces.
13f703f
13f703f
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
13f703f
---
13f703f
 hw/qxl.c |   13 ++++++++++++-
13f703f
 hw/qxl.h |    2 ++
13f703f
 2 files changed, 14 insertions(+), 1 deletions(-)
13f703f
13f703f
diff --git a/hw/qxl.c b/hw/qxl.c
13f703f
index 803a364..416bd48 100644
13f703f
--- a/hw/qxl.c
13f703f
+++ b/hw/qxl.c
13f703f
@@ -137,7 +137,12 @@ void qxl_spice_update_area(PCIQXLDevice *qxl, uint32_t surface_id,
13f703f
 
13f703f
 void qxl_spice_destroy_surface_wait(PCIQXLDevice *qxl, uint32_t id)
13f703f
 {
13f703f
+    qemu_mutex_lock(&qxl->track_lock);
13f703f
+    PANIC_ON(id >= NUM_SURFACES);
13f703f
     qxl->ssd.worker->destroy_surface_wait(qxl->ssd.worker, id);
13f703f
+    qxl->guest_surfaces.cmds[id] = 0;
13f703f
+    qxl->guest_surfaces.count--;
13f703f
+    qemu_mutex_unlock(&qxl->track_lock);
13f703f
 }
13f703f
 
13f703f
 void qxl_spice_loadvm_commands(PCIQXLDevice *qxl, struct QXLCommandExt *ext,
13f703f
@@ -158,7 +163,11 @@ void qxl_spice_reset_memslots(PCIQXLDevice *qxl)
13f703f
 
13f703f
 void qxl_spice_destroy_surfaces(PCIQXLDevice *qxl)
13f703f
 {
13f703f
+    qemu_mutex_lock(&qxl->track_lock);
13f703f
     qxl->ssd.worker->destroy_surfaces(qxl->ssd.worker);
13f703f
+    memset(&qxl->guest_surfaces.cmds, 0, sizeof(qxl->guest_surfaces.cmds));
13f703f
+    qxl->guest_surfaces.count = 0;
13f703f
+    qemu_mutex_unlock(&qxl->track_lock);
13f703f
 }
13f703f
 
13f703f
 void qxl_spice_reset_image_cache(PCIQXLDevice *qxl)
13f703f
@@ -317,6 +326,7 @@ static void qxl_track_command(PCIQXLDevice *qxl, struct QXLCommandExt *ext)
13f703f
         QXLSurfaceCmd *cmd = qxl_phys2virt(qxl, ext->cmd.data, ext->group_id);
13f703f
         uint32_t id = le32_to_cpu(cmd->surface_id);
13f703f
         PANIC_ON(id >= NUM_SURFACES);
13f703f
+        qemu_mutex_lock(&qxl->track_lock);
13f703f
         if (cmd->type == QXL_SURFACE_CMD_CREATE) {
13f703f
             qxl->guest_surfaces.cmds[id] = ext->cmd.data;
13f703f
             qxl->guest_surfaces.count++;
13f703f
@@ -327,6 +337,7 @@ static void qxl_track_command(PCIQXLDevice *qxl, struct QXLCommandExt *ext)
13f703f
             qxl->guest_surfaces.cmds[id] = 0;
13f703f
             qxl->guest_surfaces.count--;
13f703f
         }
13f703f
+        qemu_mutex_unlock(&qxl->track_lock);
13f703f
         break;
13f703f
     }
13f703f
     case QXL_CMD_CURSOR:
13f703f
@@ -863,7 +874,6 @@ static void qxl_reset_surfaces(PCIQXLDevice *d)
13f703f
     dprint(d, 1, "%s:\n", __FUNCTION__);
13f703f
     d->mode = QXL_MODE_UNDEFINED;
13f703f
     qxl_spice_destroy_surfaces(d);
13f703f
-    memset(&d->guest_surfaces.cmds, 0, sizeof(d->guest_surfaces.cmds));
13f703f
 }
13f703f
 
13f703f
 /* called from spice server thread context only */
13f703f
@@ -1283,6 +1293,7 @@ static int qxl_init_common(PCIQXLDevice *qxl)
13f703f
     qxl->generation = 1;
13f703f
     qxl->num_memslots = NUM_MEMSLOTS;
13f703f
     qxl->num_surfaces = NUM_SURFACES;
13f703f
+    qemu_mutex_init(&qxl->track_lock);
13f703f
 
13f703f
     switch (qxl->revision) {
13f703f
     case 1: /* spice 0.4 -- qxl-1 */
13f703f
diff --git a/hw/qxl.h b/hw/qxl.h
13f703f
index e62b9d0..5d0e85e 100644
13f703f
--- a/hw/qxl.h
13f703f
+++ b/hw/qxl.h
13f703f
@@ -55,6 +55,8 @@ typedef struct PCIQXLDevice {
13f703f
     } guest_surfaces;
13f703f
     QXLPHYSICAL        guest_cursor;
13f703f
 
13f703f
+    QemuMutex          track_lock;
13f703f
+
13f703f
     /* thread signaling */
13f703f
     pthread_t          main;
13f703f
     int                pipe[2];
13f703f
-- 
13f703f
1.7.5.1
13f703f