From: Dave Martin <Dave.Martin@arm.com>
To: Andrew Jones <drjones@redhat.com>
Cc: Okamoto Takayuki <tokamoto@jp.fujitsu.com>,
Christoffer Dall <cdall@kernel.org>,
Ard Biesheuvel <ard.biesheuvel@linaro.org>,
Marc Zyngier <marc.zyngier@arm.com>,
Catalin Marinas <catalin.marinas@arm.com>,
Will Deacon <will.deacon@arm.com>,
Zhang Lei <zhang.lei@jp.fujitsu.com>,
Julien Grall <julien.grall@arm.com>,
kvmarm@lists.cs.columbia.edu,
linux-arm-kernel@lists.infradead.org
Subject: Re: [PATCH v7 22/27] KVM: arm/arm64: Add KVM_ARM_VCPU_FINALIZE ioctl
Date: Thu, 4 Apr 2019 17:47:07 +0100 [thread overview]
Message-ID: <20190404164707.GH3567@e103592.cambridge.arm.com> (raw)
In-Reply-To: <20190404150709.ihxlndxc6mvuwomp@kamzik.brq.redhat.com>
On Thu, Apr 04, 2019 at 05:07:09PM +0200, Andrew Jones wrote:
> On Fri, Mar 29, 2019 at 01:00:47PM +0000, Dave Martin wrote:
> > Some aspects of vcpu configuration may be too complex to be
> > completed inside KVM_ARM_VCPU_INIT. Thus, there may be a
> > requirement for userspace to do some additional configuration
> > before various other ioctls will work in a consistent way.
> >
> > In particular this will be the case for SVE, where userspace will
> > need to negotiate the set of vector lengths to be made available to
> > the guest before the vcpu becomes fully usable.
> >
> > In order to provide an explicit way for userspace to confirm that
> > it has finished setting up a particular vcpu feature, this patch
> > adds a new ioctl KVM_ARM_VCPU_FINALIZE.
> >
> > When userspace has opted into a feature that requires finalization,
> > typically by means of a feature flag passed to KVM_ARM_VCPU_INIT, a
> > matching call to KVM_ARM_VCPU_FINALIZE is now required before
> > KVM_RUN or KVM_GET_REG_LIST is allowed. Individual features may
> > impose additional restrictions where appropriate.
> >
> > No existing vcpu features are affected by this, so current
> > userspace implementations will continue to work exactly as before,
> > with no need to issue KVM_ARM_VCPU_FINALIZE.
> >
> > As implemented in this patch, KVM_ARM_VCPU_FINALIZE is currently a
> > placeholder: no finalizable features exist yet, so ioctl is not
> > required and will always yield EINVAL. Subsequent patches will add
> > the finalization logic to make use of this ioctl for SVE.
> >
> > No functional change for existing userspace.
> >
> > Signed-off-by: Dave Martin <Dave.Martin@arm.com>
> > Reviewed-by: Julien Thierry <julien.thierry@arm.com>
> > Tested-by: zhang.lei <zhang.lei@jp.fujitsu.com>
> >
> > ---
> >
> > Changes since v5:
> >
> > * Commit message, including subject line, rewritten.
> >
> > This patch is a rework of "KVM: arm/arm64: Add hook to finalize the
> > vcpu configuration". The old subject line and commit message no
> > longer accurately described what the patch does. However, the code
> > is an evolution of the previous patch rather than a wholesale
> > rewrite.
> >
> > * Added an explicit KVM_ARM_VCPU_FINALIZE ioctl, rather than just
> > providing internal hooks in the kernel to finalize the vcpu
> > configuration implicitly. This allows userspace to confirm exactly
> > when it has finished configuring the vcpu and is ready to use it.
> >
> > This results in simpler (and hopefully more maintainable) ioctl
> > ordering rules.
> > ---
> > arch/arm/include/asm/kvm_host.h | 4 ++++
> > arch/arm64/include/asm/kvm_host.h | 4 ++++
> > include/uapi/linux/kvm.h | 3 +++
> > virt/kvm/arm/arm.c | 18 ++++++++++++++++++
> > 4 files changed, 29 insertions(+)
> >
> > diff --git a/arch/arm/include/asm/kvm_host.h b/arch/arm/include/asm/kvm_host.h
> > index a49ee01..e80cfc1 100644
> > --- a/arch/arm/include/asm/kvm_host.h
> > +++ b/arch/arm/include/asm/kvm_host.h
> > @@ -19,6 +19,7 @@
> > #ifndef __ARM_KVM_HOST_H__
> > #define __ARM_KVM_HOST_H__
> >
> > +#include <linux/errno.h>
> > #include <linux/types.h>
> > #include <linux/kvm_types.h>
> > #include <asm/cputype.h>
> > @@ -411,4 +412,7 @@ static inline int kvm_arm_setup_stage2(struct kvm *kvm, unsigned long type)
> > return 0;
> > }
> >
> > +#define kvm_arm_vcpu_finalize(vcpu, what) (-EINVAL)
> > +#define kvm_arm_vcpu_is_finalized(vcpu) true
> > +
>
> We usually use inline functions for the stubs.
I guess we could.
The vcpu_has_sve() circular include problem applies here too if we put
the actual function bodies here, which is why I ended up with this. Now
that the bodies (for arm64) are out of line, it actually doesn't matter.
> > #endif /* __ARM_KVM_HOST_H__ */
> > diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h
> > index 3e89509..98658f7 100644
> > --- a/arch/arm64/include/asm/kvm_host.h
> > +++ b/arch/arm64/include/asm/kvm_host.h
> > @@ -23,6 +23,7 @@
> > #define __ARM64_KVM_HOST_H__
> >
> > #include <linux/bitmap.h>
> > +#include <linux/errno.h>
> > #include <linux/types.h>
> > #include <linux/jump_label.h>
> > #include <linux/kvm_types.h>
> > @@ -625,4 +626,7 @@ void kvm_arch_free_vm(struct kvm *kvm);
> >
> > int kvm_arm_setup_stage2(struct kvm *kvm, unsigned long type);
> >
> > +#define kvm_arm_vcpu_finalize(vcpu, what) (-EINVAL)
> > +#define kvm_arm_vcpu_is_finalized(vcpu) true
>
> Same as above.
Ditto
> > +
> > #endif /* __ARM64_KVM_HOST_H__ */
> > diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h
> > index dc77a5a..c3b8e7a 100644
> > --- a/include/uapi/linux/kvm.h
> > +++ b/include/uapi/linux/kvm.h
> > @@ -1441,6 +1441,9 @@ struct kvm_enc_region {
> > /* Available with KVM_CAP_HYPERV_CPUID */
> > #define KVM_GET_SUPPORTED_HV_CPUID _IOWR(KVMIO, 0xc1, struct kvm_cpuid2)
> >
> > +/* Available with KVM_CAP_ARM_SVE */
> > +#define KVM_ARM_VCPU_FINALIZE _IOW(KVMIO, 0xc2, int)
> > +
> > /* Secure Encrypted Virtualization command */
> > enum sev_cmd_id {
> > /* Guest initialization commands */
> > diff --git a/virt/kvm/arm/arm.c b/virt/kvm/arm/arm.c
> > index c69e137..9edbf0f 100644
> > --- a/virt/kvm/arm/arm.c
> > +++ b/virt/kvm/arm/arm.c
> > @@ -545,6 +545,9 @@ static int kvm_vcpu_first_run_init(struct kvm_vcpu *vcpu)
> > if (likely(vcpu->arch.has_run_once))
> > return 0;
> >
> > + if (!kvm_arm_vcpu_is_finalized(vcpu))
> > + return -EPERM;
> > +
> > vcpu->arch.has_run_once = true;
> >
> > if (likely(irqchip_in_kernel(kvm))) {
> > @@ -1116,6 +1119,10 @@ long kvm_arch_vcpu_ioctl(struct file *filp,
> > if (unlikely(!kvm_vcpu_initialized(vcpu)))
> > break;
> >
> > + r = -EPERM;
> > + if (!kvm_arm_vcpu_is_finalized(vcpu))
> > + break;
> > +
>
> What's the rationale for using EPERM? The finalized concept is very
> similar to the initialized one. So why not also use ENOEXEC for it too?
Hmm, I guess we could equally return ENOEXEC. Initially this felt like
a more distinctive case.
Assuming Marc is happy to take an ABI fix into kvmarm/next, I'm can
change them. We're not absolutely committed until this hits mainline...
> > r = -EFAULT;
> > if (copy_from_user(®_list, user_list, sizeof(reg_list)))
> > break;
> > @@ -1169,6 +1176,17 @@ long kvm_arch_vcpu_ioctl(struct file *filp,
> >
> > return kvm_arm_vcpu_set_events(vcpu, &events);
> > }
> > + case KVM_ARM_VCPU_FINALIZE: {
> > + int what;
> > +
> > + if (!kvm_vcpu_initialized(vcpu))
> > + return -ENOEXEC;
> > +
> > + if (get_user(what, (const int __user *)argp))
> > + return -EFAULT;
> > +
> > + return kvm_arm_vcpu_finalize(vcpu, what);
>
> Almost all the cases use the 'r = ...; break;' type of pattern, leaving
> it to the 'return r' at the end of the function. I guess that's in case
> at some point more stuff is added after the switch. The only cases that
> don't do that are the most recent ones KVM_GET/SET_VCPU_EVENTS, which
> should probably be changed to fit the pattern too, rather than this
> new ioctl following there pattern.
I have no strong opinion on this: it's basically a question of style.
I followed KVM_GET/SET_VCPU_EVENTS, but you're right, the
r = ...; break; style is used for the others.
If there's an intention of putting stuff at the end of the function,
it will make a difference. But this seems unlikely to happen: this
function is really just a dispatcher.
I'm happy to change it (and the others) if there are strong views.
Cheers
---Dave
next prev parent reply other threads:[~2019-04-04 16:47 UTC|newest]
Thread overview: 115+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-03-29 13:00 [PATCH v7 00/27] KVM: arm64: SVE guest support Dave Martin
2019-03-29 13:00 ` [PATCH v7 01/27] KVM: Documentation: Document arm64 core registers in detail Dave Martin
2019-04-24 9:25 ` Alex Bennée
2019-03-29 13:00 ` [PATCH v7 02/27] arm64: fpsimd: Always set TIF_FOREIGN_FPSTATE on task state flush Dave Martin
2019-03-29 13:00 ` [PATCH v7 03/27] KVM: arm64: Delete orphaned declaration for __fpsimd_enabled() Dave Martin
2019-03-29 13:00 ` [PATCH v7 04/27] KVM: arm64: Refactor kvm_arm_num_regs() for easier maintenance Dave Martin
2019-03-29 13:00 ` [PATCH v7 05/27] KVM: arm64: Add missing #includes to kvm_host.h Dave Martin
2019-03-29 13:00 ` [PATCH v7 06/27] arm64/sve: Clarify role of the VQ map maintenance functions Dave Martin
2019-04-04 21:21 ` Andrew Jones
2019-03-29 13:00 ` [PATCH v7 07/27] arm64/sve: Check SVE virtualisability Dave Martin
2019-04-04 21:21 ` Andrew Jones
2019-04-05 9:35 ` Dave Martin
2019-03-29 13:00 ` [PATCH v7 08/27] arm64/sve: Enable SVE state tracking for non-task contexts Dave Martin
2019-03-29 13:00 ` [PATCH v7 09/27] KVM: arm64: Add a vcpu flag to control SVE visibility for the guest Dave Martin
2019-04-03 19:14 ` Andrew Jones
2019-04-04 3:17 ` Marc Zyngier
2019-04-04 7:53 ` Dave Martin
2019-04-04 21:15 ` Andrew Jones
2019-03-29 13:00 ` [PATCH v7 10/27] KVM: arm64: Propagate vcpu into read_id_reg() Dave Martin
2019-04-04 21:15 ` Andrew Jones
2019-03-29 13:00 ` [PATCH v7 11/27] KVM: arm64: Support runtime sysreg visibility filtering Dave Martin
2019-04-03 19:17 ` Andrew Jones
2019-04-24 9:39 ` Alex Bennée
2019-04-24 13:47 ` Dave Martin
2019-04-24 13:47 ` Dave Martin
2019-03-29 13:00 ` [PATCH v7 12/27] KVM: arm64/sve: System register context switch and access support Dave Martin
2019-04-03 19:39 ` Andrew Jones
2019-04-04 8:06 ` Dave Martin
2019-04-04 8:32 ` Andrew Jones
2019-04-04 8:47 ` Dave Martin
2019-04-04 8:59 ` Andrew Jones
2019-04-24 15:21 ` Alex Bennée
2019-04-25 13:28 ` Dave Martin
2019-04-25 13:28 ` Dave Martin
2019-03-29 13:00 ` [PATCH v7 13/27] KVM: arm64/sve: Context switch the SVE registers Dave Martin
2019-04-03 20:01 ` Andrew Jones
2019-04-04 8:10 ` Dave Martin
2019-04-04 8:35 ` Andrew Jones
2019-04-04 8:36 ` Dave Martin
2019-04-24 14:51 ` Alex Bennée
2019-04-25 13:35 ` Dave Martin
2019-04-25 13:35 ` Dave Martin
2019-03-29 13:00 ` [PATCH v7 14/27] KVM: Allow 2048-bit register access via ioctl interface Dave Martin
2019-04-04 21:11 ` Andrew Jones
2019-03-29 13:00 ` [PATCH v7 15/27] KVM: arm64: Add missing #include of <linux/string.h> in guest.c Dave Martin
2019-03-29 13:00 ` [PATCH v7 16/27] KVM: arm64: Factor out core register ID enumeration Dave Martin
2019-04-02 2:41 ` Marc Zyngier
2019-04-02 8:59 ` Dave Martin
2019-04-02 9:32 ` Marc Zyngier
2019-04-02 9:54 ` Dave P Martin
2019-03-29 13:00 ` [PATCH v7 17/27] KVM: arm64: Reject ioctl access to FPSIMD V-regs on SVE vcpus Dave Martin
2019-04-03 20:15 ` Andrew Jones
2019-04-24 13:45 ` Alex Bennée
2019-03-29 13:00 ` [PATCH v7 18/27] KVM: arm64/sve: Add SVE support to register access ioctl interface Dave Martin
2019-04-04 13:57 ` Andrew Jones
2019-04-04 14:50 ` Dave Martin
2019-04-04 16:25 ` Andrew Jones
2019-04-04 16:56 ` Dave Martin
2019-03-29 13:00 ` [PATCH v7 19/27] KVM: arm64: Enumerate SVE register indices for KVM_GET_REG_LIST Dave Martin
2019-04-04 14:08 ` Andrew Jones
2019-04-05 9:35 ` Dave Martin
2019-04-05 9:45 ` Andrew Jones
2019-04-05 11:11 ` Dave Martin
2019-03-29 13:00 ` [PATCH v7 20/27] arm64/sve: In-kernel vector length availability query interface Dave Martin
2019-04-04 14:20 ` Andrew Jones
2019-04-05 9:35 ` Dave Martin
2019-04-05 9:54 ` Andrew Jones
2019-04-05 11:13 ` Dave Martin
2019-03-29 13:00 ` [PATCH v7 21/27] KVM: arm/arm64: Add hook for arch-specific KVM initialisation Dave Martin
2019-04-04 14:25 ` Andrew Jones
2019-04-04 14:53 ` Dave Martin
2019-04-04 16:33 ` Andrew Jones
2019-04-05 9:36 ` Dave Martin
2019-04-05 10:40 ` Andrew Jones
2019-04-05 11:14 ` Dave Martin
2019-03-29 13:00 ` [PATCH v7 22/27] KVM: arm/arm64: Add KVM_ARM_VCPU_FINALIZE ioctl Dave Martin
2019-04-04 15:07 ` Andrew Jones
2019-04-04 16:47 ` Dave Martin [this message]
2019-03-29 13:00 ` [PATCH v7 23/27] KVM: arm64/sve: Add pseudo-register for the guest's vector lengths Dave Martin
2019-04-04 20:18 ` Andrew Jones
2019-04-05 9:36 ` Dave Martin
2019-04-05 10:14 ` Andrew Jones
2019-04-05 12:54 ` Dave Martin
2019-04-05 15:33 ` Andrew Jones
2019-04-10 12:42 ` Dave Martin
2019-04-10 12:42 ` Dave Martin
2019-04-04 20:31 ` Andrew Jones
2019-04-05 9:36 ` Dave Martin
2019-04-05 10:22 ` Andrew Jones
2019-04-05 14:06 ` Dave Martin
2019-04-05 15:41 ` Andrew Jones
2019-04-10 12:35 ` Dave Martin
2019-04-10 12:35 ` Dave Martin
2019-03-29 13:00 ` [PATCH v7 24/27] KVM: arm64/sve: Allow userspace to enable SVE for vcpus Dave Martin
2019-04-04 20:36 ` Andrew Jones
2019-03-29 13:00 ` [PATCH v7 25/27] KVM: arm64: Add a capability to advertise SVE support Dave Martin
2019-04-04 20:39 ` Andrew Jones
2019-03-29 13:00 ` [PATCH v7 26/27] KVM: Document errors for KVM_GET_ONE_REG and KVM_SET_ONE_REG Dave Martin
2019-04-03 20:27 ` Andrew Jones
2019-04-04 8:35 ` Dave Martin
2019-04-04 9:34 ` Andrew Jones
2019-04-04 9:38 ` Dave P Martin
2019-04-04 9:45 ` Andrew Jones
2019-03-29 13:00 ` [PATCH v7 27/27] KVM: arm64/sve: Document KVM API extensions for SVE Dave Martin
2019-04-04 21:09 ` Andrew Jones
2019-04-05 9:36 ` Dave Martin
2019-04-05 10:39 ` Andrew Jones
2019-04-05 13:00 ` Dave Martin
2019-04-05 15:38 ` Andrew Jones
2019-04-10 12:34 ` Dave Martin
2019-04-10 12:34 ` Dave Martin
2019-03-29 14:56 ` [PATCH v7 00/27] KVM: arm64: SVE guest support Marc Zyngier
2019-03-29 15:06 ` Dave Martin
2019-04-05 16:41 ` Dave Martin
2019-04-25 10:33 ` Alex Bennée
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=20190404164707.GH3567@e103592.cambridge.arm.com \
--to=dave.martin@arm.com \
--cc=ard.biesheuvel@linaro.org \
--cc=catalin.marinas@arm.com \
--cc=cdall@kernel.org \
--cc=drjones@redhat.com \
--cc=julien.grall@arm.com \
--cc=kvmarm@lists.cs.columbia.edu \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=marc.zyngier@arm.com \
--cc=tokamoto@jp.fujitsu.com \
--cc=will.deacon@arm.com \
--cc=zhang.lei@jp.fujitsu.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