From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:51997) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1V3gyw-0004SM-EX for qemu-devel@nongnu.org; Mon, 29 Jul 2013 02:31:05 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1V3gyq-0002r3-Ew for qemu-devel@nongnu.org; Mon, 29 Jul 2013 02:30:58 -0400 Received: from mx1.redhat.com ([209.132.183.28]:35642) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1V3gyq-0002qx-5f for qemu-devel@nongnu.org; Mon, 29 Jul 2013 02:30:52 -0400 Message-ID: <51F60C02.6020008@redhat.com> Date: Mon, 29 Jul 2013 08:30:26 +0200 From: Paolo Bonzini MIME-Version: 1.0 References: <1375067768-11342-1-git-send-email-pingfank@linux.vnet.ibm.com> <1375067768-11342-4-git-send-email-pingfank@linux.vnet.ibm.com> In-Reply-To: <1375067768-11342-4-git-send-email-pingfank@linux.vnet.ibm.com> Content-Type: text/plain; charset=ISO-8859-15 Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [RFC v2 3/5] timer: make qemu_clock_enable sync between disable and timer's cb List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Liu Ping Fan Cc: Kevin Wolf , Stefan Hajnoczi , Jan Kiszka , qemu-devel@nongnu.org, Alex Bligh , Anthony Liguori Il 29/07/2013 05:16, Liu Ping Fan ha scritto: > After disabling the QemuClock, we should make sure that no QemuTimers > are still in flight. To implement that, the caller of disabling will > wait until the last user's exit. > > Note, the callers of qemu_clock_enable() should be sync by themselves, > not protected by this patch. > > Signed-off-by: Liu Ping Fan This is an interesting approach. > - if (!clock->enabled) > - return; > + atomic_inc(&clock->using); > + if (unlikely(!clock->enabled)) { > + goto exit; > + } This can return directly, it doesn't need to increment and decrement clock->using. Paolo > > current_time = qemu_get_clock_ns(clock); > tlist = clock_to_timerlist(clock); > @@ -461,6 +482,15 @@ void qemu_run_timers(QEMUClock *clock) > /* run the callback (the timer list can be modified) */ > ts->cb(ts->opaque); > } > + > +exit: > + qemu_mutex_lock(&clock->lock); > + if (atomic_fetch_dec(&clock->using) == 1) { > + if (unlikely(!clock->enabled)) { > + qemu_cond_signal(&clock->wait_using); > + } > + } > + qemu_mutex_unlock(&clock->lock); > } > > int64_t qemu_get_clock_ns(QEMUClock *clock) >