From patchwork Tue May 7 05:47:02 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: pingfan liu X-Patchwork-Id: 241989 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 77FD32C0156 for ; Tue, 7 May 2013 15:54:37 +1000 (EST) Received: from localhost ([::1]:46042 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UZarD-000430-Ng for incoming@patchwork.ozlabs.org; Tue, 07 May 2013 01:54:35 -0400 Received: from eggs.gnu.org ([208.118.235.92]:60891) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UZanr-00072c-6r for qemu-devel@nongnu.org; Tue, 07 May 2013 01:51:08 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UZanq-00006A-9H for qemu-devel@nongnu.org; Tue, 07 May 2013 01:51:07 -0400 Received: from mail-yh0-x229.google.com ([2607:f8b0:4002:c01::229]:53007) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UZanq-000066-4Y for qemu-devel@nongnu.org; Tue, 07 May 2013 01:51:06 -0400 Received: by mail-yh0-f41.google.com with SMTP id i72so54444yha.14 for ; Mon, 06 May 2013 22:51:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:from:to:cc:subject:date:message-id:x-mailer:in-reply-to :references; bh=4G0/kLow+UWMeZPya3w98IYkSMzLRgX/Pa92BGW1BQk=; b=sX+i7xD5qZt5TWw5/abesUra68POVhFqIy8b5vUJ9UmxHI0FgAIDVOPQJzSo1Y2AwZ aYD7nrHRbT+BFIYDFTQnTImHNqkMnIz4sztCPgU8SViU/Zz5xaZFJVXx8ua8rcdNhiva 0i5M4T6jenMry/T56ak4f8fnzLcsKyE7iprXShgT/QCPgHuzrMygGN3anCRq1caX0hJt P35LNrFZVCtk/u8T9PuTGOEHlih8+gkJXir9VlAYENVghDgpDH3hkfB9ZmNygJG1EftV gmwVkzf5x1918pvTRHM7Kf7QAEtKAMYVIcEvjMtBeQQFl5v2Xev/b8S+0K2U5ESNu5OR DltA== X-Received: by 10.236.128.136 with SMTP id f8mr418389yhi.159.1367905865669; Mon, 06 May 2013 22:51:05 -0700 (PDT) Received: from localhost ([202.108.130.138]) by mx.google.com with ESMTPSA id a24sm53265265yhj.23.2013.05.06.22.50.56 for (version=TLSv1.1 cipher=RC4-SHA bits=128/128); Mon, 06 May 2013 22:51:04 -0700 (PDT) From: Liu Ping Fan To: qemu-devel@nongnu.org Date: Tue, 7 May 2013 13:47:02 +0800 Message-Id: <1367905622-21038-15-git-send-email-qemulist@gmail.com> X-Mailer: git-send-email 1.7.4.4 In-Reply-To: <1367905622-21038-1-git-send-email-qemulist@gmail.com> References: <1367905622-21038-1-git-send-email-qemulist@gmail.com> X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-Received-From: 2607:f8b0:4002:c01::229 Cc: mdroth , Jan Kiszka , Stefan Hajnoczi , Anthony Liguori , Paolo Bonzini Subject: [Qemu-devel] [PATCH v1 14/14] slirp: use lock to protect the slirp_instances X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org From: Liu Ping Fan slirps will run on dedicated thread, and dynamically join or disjoin this list, so need lock to protect the global list. Signed-off-by: Liu Ping Fan --- include/qemu/module.h | 2 ++ slirp/slirp.c | 20 ++++++++++++++++++++ 2 files changed, 22 insertions(+), 0 deletions(-) diff --git a/include/qemu/module.h b/include/qemu/module.h index c4ccd57..2720943 100644 --- a/include/qemu/module.h +++ b/include/qemu/module.h @@ -22,6 +22,7 @@ static void __attribute__((constructor)) do_qemu_init_ ## function(void) { \ typedef enum { MODULE_INIT_BLOCK, + MODULE_INIT_SLIRP, MODULE_INIT_MACHINE, MODULE_INIT_QAPI, MODULE_INIT_QOM, @@ -29,6 +30,7 @@ typedef enum { } module_init_type; #define block_init(function) module_init(function, MODULE_INIT_BLOCK) +#define slirplayer_init(function) module_init(function, MODULE_INIT_SLIRP) #define machine_init(function) module_init(function, MODULE_INIT_MACHINE) #define qapi_init(function) module_init(function, MODULE_INIT_QAPI) #define type_init(function) module_init(function, MODULE_INIT_QOM) diff --git a/slirp/slirp.c b/slirp/slirp.c index 8f5cbe0..3008c7b 100644 --- a/slirp/slirp.c +++ b/slirp/slirp.c @@ -42,6 +42,7 @@ static const uint8_t zero_ethaddr[ETH_ALEN] = { 0, 0, 0, 0, 0, 0 }; u_int curtime; +static QemuMutex slirp_instances_lock; static QTAILQ_HEAD(slirp_instances, Slirp) slirp_instances = QTAILQ_HEAD_INITIALIZER(slirp_instances); @@ -236,14 +237,18 @@ Slirp *slirp_init(int restricted, struct in_addr vnetwork, register_savevm(NULL, "slirp", 0, 3, slirp_state_save, slirp_state_load, slirp); + qemu_mutex_lock(&slirp_instances_lock); QTAILQ_INSERT_TAIL(&slirp_instances, slirp, entry); + qemu_mutex_unlock(&slirp_instances_lock); return slirp; } void slirp_cleanup(Slirp *slirp) { + qemu_mutex_lock(&slirp_instances_lock); QTAILQ_REMOVE(&slirp_instances, slirp, entry); + qemu_mutex_unlock(&slirp_instances_lock); unregister_savevm(NULL, "slirp", slirp); @@ -262,9 +267,12 @@ void slirp_cleanup(Slirp *slirp) void slirp_update_timeout(uint32_t *timeout) { + qemu_mutex_lock(&slirp_instances_lock); if (!QTAILQ_EMPTY(&slirp_instances)) { *timeout = MIN(1000, *timeout); } + qemu_mutex_unlock(&slirp_instances_lock); + curtime = qemu_get_clock_ms(rt_clock); } @@ -1167,3 +1175,15 @@ static int slirp_state_load(QEMUFile *f, void *opaque, int version_id) return 0; } + +static void slirplayer_cleanup(void) +{ + qemu_mutex_destroy(&slirp_instances_lock); +} + +static void slirplayer_bootup(void) +{ + qemu_mutex_init(&slirp_instances_lock); + atexit(&slirplayer_cleanup); +} +slirplayer_init(slirplayer_bootup)