Received: by 2002:a25:8b12:0:0:0:0:0 with SMTP id i18csp1878018ybl; Wed, 28 Aug 2019 23:41:24 -0700 (PDT) X-Google-Smtp-Source: APXvYqynMzHrazZPk+ksmVnNcJaAv3HVgtAxFs/6GYibcQ0uF7pPhvJ11xvJyKgFJpSuY64HH8cT X-Received: by 2002:a17:902:e686:: with SMTP id cn6mr8355873plb.12.1567060884150; Wed, 28 Aug 2019 23:41:24 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1567060884; cv=none; d=google.com; s=arc-20160816; b=YVrD17k+FT2QhvTEWK9uwgUo1smg+ZAd3ILR8CtIJLr2Rt+KnfwFCvLZu7VHGNiWfF YvyYA3x2jPocnf1eXLByV16pJsJz15AAvo54KHNe5TvraYPowxGGk1SY4YnKYU8Kjo2y TuNAPN6U/oSo+LNPplrfR1iFJtROFUmsdFHhg3jZJJvCKmtQy5gFPDZC98x/DuqNWWGJ 6YCc6pqxdNpkDllBhTxawM6CirrEqJwm6hqlH3VwfG+AR7l8uKYcwpTXkItzVokLb+r/ +I/6YyyRUJV937oSKeKxeVym12g3qyz5B+8dNo+719mvBObsxckZFFIQDkQ/P7srZDpS pdiQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from; bh=P7XqEBNmFx2SvObqVlCMFcEj+IqEC+VQcLQ7gec47pg=; b=K7ICdVv897IX0cT+rXZ3SPUH8w0W5vSjLXYtogFV6uy6R7Su/hXfEuHl2Yqpq7t9ty NlMATzyMnhACWwCfEt4jjn0gCGWv8Q8Nmv3Lm0P/6GB65IKkkQFhxHyUHaiSg4oQbRc5 6KW05LUqYfDLuB+Bz8it3saX+42r0kbnF52EGitjXM6Qot+iulsE41YiLvzuORQhzOSj yS6LNnzChDRA8R75OsonrHbE86f5RGJDdPjPV9xFySUc1PhtRZM5kaBr9ZH5uBukJv1k aBs9yneJnnV/e84/jk+Dcp1XuQqcMl1gOo9HkaDG6vRurrWFGQw6UM5o3kflOsrv9feo hGqA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id t17si1059418plo.411.2019.08.28.23.41.09; Wed, 28 Aug 2019 23:41:24 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727663AbfH2GkO (ORCPT + 99 others); Thu, 29 Aug 2019 02:40:14 -0400 Received: from foss.arm.com ([217.140.110.172]:39600 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727595AbfH2GkN (ORCPT ); Thu, 29 Aug 2019 02:40:13 -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 5821B28; Wed, 28 Aug 2019 23:40:12 -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 005F93F246; Wed, 28 Aug 2019 23:42:30 -0700 (PDT) From: Jianyong Wu To: netdev@vger.kernel.org, pbonzini@redhat.com, sean.j.christopherson@intel.com, maz@kernel.org, richardcochran@gmail.com, Mark.Rutland@arm.com, Will.Deacon@arm.com, suzuki.poulose@arm.com Cc: linux-kernel@vger.kernel.org, Steve.Capper@arm.com, Kaly.Xin@arm.com, justin.he@arm.com, jianyong.wu@arm.com Subject: [RFC PATCH 2/3] reorganize ptp_kvm modules to make it arch-independent. Date: Thu, 29 Aug 2019 02:39:51 -0400 Message-Id: <20190829063952.18470-3-jianyong.wu@arm.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190829063952.18470-1-jianyong.wu@arm.com> References: <20190829063952.18470-1-jianyong.wu@arm.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Currently, ptp_kvm modules implementation is only for x86 which includs large part of arch-specific code. This patch move all of those code into related arch directory. Signed-off-by: Jianyong Wu --- arch/x86/kvm/arch_ptp_kvm.c | 92 ++++++++++++++++++++++++++++ drivers/ptp/Makefile | 1 + drivers/ptp/{ptp_kvm.c => kvm_ptp.c} | 77 ++++++----------------- include/asm-generic/ptp_kvm.h | 12 ++++ 4 files changed, 123 insertions(+), 59 deletions(-) create mode 100644 arch/x86/kvm/arch_ptp_kvm.c rename drivers/ptp/{ptp_kvm.c => kvm_ptp.c} (63%) create mode 100644 include/asm-generic/ptp_kvm.h diff --git a/arch/x86/kvm/arch_ptp_kvm.c b/arch/x86/kvm/arch_ptp_kvm.c new file mode 100644 index 000000000000..56ea84a86da2 --- /dev/null +++ b/arch/x86/kvm/arch_ptp_kvm.c @@ -0,0 +1,92 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Virtual PTP 1588 clock for use with KVM guests + * + * Copyright (C) 2019 ARM Ltd. + * All Rights Reserved + */ + +#include +#include +#include +#include +#include +#include + +phys_addr_t clock_pair_gpa; +struct kvm_clock_pairing clock_pair; +struct pvclock_vsyscall_time_info *hv_clock; + +int kvm_arch_ptp_init(void) +{ + int ret; + + if (!kvm_para_available()) + return -ENODEV; + + clock_pair_gpa = slow_virt_to_phys(&clock_pair); + hv_clock = pvclock_get_pvti_cpu0_va(); + if (!hv_clock) + return -ENODEV; + + ret = kvm_hypercall2(KVM_HC_CLOCK_PAIRING, clock_pair_gpa, + KVM_CLOCK_PAIRING_WALLCLOCK); + if (ret == -KVM_ENOSYS || ret == -KVM_EOPNOTSUPP) + return -ENODEV; + + return 0; +} + +int kvm_arch_ptp_get_clock(struct timespec64 *ts) +{ + long ret; + + ret = kvm_hypercall2(KVM_HC_CLOCK_PAIRING, + clock_pair_gpa, + KVM_CLOCK_PAIRING_WALLCLOCK); + if (ret != 0) + return -EOPNOTSUPP; + + ts->tv_sec = clock_pair.sec; + ts->tv_nsec = clock_pair.nsec; + + return 0; +} + +int kvm_arch_ptp_get_clock_fn(long *cycle, struct timespec64 *tspec, + struct clocksource **cs) +{ + unsigned long ret; + unsigned int version; + int cpu; + struct pvclock_vcpu_time_info *src; + + cpu = smp_processor_id(); + src = &hv_clock[cpu].pvti; + + do { + /* + * We are using a TSC value read in the hosts + * kvm_hc_clock_pairing handling. + * So any changes to tsc_to_system_mul + * and tsc_shift or any other pvclock + * data invalidate that measurement. + */ + version = pvclock_read_begin(src); + + ret = kvm_hypercall2(KVM_HC_CLOCK_PAIRING, + clock_pair_gpa, + KVM_CLOCK_PAIRING_WALLCLOCK); + tspec->tv_sec = clock_pair.sec; + tspec->tv_nsec = clock_pair.nsec; + *cycle = __pvclock_read_cycles(src, clock_pair.tsc); + } while (pvclock_read_retry(src, version)); + + *cs = &kvm_clock; + + return 0; +} + +MODULE_AUTHOR("Marcelo Tosatti "); +MODULE_DESCRIPTION("PTP clock using KVMCLOCK"); +MODULE_LICENSE("GPL"); diff --git a/drivers/ptp/Makefile b/drivers/ptp/Makefile index 677d1d178a3e..5a8c6462fc0f 100644 --- a/drivers/ptp/Makefile +++ b/drivers/ptp/Makefile @@ -4,6 +4,7 @@ # ptp-y := ptp_clock.o ptp_chardev.o ptp_sysfs.o +ptp_kvm-y := ../../arch/$(ARCH)/kvm/arch_ptp_kvm.o kvm_ptp.o obj-$(CONFIG_PTP_1588_CLOCK) += ptp.o obj-$(CONFIG_PTP_1588_CLOCK_DTE) += ptp_dte.o obj-$(CONFIG_PTP_1588_CLOCK_IXP46X) += ptp_ixp46x.o diff --git a/drivers/ptp/ptp_kvm.c b/drivers/ptp/kvm_ptp.c similarity index 63% rename from drivers/ptp/ptp_kvm.c rename to drivers/ptp/kvm_ptp.c index fc7d0b77e118..9d07cf872be7 100644 --- a/drivers/ptp/ptp_kvm.c +++ b/drivers/ptp/kvm_ptp.c @@ -8,12 +8,12 @@ #include #include #include +#include #include #include #include -#include -#include #include +#include #include @@ -24,56 +24,29 @@ struct kvm_ptp_clock { DEFINE_SPINLOCK(kvm_ptp_lock); -static struct pvclock_vsyscall_time_info *hv_clock; - -static struct kvm_clock_pairing clock_pair; -static phys_addr_t clock_pair_gpa; - static int ptp_kvm_get_time_fn(ktime_t *device_time, struct system_counterval_t *system_counter, void *ctx) { - unsigned long ret; + unsigned long ret, cycle; struct timespec64 tspec; - unsigned version; - int cpu; - struct pvclock_vcpu_time_info *src; + struct clocksource *cs; spin_lock(&kvm_ptp_lock); preempt_disable_notrace(); - cpu = smp_processor_id(); - src = &hv_clock[cpu].pvti; - - do { - /* - * We are using a TSC value read in the hosts - * kvm_hc_clock_pairing handling. - * So any changes to tsc_to_system_mul - * and tsc_shift or any other pvclock - * data invalidate that measurement. - */ - version = pvclock_read_begin(src); - - ret = kvm_hypercall2(KVM_HC_CLOCK_PAIRING, - clock_pair_gpa, - KVM_CLOCK_PAIRING_WALLCLOCK); - if (ret != 0) { - pr_err_ratelimited("clock pairing hypercall ret %lu\n", ret); - spin_unlock(&kvm_ptp_lock); - preempt_enable_notrace(); - return -EOPNOTSUPP; - } - - tspec.tv_sec = clock_pair.sec; - tspec.tv_nsec = clock_pair.nsec; - ret = __pvclock_read_cycles(src, clock_pair.tsc); - } while (pvclock_read_retry(src, version)); + ret = kvm_arch_ptp_get_clock_fn(&cycle, &tspec, &cs); + if (ret != 0) { + pr_err_ratelimited("clock pairing hypercall ret %lu\n", ret); + spin_unlock(&kvm_ptp_lock); + preempt_enable_notrace(); + return -EOPNOTSUPP; + } preempt_enable_notrace(); - system_counter->cycles = ret; - system_counter->cs = &kvm_clock; + system_counter->cycles = cycle; + system_counter->cs = cs; *device_time = timespec64_to_ktime(tspec); @@ -116,17 +89,13 @@ static int ptp_kvm_gettime(struct ptp_clock_info *ptp, struct timespec64 *ts) spin_lock(&kvm_ptp_lock); - ret = kvm_hypercall2(KVM_HC_CLOCK_PAIRING, - clock_pair_gpa, - KVM_CLOCK_PAIRING_WALLCLOCK); + ret = kvm_arch_ptp_get_clock(&tspec); if (ret != 0) { pr_err_ratelimited("clock offset hypercall ret %lu\n", ret); spin_unlock(&kvm_ptp_lock); return -EOPNOTSUPP; } - tspec.tv_sec = clock_pair.sec; - tspec.tv_nsec = clock_pair.nsec; spin_unlock(&kvm_ptp_lock); memcpy(ts, &tspec, sizeof(struct timespec64)); @@ -166,21 +135,11 @@ static void __exit ptp_kvm_exit(void) static int __init ptp_kvm_init(void) { - long ret; - - if (!kvm_para_available()) - return -ENODEV; - - clock_pair_gpa = slow_virt_to_phys(&clock_pair); - hv_clock = pvclock_get_pvti_cpu0_va(); - - if (!hv_clock) - return -ENODEV; + int ret; - ret = kvm_hypercall2(KVM_HC_CLOCK_PAIRING, clock_pair_gpa, - KVM_CLOCK_PAIRING_WALLCLOCK); - if (ret == -KVM_ENOSYS || ret == -KVM_EOPNOTSUPP) - return -ENODEV; + ret = kvm_arch_ptp_init(); + if (IS_ERR(ret)) + return ret; kvm_ptp_clock.caps = ptp_kvm_caps; diff --git a/include/asm-generic/ptp_kvm.h b/include/asm-generic/ptp_kvm.h new file mode 100644 index 000000000000..128a9d7af161 --- /dev/null +++ b/include/asm-generic/ptp_kvm.h @@ -0,0 +1,12 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Virtual PTP 1588 clock for use with KVM guests + * + * Copyright (C) 2019 ARM Ltd. + * All Rights Reserved + */ + +static int kvm_arch_ptp_init(void); +static int kvm_arch_ptp_get_clock(struct timespec64 *ts); +static int kvm_arch_ptp_get_clock_fn(long *cycle, + struct timespec64 *tspec, void *cs); -- 2.17.1