From patchwork Tue Feb 4 15:40:24 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Igor Druzhinin X-Patchwork-Id: 11364893 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 49254112B for ; Tue, 4 Feb 2020 15:41:31 +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 24D3F2082E for ; Tue, 4 Feb 2020 15:41:31 +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="I+L0NToX" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 24D3F2082E 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 1iz0JZ-00037K-Ha; Tue, 04 Feb 2020 15:40:37 +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 1iz0JY-000372-C1 for xen-devel@lists.xenproject.org; Tue, 04 Feb 2020 15:40:36 +0000 X-Inumbo-ID: acf66244-4764-11ea-8f8e-12813bfff9fa Received: from esa5.hc3370-68.iphmx.com (unknown [216.71.155.168]) by us1-amaz-eas2.inumbo.com (Halon) with ESMTPS id acf66244-4764-11ea-8f8e-12813bfff9fa; Tue, 04 Feb 2020 15:40:31 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=citrix.com; s=securemail; t=1580830831; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version; bh=73Jw+oAeyfGy7O7wiCCbk0PYWAgVMSfgNN2w6d71k0c=; b=I+L0NToX4hjGyjY3ulsu7lD2kvMf1o2l5PIKR5tnogwt8PaOztgnpum8 s4POCvnEi/iZs8TgznKjslo0yqKrQEop+cS71y9RlJOeHqHNXo6niAZ3y okjPUMksqS+X4CMYyv6QgOceuDPPK/kdizSycI4ex3LnnDRNAC0mjcduU g=; Authentication-Results: esa5.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 (esa5.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=esa5.hc3370-68.iphmx.com; envelope-from="igor.druzhinin@citrix.com"; x-sender="igor.druzhinin@citrix.com"; x-conformance=sidf_compatible Received-SPF: Pass (esa5.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=esa5.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 (esa5.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=esa5.hc3370-68.iphmx.com; envelope-from="igor.druzhinin@citrix.com"; x-sender="postmaster@mail.citrix.com"; x-conformance=sidf_compatible IronPort-SDR: KvgxjoDCIz+3G5npuWHtW8eNMyhn9gVOjbG6wF+Tlddz1NKOLIOy/g/SO1PDC5PMBajgUFogyR Q6svIRyL4JYg+wj8fnxpkUxaISIJ4+8rQRKJu15Zmo06thjpAE8qfbZptYXEyx6xANZ3sgNXtS X2EndHiIuN6OBfsFmhKACDtC/N0RGc/UMsC6slc5tOsbbCfPUqArzOrleAHZpuoSnBLeWwRfHy 2HfQJ0qislR8FMoaS1vxlanOfvBUFPpCZz/11luNz7kmm04RjAvSiU5wAsiRcVUTBsuQI6MkEN Q8I= X-SBRS: 2.7 X-MesageID: 12295793 X-Ironport-Server: esa5.hc3370-68.iphmx.com X-Remote-IP: 162.221.158.21 X-Policy: $RELAYED X-IronPort-AV: E=Sophos;i="5.70,402,1574139600"; d="scan'208";a="12295793" From: Igor Druzhinin To: Date: Tue, 4 Feb 2020 15:40:24 +0000 Message-ID: <1580830825-18767-2-git-send-email-igor.druzhinin@citrix.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1580830825-18767-1-git-send-email-igor.druzhinin@citrix.com> References: <1580830825-18767-1-git-send-email-igor.druzhinin@citrix.com> MIME-Version: 1.0 Subject: [Xen-devel] [PATCH 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 that they do would simply be ignored there. Additionally, add resume callback for Xen PV clocksource to avoid its breakage on migration. Signed-off-by: Igor Druzhinin --- 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