Received: by 2002:a05:6902:102b:0:0:0:0 with SMTP id x11csp461841ybt; Fri, 19 Jun 2020 06:08:09 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyyEV7gVZK6LIZ7VubWW/UgxlUhPaVAaXXVsa22hNMmFOwroA3wAFZgi+n8zPFxztpu8/JK X-Received: by 2002:a17:906:5652:: with SMTP id v18mr3425570ejr.72.1592572089480; Fri, 19 Jun 2020 06:08:09 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1592572089; cv=none; d=google.com; s=arc-20160816; b=BsxJPh1r5f2cbUgcqarIduC59mmc+Nriyi50bGyjL/sqdyuIDlw7EV07Omist/FYTZ hh5e+kq+S0+8BBQZOntUK0QQtRGhGhNZl88Dctuy6MOH16BkV7NpR4fx79YCMNRLGzz3 Py3j+zjdt0qrFD5Unp9Y2OHugUsxX99gPw+kPjVTr/KiCshvIaxCUHxNaZX+qK91SAZj A/5rau0x9k/7sjSS58ffDJSKQEDKsRbhkVDMrRsjYbBdE0TM8urxhTXBTYVHn2Kh3Jl6 B7Xc1oxatDaJucRGrpP9LSx1NsxpD9FWTDg4GncyBNSrab6rwWlwMtfYRssSxN1r6Qx0 18Ig== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from; bh=o9OEF/2uWfJG+pJo/5MOzjeq6n1RMVBaf/ke6zF1NCE=; b=EzPsuhMZ9+Bo16ubMR+QPgxRcE5gcAj0HMQv2jXvC2DxTFj2IDPn1S509Mmmc5rxXP aWrUtcdOUzS9qkOIaOx+8zAvRQwIOWK7BhbBAHJYNJKZNdjozkpFQURy45bNnlgJH8K+ 9kkarLZENTFOebWtLfEmkeCD3W2n/caANcc1zqptPEd7ZsNwbr2CJAQjCkFVFyQCCZv/ EXQeDpXkJFNR132SzTMtX8ECR6fKkw1ZQdlTXVGSzANwbdt4lFrefwBksuu3DdY2qDU1 pPIY5jNdAadxI12CVrbz30CTVqTqj3qR5q7S93SRiImOgcdeetKkC3zdJ9OxSBhyhJ1y sr8A== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id d20si3582858edp.298.2020.06.19.06.07.46; Fri, 19 Jun 2020 06:08:09 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731831AbgFSNBl (ORCPT + 99 others); Fri, 19 Jun 2020 09:01:41 -0400 Received: from foss.arm.com ([217.140.110.172]:57352 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728606AbgFSNBl (ORCPT ); Fri, 19 Jun 2020 09:01:41 -0400 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id B0B73101E; Fri, 19 Jun 2020 06:01:39 -0700 (PDT) Received: from entos-d05.shanghai.arm.com (entos-d05.shanghai.arm.com [10.169.40.35]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 81B593F6CF; Fri, 19 Jun 2020 06:01:33 -0700 (PDT) From: Jianyong Wu To: netdev@vger.kernel.org, yangbo.lu@nxp.com, john.stultz@linaro.org, tglx@linutronix.de, pbonzini@redhat.com, sean.j.christopherson@intel.com, maz@kernel.org, richardcochran@gmail.com, Mark.Rutland@arm.com, will@kernel.org, suzuki.poulose@arm.com, steven.price@arm.com Cc: linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, kvmarm@lists.cs.columbia.edu, kvm@vger.kernel.org, Steve.Capper@arm.com, Kaly.Xin@arm.com, justin.he@arm.com, Wei.Chen@arm.com, jianyong.wu@arm.com, nd@arm.com Subject: [PATCH v13 0/9] Enable ptp_kvm for arm64 Date: Fri, 19 Jun 2020 21:01:11 +0800 Message-Id: <20200619130120.40556-1-jianyong.wu@arm.com> X-Mailer: git-send-email 2.17.1 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Currently, we offen use ntp (sync time with remote network clock) to sync time in VM. But the precision of ntp is subject to network delay so it's difficult to sync time in a high precision. kvm virtual ptp clock (ptp_kvm) offers another way to sync time in VM, as the remote clock locates in the host instead of remote network clock. It targets to sync time between guest and host in virtualization environment and in this way, we can keep the time of all the VMs running in the same host in sync. In general, the delay of communication between host and guest is quiet small, so ptp_kvm can offer time sync precision up to in order of nanosecond. Please keep in mind that ptp_kvm just limits itself to be a channel which transmit the remote clock from host to guest and leaves the time sync jobs to an application, eg. chrony, in usersapce in VM. How ptp_kvm works: After ptp_kvm initialized, there will be a new device node under /dev called ptp%d. A guest userspace service, like chrony, can use this device to get host walltime, sometimes also counter cycle, which depends on the service it calls. Then this guest userspace service can use those data to do the time sync for guest. here is a rough sketch to show how kvm ptp clock works. |----------------------------| |--------------------------| | guest userspace | | host | |ioctl -> /dev/ptp%d | | | | ^ | | | | |----------------------------| | | | | | guest kernel | | | | | V (get host walltime/counter cycle) | | ptp_kvm -> hypercall - - - - - - - - - - ->hypercall service | | <- - - - - - - - - - - - | |----------------------------| |--------------------------| 1. time sync service in guest userspace call ptp device through /dev/ptp%d. 2. ptp_kvm module in guest recive this request then invoke hypercall to route into host kernel to request host walltime/counter cycle. 3. ptp_kvm hypercall service in host response to the request and send data back. 4. ptp (not ptp_kvm) in guest copy the data to userspace. This ptp_kvm implementation focuses itself to step 2 and 3 and step 2 works in guest comparing step 3 works in host kernel. change log: from v12 to v13: (1) rebase code on 5.8-rc1. (2) this patch set base on 2 patches of 1/8 and 2/8 from Will Decon. (3) remove the change to ptp device code of extend getcrosststamp. (4) remove the mechanism of letting user choose the counter type in ptp_kvm for arm64. (5) add virtual counter option in ptp_kvm service to let user choose the specific counter explicitly. from v11 to v12: (1) rebase code on 5.7-rc6 and rebase 2 patches from Will Decon including 1/11 and 2/11. as these patches introduce discover mechanism of vendor smccc service. (2) rebase ptp_kvm hypercall service from standard smccc to vendor smccc and add ptp_kvm to vendor smccc service discover mechanism. (3) add detail of why we need ptp_kvm and how ptp_kvm works in cover letter. from v10 to v11: (1) rebase code on 5.7-rc2. (2) remove support for arm32, as kvm support for arm32 will be removed [1] (3) add error report in ptp_kvm initialization. from v9 to v10: (1) change code base to v5.5. (2) enable ptp_kvm both for arm32 and arm64. (3) let user choose which of virtual counter or physical counter should return when using crosstimestamp mode of ptp_kvm for arm/arm64. (4) extend input argument for getcrosstimestamp API. from v8 to v9: (1) move ptp_kvm.h to driver/ptp/ (2) replace license declaration of ptp_kvm.h the same with other header files in the same directory. from v7 to v8: (1) separate adding clocksource id for arm_arch_counter as a single patch. (2) update commit message for patch 4/8. (3) refine patch 7/8 and patch 8/8 to make them more independent. from v6 to v7: (1) include the omitted clocksource_id.h in last version. (2) reorder the header file in patch. (3) refine some words in commit message to make it more impersonal. from v5 to v6: (1) apply Mark's patch[4] to get SMCCC conduit. (2) add mechanism to recognize current clocksource by add clocksouce_id value into struct clocksource instead of method in patch-v5. (3) rename kvm_arch_ptp_get_clock_fn into kvm_arch_ptp_get_crosststamp. from v3 to v4: (1) fix clocksource of ptp_kvm to arch_sys_counter. (2) move kvm_arch_ptp_get_clock_fn into arm_arch_timer.c (3) subtract cntvoff before return cycles from host. (4) use ktime_get_snapshot instead of getnstimeofday and get_current_counterval to return time and counter value. (5) split ktime and counter into two 32-bit block respectively to avoid Y2038-safe issue. (6) set time compensation to device time as half of the delay of hvc call. (7) add ARM_ARCH_TIMER as dependency of ptp_kvm for arm64. from v2 to v3: (1) fix some issues in commit log. (2) add some receivers in send list. from v1 to v2: (1) move arch-specific code from arch/ to driver/ptp/ (2) offer mechanism to inform userspace if ptp_kvm service is available. (3) separate ptp_kvm code for arm64 into hypervisor part and guest part. (4) add API to expose monotonic clock and counter value. (5) refine code: remove no necessary part and reconsitution. [1] https://patchwork.kernel.org/cover/11373351/ Jianyong Wu (7): arm/arm64: KVM: Advertise KVM UID to guests via SMCCC smccc: export smccc conduit get helper. ptp: Reorganize ptp_kvm modules to make it arch-independent. clocksource: Add clocksource id for arm arch counter arm64/kvm: Add hypercall service for kvm ptp. ptp: arm64: Enable ptp_kvm for arm64 arm64: Add kvm capability check extension for ptp_kvm Thomas Gleixner (1): time: Add mechanism to recognize clocksource in time_get_snapshot Will Deacon (1): arm64: Probe for the presence of KVM hypervisor services during boot arch/arm64/include/asm/hypervisor.h | 11 +++ arch/arm64/kernel/setup.c | 36 +++++++++ arch/arm64/kvm/arm.c | 4 + arch/arm64/kvm/hypercalls.c | 79 +++++++++++++++--- drivers/clocksource/arm_arch_timer.c | 26 ++++++ drivers/firmware/smccc/smccc.c | 1 + drivers/ptp/Kconfig | 2 +- drivers/ptp/Makefile | 1 + drivers/ptp/ptp_kvm.h | 11 +++ drivers/ptp/ptp_kvm_arm64.c | 53 ++++++++++++ drivers/ptp/{ptp_kvm.c => ptp_kvm_common.c} | 80 +++++------------- drivers/ptp/ptp_kvm_x86.c | 89 +++++++++++++++++++++ include/linux/arm-smccc.h | 56 +++++++++++++ include/linux/clocksource.h | 6 ++ include/linux/clocksource_ids.h | 12 +++ include/linux/timekeeping.h | 12 +-- include/uapi/linux/kvm.h | 1 + kernel/time/clocksource.c | 3 + kernel/time/timekeeping.c | 1 + virt/kvm/Kconfig | 4 + 20 files changed, 413 insertions(+), 75 deletions(-) create mode 100644 drivers/ptp/ptp_kvm.h create mode 100644 drivers/ptp/ptp_kvm_arm64.c rename drivers/ptp/{ptp_kvm.c => ptp_kvm_common.c} (63%) create mode 100644 drivers/ptp/ptp_kvm_x86.c create mode 100644 include/linux/clocksource_ids.h -- 2.17.1