From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:43850) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1R1Cil-0006OC-RZ for qemu-devel@nongnu.org; Wed, 07 Sep 2011 03:38:56 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1R1Cik-0002CC-Ky for qemu-devel@nongnu.org; Wed, 07 Sep 2011 03:38:55 -0400 Received: from mx1.redhat.com ([209.132.183.28]:42877) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1R1Cik-0002C5-8W for qemu-devel@nongnu.org; Wed, 07 Sep 2011 03:38:54 -0400 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id p877crMd018366 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 7 Sep 2011 03:38:53 -0400 From: Gerd Hoffmann Date: Wed, 7 Sep 2011 09:38:35 +0200 Message-Id: <1315381115-6171-7-git-send-email-kraxel@redhat.com> In-Reply-To: <1315381115-6171-1-git-send-email-kraxel@redhat.com> References: <1315381115-6171-1-git-send-email-kraxel@redhat.com> Subject: [Qemu-devel] [PATCH 6/6] spice: workaround a spice server bug. List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Gerd Hoffmann spice server might call the channel_event callback from spice server thread context. Detect that and aquire iothread lock if needed, --- ui/spice-core.c | 25 ++++++++++++++++++++++++- 1 files changed, 24 insertions(+), 1 deletions(-) diff --git a/ui/spice-core.c b/ui/spice-core.c index dba11f0..3cbc721 100644 --- a/ui/spice-core.c +++ b/ui/spice-core.c @@ -19,6 +19,7 @@ #include #include +#include #include "qemu-common.h" #include "qemu-spice.h" @@ -44,6 +45,8 @@ static char *auth_passwd; static time_t auth_expires = TIME_MAX; int using_spice = 0; +static pthread_t me; + struct SpiceTimer { QEMUTimer *timer; QTAILQ_ENTRY(SpiceTimer) next; @@ -217,6 +220,20 @@ static void channel_event(int event, SpiceChannelEventInfo *info) QDict *server, *client; QObject *data; + /* + * Spice server might have called us from spice worker thread + * context (happens on display channel disconnects). Spice should + * not do that. It isn't that easy to fix it in spice and even + * when it is fixed we still should cover the already released + * spice versions. So detect that we've been called from another + * thread and grab the iothread lock if so before calling qemu + * functions. + */ + bool need_lock = !pthread_equal(me, pthread_self()); + if (need_lock) { + qemu_mutex_lock_iothread(); + } + client = qdict_new(); add_addr_info(client, &info->paddr, info->plen); @@ -236,6 +253,10 @@ static void channel_event(int event, SpiceChannelEventInfo *info) QOBJECT(client), QOBJECT(server)); monitor_protocol_event(qevent[event], data); qobject_decref(data); + + if (need_lock) { + qemu_mutex_unlock_iothread(); + } } #else /* SPICE_INTERFACE_CORE_MINOR >= 3 */ @@ -482,7 +503,9 @@ void qemu_spice_init(void) spice_image_compression_t compression; spice_wan_compression_t wan_compr; - if (!opts) { + me = pthread_self(); + + if (!opts) { return; } port = qemu_opt_get_number(opts, "port", 0); -- 1.7.1