From patchwork Wed Jan 10 09:33:11 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pavel Dovgalyuk X-Patchwork-Id: 10154641 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 2B08860231 for ; Wed, 10 Jan 2018 09:34:05 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 21AAA25EA6 for ; Wed, 10 Jan 2018 09:34:05 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 15ED7260CD; Wed, 10 Jan 2018 09:34:05 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=2.0 tests=BAYES_00,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 2F14F25EA6 for ; Wed, 10 Jan 2018 09:34:03 +0000 (UTC) Received: from localhost ([::1]:56698 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eZClm-0007sx-IM for patchwork-qemu-devel@patchwork.kernel.org; Wed, 10 Jan 2018 04:34:02 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:54611) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eZCl3-0007Vm-U7 for qemu-devel@nongnu.org; Wed, 10 Jan 2018 04:33:20 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eZCkz-00067d-1Y for qemu-devel@nongnu.org; Wed, 10 Jan 2018 04:33:17 -0500 Received: from mail.ispras.ru ([83.149.199.45]:32794) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eZCky-00064g-LF for qemu-devel@nongnu.org; Wed, 10 Jan 2018 04:33:12 -0500 Received: from PASHAISP (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id 3B6E554006A; Wed, 10 Jan 2018 12:33:10 +0300 (MSK) From: "Pavel Dovgalyuk" To: References: <20171220100205.16625.84632.stgit@pasha-VirtualBox> <003c01d38923$1c5157f0$54f407d0$@ru> <87efmz1ddp.fsf@secure.laptop> <004301d38940$56013bb0$0203b310$@ru> <87zi5nyyap.fsf@secure.laptop> In-Reply-To: <87zi5nyyap.fsf@secure.laptop> Date: Wed, 10 Jan 2018 12:33:11 +0300 Message-ID: <001601d389f6$0816d2f0$184478d0$@ru> MIME-Version: 1.0 X-Mailer: Microsoft Office Outlook 12.0 Thread-Index: AdOJSwAITlsaM9ZzREmwXuN6/WP68AAqsQwA Content-Language: ru X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 83.149.199.45 Subject: Re: [Qemu-devel] [PATCH v2] hpet: recover timer offset correctly X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: mst@redhat.com, dgilbert@redhat.com, qemu-devel@nongnu.org, maria.klimushenkova@ispras.ru, 'Pavel Dovgalyuk' , pbonzini@redhat.com Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP > From: Juan Quintela [mailto:quintela@redhat.com] > "Pavel Dovgalyuk" wrote: > >> From: Juan Quintela [mailto:quintela@redhat.com] > If you *don't* use a needed function then please just increase the > version. You are just breaking compatibility anyways. The whole point > of subsections is that they are optional. If they are mandatory (this > case), then they bring no advantage at all. Thanks, I thought that the sections are skipped automatically when there is no code for loading them. > What dave is asked for your previous version is that you disable the > section for old machine types. Look at how to use DEFINE_PROP_* for > this use case. How do you like this one? Pavel Dovgalyuk Reviewed-by: Juan Quintela diff --git a/hw/timer/hpet.c b/hw/timer/hpet.c index 577371b..539586f 100644 --- a/hw/timer/hpet.c +++ b/hw/timer/hpet.c @@ -70,6 +70,7 @@ typedef struct HPETState { MemoryRegion iomem; uint64_t hpet_offset; + bool hpet_offset_saved; qemu_irq irqs[HPET_NUM_IRQ_ROUTES]; uint32_t flags; uint8_t rtc_irq_level; @@ -221,7 +222,9 @@ static int hpet_pre_save(void *opaque) HPETState *s = opaque; /* save current counter value */ - s->hpet_counter = hpet_get_ticks(s); + if (hpet_enabled(s)) { + s->hpet_counter = hpet_get_ticks(s); + } return 0; } @@ -252,7 +255,10 @@ static int hpet_post_load(void *opaque, int version_id) HPETState *s = opaque; /* Recalculate the offset between the main counter and guest time */ - s->hpet_offset = ticks_to_ns(s->hpet_counter) - qemu_clock_get_ns(QEMU_CLOC + if (!s->hpet_offset_saved) { + s->hpet_offset = ticks_to_ns(s->hpet_counter) + - qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL); + } /* Push number of timers into capability returned via HPET_ID */ s->capability &= ~HPET_ID_NUM_TIM_MASK; @@ -267,6 +273,13 @@ static int hpet_post_load(void *opaque, int version_id) return 0; } +static bool hpet_offset_needed(void *opaque) +{ + HPETState *s = opaque; + + return s->hpet_offset_saved; +} + static bool hpet_rtc_irq_level_needed(void *opaque) { HPETState *s = opaque; @@ -285,6 +298,17 @@ static const VMStateDescription vmstate_hpet_rtc_irq_level } }; +static const VMStateDescription vmstate_hpet_offset = { + .name = "hpet/offset", + .version_id = 1, + .minimum_version_id = 1, + .needed = hpet_offset_needed, + .fields = (VMStateField[]) { + VMSTATE_UINT64(hpet_offset, HPETState), + VMSTATE_END_OF_LIST() + } +}; + static const VMStateDescription vmstate_hpet_timer = { .name = "hpet_timer", .version_id = 1, @@ -320,6 +344,7 @@ static const VMStateDescription vmstate_hpet = { }, .subsections = (const VMStateDescription*[]) { &vmstate_hpet_rtc_irq_level, + &vmstate_hpet_offset, NULL } }; @@ -762,6 +787,7 @@ static Property hpet_device_properties[] = { DEFINE_PROP_UINT8("timers", HPETState, num_timers, HPET_MIN_TIMERS), DEFINE_PROP_BIT("msi", HPETState, flags, HPET_MSI_SUPPORT, false), DEFINE_PROP_UINT32(HPET_INTCAP, HPETState, intcap, 0), + DEFINE_PROP_BOOL("hpet-offset-saved", HPETState, hpet_offset_saved, true), DEFINE_PROP_END_OF_LIST(), }; diff --git a/include/hw/compat.h b/include/hw/compat.h index 263de97..8897302 100644 --- a/include/hw/compat.h +++ b/include/hw/compat.h @@ -13,6 +13,10 @@ .driver = "virtio-tablet-device",\ .property = "wheel-axis",\ .value = "false",\ + },{\ + .driver = "hpet",\ + .property = "hpet-offset-saved",\ + .value = "off",\ }, #define HW_COMPAT_2_9 \