From patchwork Mon Aug 5 07:33:26 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: pingfank@linux.vnet.ibm.com X-Patchwork-Id: 264593 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 960502C007E for ; Mon, 5 Aug 2013 17:50:21 +1000 (EST) Received: from localhost ([::1]:44140 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1V6FL9-0003QW-4q for incoming@patchwork.ozlabs.org; Mon, 05 Aug 2013 03:36:27 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49509) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1V6FJ5-0000RO-3R for qemu-devel@nongnu.org; Mon, 05 Aug 2013 03:34:28 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1V6FIr-0006FS-Mn for qemu-devel@nongnu.org; Mon, 05 Aug 2013 03:34:19 -0400 Received: from e23smtp03.au.ibm.com ([202.81.31.145]:38784) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1V6FIq-0006Er-GV for qemu-devel@nongnu.org; Mon, 05 Aug 2013 03:34:05 -0400 Received: from /spool/local by e23smtp03.au.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Mon, 5 Aug 2013 17:23:22 +1000 Received: from d23dlp01.au.ibm.com (202.81.31.203) by e23smtp03.au.ibm.com (202.81.31.209) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Mon, 5 Aug 2013 17:23:21 +1000 Received: from d23relay04.au.ibm.com (d23relay04.au.ibm.com [9.190.234.120]) by d23dlp01.au.ibm.com (Postfix) with ESMTP id 002BE2CE8053 for ; Mon, 5 Aug 2013 17:33:55 +1000 (EST) Received: from d23av04.au.ibm.com (d23av04.au.ibm.com [9.190.235.139]) by d23relay04.au.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r757IGs464290876 for ; Mon, 5 Aug 2013 17:18:16 +1000 Received: from d23av04.au.ibm.com (loopback [127.0.0.1]) by d23av04.au.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id r757XrMO018512 for ; Mon, 5 Aug 2013 17:33:54 +1000 Received: from localhost ([9.115.122.107]) by d23av04.au.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id r757Xrjh018494; Mon, 5 Aug 2013 17:33:53 +1000 From: Liu Ping Fan To: qemu-devel@nongnu.org Date: Mon, 5 Aug 2013 15:33:26 +0800 Message-Id: <1375688006-16780-5-git-send-email-pingfank@linux.vnet.ibm.com> X-Mailer: git-send-email 1.8.1.4 In-Reply-To: <1375688006-16780-1-git-send-email-pingfank@linux.vnet.ibm.com> References: <1375688006-16780-1-git-send-email-pingfank@linux.vnet.ibm.com> X-Content-Scanned: Fidelis XPS MAILER x-cbid: 13080507-6102-0000-0000-000003F82C34 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.4.x-2.6.x [generic] X-Received-From: 202.81.31.145 Cc: Kevin Wolf , Stefan Hajnoczi , Jan Kiszka , Alex Bligh , Paolo Bonzini , MORITA Kazutaka Subject: [Qemu-devel] [PATCH 4/4] timer: make qemu_clock_enable sync between disable and timer's cb 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 After disabling the QemuClock, we should make sure that no QemuTimers are still in flight. To implement that with light overhead, we resort to QemuEvent. The caller of disabling will wait on QemuEvent of each timerlist. Note, qemu_clock_enable(foo,false) can _not_ be called from timer's cb. And the callers of qemu_clock_enable() should be sync by themselves, not protected by this patch. Signed-off-by: Liu Ping Fan --- include/qemu/timer.h | 1 + qemu-timer.c | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/include/qemu/timer.h b/include/qemu/timer.h index 1363316..ca09ba2 100644 --- a/include/qemu/timer.h +++ b/include/qemu/timer.h @@ -85,6 +85,7 @@ int64_t timerlistgroup_deadline_ns(QEMUTimerListGroup tlg); int qemu_timeout_ns_to_ms(int64_t ns); int qemu_poll_ns(GPollFD *fds, uint nfds, int64_t timeout); +/* The disable of clock can not be called in timer's cb */ void qemu_clock_enable(QEMUClock *clock, bool enabled); void qemu_clock_warp(QEMUClock *clock); diff --git a/qemu-timer.c b/qemu-timer.c index ebe7597..5828107 100644 --- a/qemu-timer.c +++ b/qemu-timer.c @@ -71,6 +71,8 @@ struct QEMUTimerList { QLIST_ENTRY(QEMUTimerList) list; QEMUTimerListNotifyCB *notify_cb; void *notify_opaque; + /* light weight method to mark the end of timerlist's running */ + QemuEvent ev; }; struct QEMUTimer { @@ -92,6 +94,7 @@ static QEMUTimerList *timerlist_new_from_clock(QEMUClock *clock) QEMUTimerList *tl; tl = g_malloc0(sizeof(QEMUTimerList)); + qemu_event_init(&tl->ev, false); tl->clock = clock; QLIST_INSERT_HEAD(&clock->timerlists, tl, list); return tl; @@ -145,12 +148,18 @@ void qemu_clock_notify(QEMUClock *clock) } } +/* The disable of clock can _not_ be called from timer's cb */ void qemu_clock_enable(QEMUClock *clock, bool enabled) { + QEMUTimerList *tl; bool old = clock->enabled; clock->enabled = enabled; if (enabled && !old) { qemu_clock_notify(clock); + } else if (!enabled && old) { + QLIST_FOREACH(tl, &clock->timerlists, list) { + qemu_event_wait(&tl->ev); + } } } @@ -419,6 +428,7 @@ bool timerlist_run_timers(QEMUTimerList *tl) } current_time = qemu_get_clock_ns(tl->clock); + qemu_event_reset(&tl->ev); for(;;) { ts = tl->active_timers; if (!qemu_timer_expired_ns(ts, current_time)) { @@ -432,6 +442,7 @@ bool timerlist_run_timers(QEMUTimerList *tl) ts->cb(ts->opaque); progress = true; } + qemu_event_set(&tl->ev); return progress; }