From patchwork Tue Feb 4 21:49:36 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Igor Druzhinin X-Patchwork-Id: 11365297 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 181B392A for ; Tue, 4 Feb 2020 21:51:17 +0000 (UTC) Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id E88E72084E for ; Tue, 4 Feb 2020 21:51:16 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=citrix.com header.i=@citrix.com header.b="QpkrgyHd" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org E88E72084E Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=citrix.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1iz64w-0000xl-Cj; Tue, 04 Feb 2020 21:49:54 +0000 Received: from all-amaz-eas1.inumbo.com ([34.197.232.57] helo=us1-amaz-eas2.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1iz64v-0000xV-Jj for xen-devel@lists.xenproject.org; Tue, 04 Feb 2020 21:49:53 +0000 X-Inumbo-ID: 42a59160-4798-11ea-9026-12813bfff9fa Received: from esa3.hc3370-68.iphmx.com (unknown [216.71.145.155]) by us1-amaz-eas2.inumbo.com (Halon) with ESMTPS id 42a59160-4798-11ea-9026-12813bfff9fa; Tue, 04 Feb 2020 21:49:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=citrix.com; s=securemail; t=1580852988; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version; bh=tSvnExCdFXARkrtaSkB6c/ckGLd1WaztgIQX2KGRvAw=; b=QpkrgyHdxCtKJ8h1yD9612pwMnpE5gR5ga0L95Xob56DuUskf5joN77c xeePPYgZTyeTUENa3oSXh5zrav+wyDs6I82FqPcbjEB5d5c1WCpWjBrtN KINVYwGKVEhdwTLgpW9oxOcoop/6AffD8NqwWSU+8zlb1xLxuHE5k6fps Y=; Authentication-Results: esa3.hc3370-68.iphmx.com; dkim=none (message not signed) header.i=none; spf=None smtp.pra=igor.druzhinin@citrix.com; spf=Pass smtp.mailfrom=igor.druzhinin@citrix.com; spf=None smtp.helo=postmaster@mail.citrix.com Received-SPF: None (esa3.hc3370-68.iphmx.com: no sender authenticity information available from domain of igor.druzhinin@citrix.com) identity=pra; client-ip=162.221.158.21; receiver=esa3.hc3370-68.iphmx.com; envelope-from="igor.druzhinin@citrix.com"; x-sender="igor.druzhinin@citrix.com"; x-conformance=sidf_compatible Received-SPF: Pass (esa3.hc3370-68.iphmx.com: domain of igor.druzhinin@citrix.com designates 162.221.158.21 as permitted sender) identity=mailfrom; client-ip=162.221.158.21; receiver=esa3.hc3370-68.iphmx.com; envelope-from="igor.druzhinin@citrix.com"; x-sender="igor.druzhinin@citrix.com"; x-conformance=sidf_compatible; x-record-type="v=spf1"; x-record-text="v=spf1 ip4:209.167.231.154 ip4:178.63.86.133 ip4:195.66.111.40/30 ip4:85.115.9.32/28 ip4:199.102.83.4 ip4:192.28.146.160 ip4:192.28.146.107 ip4:216.52.6.88 ip4:216.52.6.188 ip4:162.221.158.21 ip4:162.221.156.83 ip4:168.245.78.127 ~all" Received-SPF: None (esa3.hc3370-68.iphmx.com: no sender authenticity information available from domain of postmaster@mail.citrix.com) identity=helo; client-ip=162.221.158.21; receiver=esa3.hc3370-68.iphmx.com; envelope-from="igor.druzhinin@citrix.com"; x-sender="postmaster@mail.citrix.com"; x-conformance=sidf_compatible IronPort-SDR: xHRvshM94kiPk2A4g4iQIs4HIZUOOMzy4aLRsi1QVBkD5y1oG3SIZkvl85CwchBuOL2/3Ou9g8 2gc4yUtFi2ZZiCdglsVjFzyT/H/+x4dq9JR+kHddVlY8tF/T8jRtf77fH2JcZW3x/gjj57j9F5 mF2B1rPdLDGcj2N6odBIfx15MV9ytKctO1xqldaV/kAVz52YmDRSj2h9v4QrSqUWs7KY4bXGeY ieyZxPF5fIfUquDmgtbiTZeGkYe+9gXTq5PfbpI6hAGqnxAENFhZNS++sXe2K1yx0cJaJ5PCKw gDw= X-SBRS: 2.7 X-MesageID: 11944113 X-Ironport-Server: esa3.hc3370-68.iphmx.com X-Remote-IP: 162.221.158.21 X-Policy: $RELAYED X-IronPort-AV: E=Sophos;i="5.70,403,1574139600"; d="scan'208";a="11944113" From: Igor Druzhinin To: Date: Tue, 4 Feb 2020 21:49:36 +0000 Message-ID: <1580852977-23866-2-git-send-email-igor.druzhinin@citrix.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1580852977-23866-1-git-send-email-igor.druzhinin@citrix.com> References: <1580852977-23866-1-git-send-email-igor.druzhinin@citrix.com> MIME-Version: 1.0 Subject: [Xen-devel] [PATCH v2 1/2] x86/shim: suspend and resume platform time correctly X-BeenThere: xen-devel@lists.xenproject.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Cc: andrew.cooper3@citrix.com, Igor Druzhinin , wl@xen.org, jbeulich@suse.com, roger.pau@citrix.com Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" Similarly to S3, platform time needs to be saved on guest suspend and restored on resume respectively. This should account for expected jumps in PV clock counter value after resume. time_suspend/resume() are safe to use in PVH setting as is since any existing operations with PIT/HPET that they do would simply be ignored if PIT/HPET is not present. Additionally, add resume callback for Xen PV clocksource to avoid its breakage on migration. Signed-off-by: Igor Druzhinin Reviewed-by: Roger Pau Monné --- xen/arch/x86/pv/shim.c | 7 ++++++- xen/arch/x86/time.c | 12 +++++++++--- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/xen/arch/x86/pv/shim.c b/xen/arch/x86/pv/shim.c index 7a898fd..6b26eaa 100644 --- a/xen/arch/x86/pv/shim.c +++ b/xen/arch/x86/pv/shim.c @@ -325,9 +325,13 @@ int pv_shim_shutdown(uint8_t reason) if ( v != current ) vcpu_pause_by_systemcontroller(v); + /* Prepare timekeeping code to suspend.*/ + time_suspend(); + rc = xen_hypercall_shutdown(SHUTDOWN_suspend); if ( rc ) { + time_resume(); for_each_vcpu ( d, v ) if ( v != current ) vcpu_unpause_by_systemcontroller(v); @@ -335,8 +339,9 @@ int pv_shim_shutdown(uint8_t reason) return rc; } - /* Resume the shim itself first. */ + /* Resume the shim itself and timekeeping first. */ hypervisor_resume(); + time_resume(); /* * ATM there's nothing Xen can do if the console/store pfn changes, diff --git a/xen/arch/x86/time.c b/xen/arch/x86/time.c index f6b26f8..7e7a62e 100644 --- a/xen/arch/x86/time.c +++ b/xen/arch/x86/time.c @@ -565,6 +565,7 @@ static struct platform_timesource __initdata plt_tsc = * * Xen clock source is a variant of TSC source. */ +static uint64_t xen_timer_last; static uint64_t xen_timer_cpu_frequency(void) { @@ -610,7 +611,6 @@ static uint64_t read_xen_timer(void) uint32_t version; uint64_t ret; uint64_t last; - static uint64_t last_value; do { version = info->version & ~1; @@ -626,20 +626,26 @@ static uint64_t read_xen_timer(void) /* Maintain a monotonic global value */ do { - last = read_atomic(&last_value); + last = read_atomic(&xen_timer_last); if ( ret < last ) return last; - } while ( unlikely(cmpxchg(&last_value, last, ret) != last) ); + } while ( unlikely(cmpxchg(&xen_timer_last, last, ret) != last) ); return ret; } +static void resume_xen_timer(struct platform_timesource *pts) +{ + write_atomic(&xen_timer_last, 0); +} + static struct platform_timesource __initdata plt_xen_timer = { .id = "xen", .name = "XEN PV CLOCK", .read_counter = read_xen_timer, .init = init_xen_timer, + .resume = resume_xen_timer, .counter_bits = 63, }; #endif