From 55551f043b274c0f9dba83dc50f34c507ae2ccd9 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Wed, 15 Jun 2011 11:05:11 -0300 Subject: [RHEL6 qemu-kvm PATCH 02/10] Revert "qxl/spice: remove qemu_mutex_{un, }lock_iothread around dispatcher" RH-Author: Gerd Hoffmann Message-id: <1308135919-4065-3-git-send-email-kraxel@redhat.com> Patchwork-id: 27147 O-Subject: [RHEL-6.2 kvm PATCH 02/10] Revert "qxl/spice: remove qemu_mutex_{un, }lock_iothread around dispatcher" Bugzilla: 674583 705070 RH-Acked-by: Alon Levy RH-Acked-by: Hans de Goede RH-Acked-by: Arnon Gilboa This reverts commit 35774a33a23c0175d0f51eba82d63d2950f8e40e. Signed-off-by: Gerd Hoffmann --- hw/qxl.c | 8 ++++++++ ui/spice-display.c | 19 ++++++++++++++++--- 2 files changed, 24 insertions(+), 3 deletions(-) Signed-off-by: Eduardo Habkost --- hw/qxl.c | 8 ++++++++ ui/spice-display.c | 19 ++++++++++++++++--- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/hw/qxl.c b/hw/qxl.c index 465e355..31bd539 100644 --- a/hw/qxl.c +++ b/hw/qxl.c @@ -670,8 +670,10 @@ static void qxl_hard_reset(PCIQXLDevice *d, int loadvm) dprint(d, 1, "%s: start%s\n", __FUNCTION__, loadvm ? " (loadvm)" : ""); + qemu_mutex_unlock_iothread(); d->ssd.worker->reset_cursor(d->ssd.worker); d->ssd.worker->reset_image_cache(d->ssd.worker); + qemu_mutex_lock_iothread(); qxl_reset_surfaces(d); qxl_reset_memslots(d); @@ -801,7 +803,9 @@ static void qxl_reset_surfaces(PCIQXLDevice *d) { dprint(d, 1, "%s:\n", __FUNCTION__); d->mode = QXL_MODE_UNDEFINED; + qemu_mutex_unlock_iothread(); d->ssd.worker->destroy_surfaces(d->ssd.worker); + qemu_mutex_lock_iothread(); memset(&d->guest_surfaces.cmds, 0, sizeof(d->guest_surfaces.cmds)); } @@ -870,7 +874,9 @@ static void qxl_destroy_primary(PCIQXLDevice *d) dprint(d, 1, "%s\n", __FUNCTION__); d->mode = QXL_MODE_UNDEFINED; + qemu_mutex_unlock_iothread(); d->ssd.worker->destroy_primary_surface(d->ssd.worker, 0); + qemu_mutex_lock_iothread(); } static void qxl_set_mode(PCIQXLDevice *d, int modenr, int loadvm) @@ -940,8 +946,10 @@ static void ioport_write(void *opaque, uint32_t addr, uint32_t val) case QXL_IO_UPDATE_AREA: { QXLRect update = d->ram->update_area; + qemu_mutex_unlock_iothread(); d->ssd.worker->update_area(d->ssd.worker, d->ram->update_surface, &update, NULL, 0, 0); + qemu_mutex_lock_iothread(); break; } case QXL_IO_NOTIFY_CMD: diff --git a/ui/spice-display.c b/ui/spice-display.c index 6666e57..cdca5e3 100644 --- a/ui/spice-display.c +++ b/ui/spice-display.c @@ -63,7 +63,13 @@ void qemu_spice_rect_union(QXLRect *dest, const QXLRect *r) dest->right = MAX(dest->right, r->right); } -/* Called from io-thread context (via pipe_read) */ +/* + * Called from spice server thread context (via interface_get_command). + * + * We must aquire the global qemu mutex here to make sure the + * DisplayState (+DisplaySurface) we are accessing doesn't change + * underneath us. + */ SimpleSpiceUpdate *qemu_spice_create_update(SimpleSpiceDisplay *ssd) { SimpleSpiceUpdate *update; @@ -73,7 +79,9 @@ SimpleSpiceUpdate *qemu_spice_create_update(SimpleSpiceDisplay *ssd) uint8_t *src, *dst; int by, bw, bh; + qemu_mutex_lock_iothread(); if (qemu_spice_rect_is_empty(&ssd->dirty)) { + qemu_mutex_unlock_iothread(); return NULL; }; @@ -134,6 +142,7 @@ SimpleSpiceUpdate *qemu_spice_create_update(SimpleSpiceDisplay *ssd) cmd->data = (intptr_t)drawable; memset(&ssd->dirty, 0, sizeof(ssd->dirty)); + qemu_mutex_unlock_iothread(); return update; } @@ -161,7 +170,6 @@ void qemu_spice_create_host_memslot(SimpleSpiceDisplay *ssd) ssd->worker->add_memslot(ssd->worker, &memslot); } -/* called from iothread (main) or a vcpu-thread */ void qemu_spice_create_host_primary(SimpleSpiceDisplay *ssd) { QXLDevSurfaceCreate surface; @@ -179,14 +187,18 @@ void qemu_spice_create_host_primary(SimpleSpiceDisplay *ssd) surface.mem = (intptr_t)ssd->buf; surface.group_id = MEMSLOT_GROUP_HOST; + qemu_mutex_unlock_iothread(); ssd->worker->create_primary_surface(ssd->worker, 0, &surface); + qemu_mutex_lock_iothread(); } void qemu_spice_destroy_host_primary(SimpleSpiceDisplay *ssd) { dprint(1, "%s:\n", __FUNCTION__); + qemu_mutex_unlock_iothread(); ssd->worker->destroy_primary_surface(ssd->worker, 0); + qemu_mutex_lock_iothread(); } void qemu_spice_vm_change_state_handler(void *opaque, int running, int reason) @@ -196,7 +208,9 @@ void qemu_spice_vm_change_state_handler(void *opaque, int running, int reason) if (running) { ssd->worker->start(ssd->worker); } else { + qemu_mutex_unlock_iothread(); ssd->worker->stop(ssd->worker); + qemu_mutex_lock_iothread(); } ssd->running = running; } @@ -220,7 +234,6 @@ void qemu_spice_display_update(SimpleSpiceDisplay *ssd, qemu_spice_rect_union(&ssd->dirty, &update_area); } -/* called only from iothread (main) */ void qemu_spice_display_resize(SimpleSpiceDisplay *ssd) { dprint(1, "%s:\n", __FUNCTION__); -- 1.7.3.2