~ubuntu-branches/ubuntu/quantal/qemu-kvm/quantal

« back to all changes in this revision

Viewing changes to debian/patches/spice-qxl-locking-fix-for-qemu-kvm.patch

  • Committer: Dave Walker (Daviey)
  • Author(s): Serge Hallyn
  • Date: 2011-03-02 10:11:33 UTC
  • mfrom: (123.1.2 lp_723871)
  • Revision ID: davewalker@ubuntu.com-20110302101133-e2n2scyx1hvts973
Tags: 0.14.0~rc1+noroms-0ubuntu4
Apply spice-qxl-locking-fix-for-qemu-kvm.patch to fix bug with -qxl.
(LP: #723871)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
Description: spice/qxl: locking fix for qemu-kvm
 
2
Author: Gerd Hoffmann <kraxel@redhat.com>
 
3
Source: upstream, http://patchwork.ozlabs.org/patch/84704/
 
4
Forwarding: not-needed
 
5
 
 
6
Index: qemu-kvm-natty-qxl/hw/qxl.c
 
7
===================================================================
 
8
--- qemu-kvm-natty-qxl.orig/hw/qxl.c    2011-03-01 11:08:54.787408000 -0600
 
9
+++ qemu-kvm-natty-qxl/hw/qxl.c 2011-03-01 11:12:36.229760328 -0600
 
10
@@ -125,6 +125,27 @@
 
11
 static void qxl_reset_surfaces(PCIQXLDevice *d);
 
12
 static void qxl_ring_set_dirty(PCIQXLDevice *qxl);
 
13
 
 
14
+/* qemu-kvm locking ... */
 
15
+void qxl_unlock_iothread(SimpleSpiceDisplay *ssd)
 
16
+{
 
17
+    if (cpu_single_env) {
 
18
+        assert(ssd->env == NULL);
 
19
+        ssd->env = cpu_single_env;
 
20
+        cpu_single_env = NULL;
 
21
+    }
 
22
+    qemu_mutex_unlock_iothread();
 
23
+}
 
24
+
 
25
+void qxl_lock_iothread(SimpleSpiceDisplay *ssd)
 
26
+{
 
27
+    qemu_mutex_lock_iothread();
 
28
+    if (ssd->env) {
 
29
+        assert(cpu_single_env == NULL);
 
30
+        cpu_single_env = ssd->env;
 
31
+        ssd->env = NULL;
 
32
+    }
 
33
+}
 
34
+
 
35
 static inline uint32_t msb_mask(uint32_t val)
 
36
 {
 
37
     uint32_t mask;
 
38
@@ -662,10 +683,10 @@
 
39
     dprint(d, 1, "%s: start%s\n", __FUNCTION__,
 
40
            loadvm ? " (loadvm)" : "");
 
41
 
 
42
-    qemu_mutex_unlock_iothread();
 
43
+    qxl_unlock_iothread(&d->ssd);
 
44
     d->ssd.worker->reset_cursor(d->ssd.worker);
 
45
     d->ssd.worker->reset_image_cache(d->ssd.worker);
 
46
-    qemu_mutex_lock_iothread();
 
47
+    qxl_lock_iothread(&d->ssd);
 
48
     qxl_reset_surfaces(d);
 
49
     qxl_reset_memslots(d);
 
50
 
 
51
@@ -795,9 +816,9 @@
 
52
 {
 
53
     dprint(d, 1, "%s:\n", __FUNCTION__);
 
54
     d->mode = QXL_MODE_UNDEFINED;
 
55
-    qemu_mutex_unlock_iothread();
 
56
+    qxl_unlock_iothread(&d->ssd);
 
57
     d->ssd.worker->destroy_surfaces(d->ssd.worker);
 
58
-    qemu_mutex_lock_iothread();
 
59
+    qxl_lock_iothread(&d->ssd);
 
60
     memset(&d->guest_surfaces.cmds, 0, sizeof(d->guest_surfaces.cmds));
 
61
 }
 
62
 
 
63
@@ -866,9 +887,9 @@
 
64
     dprint(d, 1, "%s\n", __FUNCTION__);
 
65
 
 
66
     d->mode = QXL_MODE_UNDEFINED;
 
67
-    qemu_mutex_unlock_iothread();
 
68
+    qxl_unlock_iothread(&d->ssd);
 
69
     d->ssd.worker->destroy_primary_surface(d->ssd.worker, 0);
 
70
-    qemu_mutex_lock_iothread();
 
71
+    qxl_lock_iothread(&d->ssd);
 
72
 }
 
73
 
 
74
 static void qxl_set_mode(PCIQXLDevice *d, int modenr, int loadvm)
 
75
@@ -938,10 +959,10 @@
 
76
     case QXL_IO_UPDATE_AREA:
 
77
     {
 
78
         QXLRect update = d->ram->update_area;
 
79
-        qemu_mutex_unlock_iothread();
 
80
+        qxl_unlock_iothread(&d->ssd);
 
81
         d->ssd.worker->update_area(d->ssd.worker, d->ram->update_surface,
 
82
                                    &update, NULL, 0, 0);
 
83
-        qemu_mutex_lock_iothread();
 
84
+        qxl_lock_iothread(&d->ssd);
 
85
         break;
 
86
     }
 
87
     case QXL_IO_NOTIFY_CMD:
 
88
Index: qemu-kvm-natty-qxl/ui/spice-display.c
 
89
===================================================================
 
90
--- qemu-kvm-natty-qxl.orig/ui/spice-display.c  2011-03-01 11:08:54.787408000 -0600
 
91
+++ qemu-kvm-natty-qxl/ui/spice-display.c       2011-03-01 11:12:36.233761675 -0600
 
92
@@ -186,18 +186,18 @@
 
93
     surface.mem        = (intptr_t)ssd->buf;
 
94
     surface.group_id   = MEMSLOT_GROUP_HOST;
 
95
 
 
96
-    qemu_mutex_unlock_iothread();
 
97
+    qxl_unlock_iothread(ssd);
 
98
     ssd->worker->create_primary_surface(ssd->worker, 0, &surface);
 
99
-    qemu_mutex_lock_iothread();
 
100
+    qxl_lock_iothread(ssd);
 
101
 }
 
102
 
 
103
 void qemu_spice_destroy_host_primary(SimpleSpiceDisplay *ssd)
 
104
 {
 
105
     dprint(1, "%s:\n", __FUNCTION__);
 
106
 
 
107
-    qemu_mutex_unlock_iothread();
 
108
+    qxl_unlock_iothread(ssd);
 
109
     ssd->worker->destroy_primary_surface(ssd->worker, 0);
 
110
-    qemu_mutex_lock_iothread();
 
111
+    qxl_lock_iothread(ssd);
 
112
 }
 
113
 
 
114
 void qemu_spice_vm_change_state_handler(void *opaque, int running, int reason)
 
115
@@ -207,9 +207,9 @@
 
116
     if (running) {
 
117
         ssd->worker->start(ssd->worker);
 
118
     } else {
 
119
-        qemu_mutex_unlock_iothread();
 
120
+        qxl_unlock_iothread(ssd);
 
121
         ssd->worker->stop(ssd->worker);
 
122
-        qemu_mutex_lock_iothread();
 
123
+        qxl_lock_iothread(ssd);
 
124
     }
 
125
     ssd->running = running;
 
126
 }
 
127
Index: qemu-kvm-natty-qxl/ui/spice-display.h
 
128
===================================================================
 
129
--- qemu-kvm-natty-qxl.orig/ui/spice-display.h  2011-03-01 11:08:54.787408000 -0600
 
130
+++ qemu-kvm-natty-qxl/ui/spice-display.h       2011-03-01 11:12:36.233761675 -0600
 
131
@@ -43,6 +43,9 @@
 
132
     QXLRect dirty;
 
133
     int notify;
 
134
     int running;
 
135
+
 
136
+    /* qemu-kvm locking ... */
 
137
+    void *env;
 
138
 } SimpleSpiceDisplay;
 
139
 
 
140
 typedef struct SimpleSpiceUpdate {
 
141
@@ -52,6 +55,9 @@
 
142
     uint8_t *bitmap;
 
143
 } SimpleSpiceUpdate;
 
144
 
 
145
+void qxl_unlock_iothread(SimpleSpiceDisplay *ssd);
 
146
+void qxl_lock_iothread(SimpleSpiceDisplay *ssd);
 
147
+
 
148
 int qemu_spice_rect_is_empty(const QXLRect* r);
 
149
 void qemu_spice_rect_union(QXLRect *dest, const QXLRect *r);
 
150