From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:35302) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZAiWI-0004zL-8f for qemu-devel@nongnu.org; Thu, 02 Jul 2015 13:43:31 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZAiWA-0006ft-LT for qemu-devel@nongnu.org; Thu, 02 Jul 2015 13:43:30 -0400 Received: from mail-la0-x233.google.com ([2a00:1450:4010:c03::233]:35765) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZAiWA-0006fh-Cu for qemu-devel@nongnu.org; Thu, 02 Jul 2015 13:43:22 -0400 Received: by lagh6 with SMTP id h6so65926814lag.2 for ; Thu, 02 Jul 2015 10:43:21 -0700 (PDT) Message-ID: <55957836.3080807@gmail.com> Date: Thu, 02 Jul 2015 20:43:18 +0300 From: Dmitry Osipenko MIME-Version: 1.0 References: <55952A1D.2030806@gmail.com> <1435857603-30613-1-git-send-email-digetx@gmail.com> In-Reply-To: Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Subject: Re: [Qemu-devel] [PATCH v2] arm_mptimer: Fix timer shutdown List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Peter Maydell Cc: Paolo Bonzini , Peter Crosthwaite , QEMU Developers 02.07.2015 20:34, Peter Maydell пишет: > On 2 July 2015 at 18:20, Dmitry Osipenko wrote: >> Timer, running in periodic mode, can't be stopped or coming one-shot tick >> won't be canceled because timer control code just doesn't handle timer >> disabling. Fix it by deleting timer if enable bit isn't set. >> >> Signed-off-by: Dmitry Osipenko >> --- >> >> v2: Avoid calling timer_del() if the timer was already disabled as per >> Peter Maydell suggestion. >> >> hw/timer/arm_mptimer.c | 8 +++++++- >> 1 file changed, 7 insertions(+), 1 deletion(-) >> >> diff --git a/hw/timer/arm_mptimer.c b/hw/timer/arm_mptimer.c >> index 8b93b3c..51c18de 100644 >> --- a/hw/timer/arm_mptimer.c >> +++ b/hw/timer/arm_mptimer.c >> @@ -122,11 +122,17 @@ static void timerblock_write(void *opaque, hwaddr addr, >> case 8: /* Control. */ >> old = tb->control; >> tb->control = value; >> - if (((old & 1) == 0) && (value & 1)) { >> + if (((old & 1) == 0) && ((value & 1) == 0)) { >> + break; >> + } >> + if (value & 1) { >> if (tb->count == 0 && (tb->control & 2)) { >> tb->count = tb->load; >> } >> timerblock_reload(tb, 1); >> + } else { >> + /* Shutdown timer. */ >> + timer_del(tb->timer); > > > This will now cause us to do the "reload the timer" > logic if you write a 1 to the control bit when it was > already 1, which we didn't do before. > > The logic I suggested in my previous review > comment gets this right... > > -- PMM > Yep, you right. I overlooked it, let me try again. -- Dmitry