From: Jianyong Wu <Jianyong.Wu@arm.com>
To: Mark Rutland <Mark.Rutland@arm.com>
Cc: "netdev@vger.kernel.org" <netdev@vger.kernel.org>,
"yangbo.lu@nxp.com" <yangbo.lu@nxp.com>,
"john.stultz@linaro.org" <john.stultz@linaro.org>,
"tglx@linutronix.de" <tglx@linutronix.de>,
"pbonzini@redhat.com" <pbonzini@redhat.com>,
"sean.j.christopherson@intel.com"
<sean.j.christopherson@intel.com>,
"maz@kernel.org" <maz@kernel.org>,
"richardcochran@gmail.com" <richardcochran@gmail.com>,
"will@kernel.org" <will@kernel.org>,
Suzuki Poulose <Suzuki.Poulose@arm.com>,
Steven Price <Steven.Price@arm.com>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
"linux-arm-kernel@lists.infradead.org"
<linux-arm-kernel@lists.infradead.org>,
"kvmarm@lists.cs.columbia.edu" <kvmarm@lists.cs.columbia.edu>,
"kvm@vger.kernel.org" <kvm@vger.kernel.org>,
Steve Capper <Steve.Capper@arm.com>, Kaly Xin <Kaly.Xin@arm.com>,
Justin He <Justin.He@arm.com>, nd <nd@arm.com>
Subject: Re: [RFC PATCH v11 5/9] psci: Add hypercall service for ptp_kvm.
Date: Fri, 24 Apr 2020 02:50:22 +0000 [thread overview]
Message-ID: <ab629714-c08c-2155-dd13-ad25e7f60b39@arm.com> (raw)
In-Reply-To: <20200421095736.GB16306@C02TD0UTHF1T.local>
On 2020/4/21 5:57 PM, Mark Rutland wrote:
Hi Mark,
> On Tue, Apr 21, 2020 at 11:23:00AM +0800, Jianyong Wu wrote:
>> ptp_kvm modules will get this service through smccc call.
>> The service offers real time and counter cycle of host for guest.
>> Also let caller determine which cycle of virtual counter or physical counter
>> to return.
>>
>> Signed-off-by: Jianyong Wu <jianyong.wu@arm.com>
>> ---
>> include/linux/arm-smccc.h | 21 +++++++++++++++++++
>> virt/kvm/arm/hypercalls.c | 44 ++++++++++++++++++++++++++++++++++++++-
>> 2 files changed, 64 insertions(+), 1 deletion(-)
>>
>> diff --git a/include/linux/arm-smccc.h b/include/linux/arm-smccc.h
>> index 59494df0f55b..747b7595d0c6 100644
>> --- a/include/linux/arm-smccc.h
>> +++ b/include/linux/arm-smccc.h
>> @@ -77,6 +77,27 @@
>> ARM_SMCCC_SMC_32, \
>> 0, 0x7fff)
>>
>> +/* PTP KVM call requests clock time from guest OS to host */
>> +#define ARM_SMCCC_HYP_KVM_PTP_FUNC_ID \
>> + ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \
>> + ARM_SMCCC_SMC_32, \
>> + ARM_SMCCC_OWNER_STANDARD_HYP, \
>> + 0)
>> +
>> +/* request for virtual counter from ptp_kvm guest */
>> +#define ARM_SMCCC_HYP_KVM_PTP_VIRT \
>> + ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \
>> + ARM_SMCCC_SMC_32, \
>> + ARM_SMCCC_OWNER_STANDARD_HYP, \
>> + 1)
>> +
>> +/* request for physical counter from ptp_kvm guest */
>> +#define ARM_SMCCC_HYP_KVM_PTP_PHY \
>> + ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \
>> + ARM_SMCCC_SMC_32, \
>> + ARM_SMCCC_OWNER_STANDARD_HYP, \
>> + 2)
> ARM_SMCCC_OWNER_STANDARD_HYP is for standard calls as defined in SMCCC
> and companion documents, so we should refer to the specific
> documentation here. Where are these calls defined?
yeah, should add reference docs of "SMC CALLING CONVENTION" here.
> If these calls are Linux-specific then ARM_SMCCC_OWNER_STANDARD_HYP
> isn't appropriate to use, as they are vendor-specific hypervisor service
> call.
yeah, vendor-specific service is more suitable for ptp_kvm.
>
> It looks like we don't currently have a ARM_SMCCC_OWNER_HYP for that
> (which IIUC would be 6), but we can add one as necessary. I think that
> Will might have added that as part of his SMCCC probing bits.
ok, I will add a new "ARM_SMCCC_OWNER_VENDOR_HYP" whose IIUC is 6
and create "ARM_SMCCC_HYP_KVM_PTP_ID" base on it.
>
>> +
>> #ifndef __ASSEMBLY__
>>
>> #include <linux/linkage.h>
>> diff --git a/virt/kvm/arm/hypercalls.c b/virt/kvm/arm/hypercalls.c
>> index 550dfa3e53cd..a5309c28d4dc 100644
>> --- a/virt/kvm/arm/hypercalls.c
>> +++ b/virt/kvm/arm/hypercalls.c
>> @@ -3,6 +3,7 @@
>>
>> #include <linux/arm-smccc.h>
>> #include <linux/kvm_host.h>
>> +#include <linux/clocksource_ids.h>
>>
>> #include <asm/kvm_emulate.h>
>>
>> @@ -11,8 +12,11 @@
>>
>> int kvm_hvc_call_handler(struct kvm_vcpu *vcpu)
>> {
>> - u32 func_id = smccc_get_function(vcpu);
>> + struct system_time_snapshot systime_snapshot;
>> + long arg[4];
>> + u64 cycles;
>> long val = SMCCC_RET_NOT_SUPPORTED;
>> + u32 func_id = smccc_get_function(vcpu);
>> u32 feature;
>> gpa_t gpa;
>>
>> @@ -62,6 +66,44 @@ int kvm_hvc_call_handler(struct kvm_vcpu *vcpu)
>> if (gpa != GPA_INVALID)
>> val = gpa;
>> break;
>> + /*
>> + * This serves virtual kvm_ptp.
>> + * Four values will be passed back.
>> + * reg0 stores high 32-bit host ktime;
>> + * reg1 stores low 32-bit host ktime;
>> + * reg2 stores high 32-bit difference of host cycles and cntvoff;
>> + * reg3 stores low 32-bit difference of host cycles and cntvoff.
>> + */
>> + case ARM_SMCCC_HYP_KVM_PTP_FUNC_ID:
> Shouldn't the host opt-in to providing this to the guest, as with other
> features?
er, do you mean that "ARM_SMCCC_HV_PV_TIME_XXX" as "opt-in"? if so, I
think this
kvm_ptp doesn't need a buddy. the driver in guest will call this service
in a definite way.
>> + /*
>> + * system time and counter value must captured in the same
>> + * time to keep consistency and precision.
>> + */
>> + ktime_get_snapshot(&systime_snapshot);
>> + if (systime_snapshot.cs_id != CSID_ARM_ARCH_COUNTER)
>> + break;
>> + arg[0] = upper_32_bits(systime_snapshot.real);
>> + arg[1] = lower_32_bits(systime_snapshot.real);
> Why exactly does the guest need the host's real time? Neither the cover
> letter nor this commit message have explained that, and for those of us
> unfamliar with PTP it would be very helpful to know that to understand
> what's going on.
oh, sorry, I should have added more background knowledge here.
just give some hints here:
the kvm_ptp targets to sync guest time with host. some services in user
space
like chrony can do time sync by inputing time(in kvm_ptp also clock
counter sometimes) from
remote clocksource(often network clocksource). This kvm_ptp driver can
offer a interface for
those user space service in guest to get the host time to do time sync
in guest.
>> + /*
>> + * which of virtual counter or physical counter being
>> + * asked for is decided by the first argument.
>> + */
>> + feature = smccc_get_arg1(vcpu);
>> + switch (feature) {
>> + case ARM_SMCCC_HYP_KVM_PTP_PHY:
>> + cycles = systime_snapshot.cycles;
>> + break;
>> + case ARM_SMCCC_HYP_KVM_PTP_VIRT:
>> + default:
>> + cycles = systime_snapshot.cycles -
>> + vcpu_vtimer(vcpu)->cntvoff;
>> + }
>> + arg[2] = upper_32_bits(cycles);
>> + arg[3] = lower_32_bits(cycles);
>> +
>> + smccc_set_retval(vcpu, arg[0], arg[1], arg[2], arg[3]);
> I think the 'arg' buffer is confusing here, and it'd be clearer to have:
>
> u64 snaphot;
> u64 cycles;
>
> ... and here do:
>
> smccc_set_retval(vcpu,
> upper_32_bits(snaphot),
> lower_32_bits(snapshot),
> upper_32_bits(cycles),
> lower_32_bits(cycles));
it's better to use a meaningful variant name. I will fix it.
thanks
Jianyong
>
> Thanks,
> Mark.
next prev parent reply other threads:[~2020-04-24 2:50 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-04-21 3:22 [RFC PATCH v11 0/9] Enable ptp_kvm for arm64 Jianyong Wu
2020-04-21 3:22 ` [RFC PATCH v11 1/9] psci: export psci conduit get helper Jianyong Wu
2020-04-21 9:40 ` Mark Rutland
2020-04-21 9:51 ` Jianyong Wu
2020-04-21 3:22 ` [RFC PATCH v11 2/9] ptp: Reorganize ptp_kvm modules to make it arch-independent Jianyong Wu
2020-04-21 3:22 ` [RFC PATCH v11 3/9] time: Add mechanism to recognize clocksource in time_get_snapshot Jianyong Wu
2020-04-21 3:22 ` [RFC PATCH v11 4/9] clocksource: Add clocksource id for arm arch counter Jianyong Wu
2020-04-21 3:23 ` [RFC PATCH v11 5/9] psci: Add hypercall service for ptp_kvm Jianyong Wu
2020-04-21 9:57 ` Mark Rutland
2020-04-24 2:50 ` Jianyong Wu [this message]
2020-04-24 10:39 ` Mark Rutland
[not found] ` <b005e2c8-ed9f-3dc6-dbfa-5e6db5183f3c@arm.com>
2020-04-27 9:54 ` Mark Rutland
2020-04-28 6:14 ` Jianyong Wu
2020-04-30 10:36 ` Mark Rutland
2020-05-02 9:09 ` Jianyong Wu
2020-04-21 3:23 ` [RFC PATCH v11 6/9] ptp: arm64: Enable ptp_kvm for arm/arm64 Jianyong Wu
2020-04-21 3:23 ` [RFC PATCH v11 7/9] ptp: extend input argument for getcrosstimestamp API Jianyong Wu
2020-04-21 3:23 ` [RFC PATCH v11 8/9] arm64: add mechanism to let user choose which counter to return Jianyong Wu
2020-04-21 3:23 ` [RFC PATCH v11 9/9] arm64: Add kvm capability check extension for ptp_kvm Jianyong Wu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ab629714-c08c-2155-dd13-ad25e7f60b39@arm.com \
--to=jianyong.wu@arm.com \
--cc=Justin.He@arm.com \
--cc=Kaly.Xin@arm.com \
--cc=Mark.Rutland@arm.com \
--cc=Steve.Capper@arm.com \
--cc=Steven.Price@arm.com \
--cc=Suzuki.Poulose@arm.com \
--cc=john.stultz@linaro.org \
--cc=kvm@vger.kernel.org \
--cc=kvmarm@lists.cs.columbia.edu \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=maz@kernel.org \
--cc=nd@arm.com \
--cc=netdev@vger.kernel.org \
--cc=pbonzini@redhat.com \
--cc=richardcochran@gmail.com \
--cc=sean.j.christopherson@intel.com \
--cc=tglx@linutronix.de \
--cc=will@kernel.org \
--cc=yangbo.lu@nxp.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox