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/
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
11
static void qxl_reset_surfaces(PCIQXLDevice *d);
12
static void qxl_ring_set_dirty(PCIQXLDevice *qxl);
14
+/* qemu-kvm locking ... */
15
+void qxl_unlock_iothread(SimpleSpiceDisplay *ssd)
17
+ if (cpu_single_env) {
18
+ assert(ssd->env == NULL);
19
+ ssd->env = cpu_single_env;
20
+ cpu_single_env = NULL;
22
+ qemu_mutex_unlock_iothread();
25
+void qxl_lock_iothread(SimpleSpiceDisplay *ssd)
27
+ qemu_mutex_lock_iothread();
29
+ assert(cpu_single_env == NULL);
30
+ cpu_single_env = ssd->env;
35
static inline uint32_t msb_mask(uint32_t val)
39
dprint(d, 1, "%s: start%s\n", __FUNCTION__,
40
loadvm ? " (loadvm)" : "");
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);
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));
64
dprint(d, 1, "%s\n", __FUNCTION__);
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);
74
static void qxl_set_mode(PCIQXLDevice *d, int modenr, int loadvm)
76
case QXL_IO_UPDATE_AREA:
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,
83
- qemu_mutex_lock_iothread();
84
+ qxl_lock_iothread(&d->ssd);
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
93
surface.mem = (intptr_t)ssd->buf;
94
surface.group_id = MEMSLOT_GROUP_HOST;
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);
103
void qemu_spice_destroy_host_primary(SimpleSpiceDisplay *ssd)
105
dprint(1, "%s:\n", __FUNCTION__);
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);
114
void qemu_spice_vm_change_state_handler(void *opaque, int running, int reason)
117
ssd->worker->start(ssd->worker);
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);
125
ssd->running = running;
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
136
+ /* qemu-kvm locking ... */
138
} SimpleSpiceDisplay;
140
typedef struct SimpleSpiceUpdate {
145
+void qxl_unlock_iothread(SimpleSpiceDisplay *ssd);
146
+void qxl_lock_iothread(SimpleSpiceDisplay *ssd);
148
int qemu_spice_rect_is_empty(const QXLRect* r);
149
void qemu_spice_rect_union(QXLRect *dest, const QXLRect *r);