From: Dave Martin <Dave.Martin@arm.com>
To: "Alex Bennée" <alex.bennee@linaro.org>
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>,
kvmarm@lists.cs.columbia.edu,
linux-arm-kernel@lists.infradead.org
Subject: Re: [RFC PATCH v2 06/23] arm64/sve: Check SVE virtualisability
Date: Thu, 15 Nov 2018 17:09:04 +0000 [thread overview]
Message-ID: <20181115170904.GO3505@e103592.cambridge.arm.com> (raw)
In-Reply-To: <87in0ycpuy.fsf@linaro.org>
On Thu, Nov 15, 2018 at 03:39:01PM +0000, Alex Bennée wrote:
>
> Dave Martin <Dave.Martin@arm.com> writes:
>
> > Due to the way the effective SVE vector length is controlled and
> > trapped at different exception levels, certain mismatches in the
> > sets of vector lengths supported by different physical CPUs in the
> > system may prevent straightforward virtualisation of SVE at parity
> > with the host.
> >
> > This patch analyses the extent to which SVE can be virtualised
> > safely without interfering with migration of vcpus between physical
> > CPUs, and rejects late secondary CPUs that would erode the
> > situation further.
> >
> > It is left up to KVM to decide what to do with this information.
> >
> > Signed-off-by: Dave Martin <Dave.Martin@arm.com>
> > ---
> >
> > Changes since RFCv1:
> >
> > * The analysis done by this patch is the same as in the previous
> > version, but the commit message the printks etc. have been reworded
> > to avoid the suggestion that KVM is expected to work on a system with
> > mismatched SVE implementations.
> > ---
> > arch/arm64/include/asm/fpsimd.h | 1 +
> > arch/arm64/kernel/cpufeature.c | 2 +-
> > arch/arm64/kernel/fpsimd.c | 87 +++++++++++++++++++++++++++++++++++------
> > 3 files changed, 76 insertions(+), 14 deletions(-)
> >
[...]
> > diff --git a/arch/arm64/kernel/fpsimd.c b/arch/arm64/kernel/fpsimd.c
[...]
> > @@ -623,11 +629,8 @@ int sve_get_current_vl(void)
[...]
> > +/* Bitmaps for temporary storage during manipulation of vector length sets */
> > +static DECLARE_BITMAP(sve_tmp_vq_map, SVE_VQ_MAX);
>
> This seems odd as a local global, why not declared locally when used?
Could do.
My original concern was that this is "big" and therefore it's impolite
to allocate it on the stack.
But on reflection, 64 bytes of stack is no big deal for a 64-bit
architecture. The affected functions probably spill more than than
already, and these functions are called on well-defined paths which
shouldn't have super-deep stacks already.
[...]
> > @@ -658,24 +662,60 @@ void __init sve_init_vq_map(void)
> > */
> > void sve_update_vq_map(void)
> > {
> > - sve_probe_vqs(sve_secondary_vq_map);
> > - bitmap_and(sve_vq_map, sve_vq_map, sve_secondary_vq_map, SVE_VQ_MAX);
> > + sve_probe_vqs(sve_tmp_vq_map);
> > + bitmap_and(sve_vq_map, sve_vq_map, sve_tmp_vq_map,
> > + SVE_VQ_MAX);
> > + bitmap_or(sve_vq_partial_map, sve_vq_partial_map, sve_tmp_vq_map,
> > + SVE_VQ_MAX);
> > }
>
> I'm not quite following what's going on here. This is tracking both the
> vector lengths available on all CPUs and the ones available on at least
> one CPU? This raises a some questions:
>
> - do such franken-machines exist or are expected to exit?
no, and yes respectively (Linux does not endorse the latter for now,
since it results in a non-SMP system: we hide the asymmetries where
possible by clamping the set of available vector lengths, but for
KVM it's too hard and we don't aim to support it at all).
Even if we don't recommend deploying a general-purpose OS on such a
system, people will eventually try it. So it's better to fail safe
rather than silently doing the wrong thing.
> - how do we ensure this is always upto date?
This gets updated for each early secondary CPU that comes up. (Early
secondaries' boot is serialised, so we shouldn't have to worry about
races here.)
The configuration is frozen by the time we enter userspace (hence
__ro_after_init).
Once all the early secondaries have come up, we commit to the best
possible set of vector lengths for the CPUs that we know about, and we
don't call this path any more: instead, each late secondary goes into
sve_verify_vq_map() instead to check that those CPUs are compatible
with the configuration we committed to.
For context, take a look at
arch/arm64/kernel/cpufeature.c:check_local_cpu_capabilities(), which is
the common entry point for all secondary CPUs: that splits into
update_cpu_capabilities() and verify_local_cpu_capabilities() paths for
the two cases described above, calling down into sve_update_vq_map()
and sve_verify_vq_map() as appropriate.
> - what happens when we hotplug a new CPU with less available VQ?
We reject the CPU and throw it back to the firmware (see
cpufeature.c:verify_sve_features()).
This follows the precedent already set in verify_local_cpu_capabilities()
etc.
>
> >
> > /* Check whether the current CPU supports all VQs in the committed set */
> > int sve_verify_vq_map(void)
> > {
> > - int ret = 0;
> > + int ret = -EINVAL;
> > + unsigned long b;
> >
> > - sve_probe_vqs(sve_secondary_vq_map);
> > - bitmap_andnot(sve_secondary_vq_map, sve_vq_map, sve_secondary_vq_map,
> > - SVE_VQ_MAX);
> > - if (!bitmap_empty(sve_secondary_vq_map, SVE_VQ_MAX)) {
> > + sve_probe_vqs(sve_tmp_vq_map);
> > +
> > + bitmap_complement(sve_tmp_vq_map, sve_tmp_vq_map, SVE_VQ_MAX);
> > + if (bitmap_intersects(sve_tmp_vq_map, sve_vq_map, SVE_VQ_MAX)) {
> > pr_warn("SVE: cpu%d: Required vector length(s) missing\n",
> > smp_processor_id());
> > - ret = -EINVAL;
> > + goto error;
>
> The use of goto seems a little premature considering we don't have any
> clean-up to do.
Hmm, this does look a little overengineered. I think it may have been
more complex during development (making the gotos less redundant), but
to be honest I don't remember now.
I'm happy to get rid of the rather pointless ret variable and replace
all the gotos with returns if that works for you.
What do you think?
[...]
Cheers
---Dave
next prev parent reply other threads:[~2018-11-15 17:09 UTC|newest]
Thread overview: 77+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-09-28 13:39 [RFC PATCH v2 00/23] KVM: arm64: Initial support for SVE guests Dave Martin
2018-09-28 13:39 ` [RFC PATCH v2 01/23] arm64: fpsimd: Always set TIF_FOREIGN_FPSTATE on task state flush Dave Martin
2018-09-28 13:39 ` [RFC PATCH v2 02/23] KVM: arm64: Delete orphaned declaration for __fpsimd_enabled() Dave Martin
2018-09-28 13:39 ` [RFC PATCH v2 03/23] KVM: arm64: Refactor kvm_arm_num_regs() for easier maintenance Dave Martin
2018-09-28 13:39 ` [RFC PATCH v2 04/23] KVM: arm64: Add missing #include of <linux/bitmap.h> to kvm_host.h Dave Martin
2018-09-28 13:39 ` [RFC PATCH v2 05/23] KVM: arm: Add arch vcpu uninit hook Dave Martin
2018-11-02 8:05 ` Christoffer Dall
2018-11-15 16:40 ` Dave Martin
2018-11-20 10:56 ` Christoffer Dall
2018-09-28 13:39 ` [RFC PATCH v2 06/23] arm64/sve: Check SVE virtualisability Dave Martin
2018-11-15 15:39 ` Alex Bennée
2018-11-15 17:09 ` Dave Martin [this message]
2018-11-16 12:32 ` Alex Bennée
2018-11-16 15:09 ` Dave Martin
2018-09-28 13:39 ` [RFC PATCH v2 07/23] arm64/sve: Enable SVE state tracking for non-task contexts Dave Martin
2018-09-28 13:39 ` [RFC PATCH v2 08/23] KVM: arm64: Add a vcpu flag to control SVE visibility for the guest Dave Martin
2018-11-15 15:44 ` Alex Bennée
2018-09-28 13:39 ` [RFC PATCH v2 09/23] KVM: arm64: Propagate vcpu into read_id_reg() Dave Martin
2018-11-15 15:56 ` Alex Bennée
2018-09-28 13:39 ` [RFC PATCH v2 10/23] KVM: arm64: Extend reset_unknown() to handle mixed RES0/UNKNOWN registers Dave Martin
2018-11-02 8:11 ` Christoffer Dall
2018-11-15 17:11 ` Dave Martin
2018-09-28 13:39 ` [RFC PATCH v2 11/23] KVM: arm64: Support runtime sysreg filtering for KVM_GET_REG_LIST Dave Martin
2018-11-02 8:16 ` Christoffer Dall
2018-11-15 17:27 ` Dave Martin
2018-11-22 10:53 ` Christoffer Dall
2018-11-22 11:13 ` Peter Maydell
2018-11-22 12:34 ` Christoffer Dall
2018-11-22 12:59 ` Peter Maydell
2018-11-22 11:27 ` Alex Bennée
2018-11-22 12:32 ` Dave P Martin
2018-11-22 13:07 ` Christoffer Dall
2018-11-23 17:42 ` Dave Martin
2018-09-28 13:39 ` [RFC PATCH v2 12/23] KVM: arm64/sve: System register context switch and access support Dave Martin
2018-11-15 16:37 ` Alex Bennée
2018-11-15 17:59 ` Dave Martin
2018-09-28 13:39 ` [RFC PATCH v2 13/23] KVM: arm64/sve: Context switch the SVE registers Dave Martin
2018-11-19 16:36 ` Alex Bennée
2018-11-19 17:03 ` Dave Martin
2018-11-20 12:25 ` Alex Bennée
2018-11-20 14:17 ` Dave Martin
2018-11-20 15:30 ` Alex Bennée
2018-11-20 17:18 ` Dave Martin
2018-09-28 13:39 ` [RFC PATCH v2 14/23] KVM: Allow 2048-bit register access via ioctl interface Dave Martin
2018-11-19 16:48 ` Alex Bennée
2018-11-19 17:07 ` Dave Martin
2018-11-20 11:20 ` Alex Bennée
2018-09-28 13:39 ` [RFC PATCH v2 15/23] KVM: arm64/sve: Add SVE support to register access " Dave Martin
2018-11-21 15:20 ` Alex Bennée
2018-11-21 18:05 ` Dave Martin
2018-09-28 13:39 ` [RFC PATCH v2 16/23] KVM: arm64: Enumerate SVE register indices for KVM_GET_REG_LIST Dave Martin
2018-11-21 16:09 ` Alex Bennée
2018-11-21 16:32 ` Dave Martin
2018-11-21 16:49 ` Alex Bennée
2018-11-21 17:46 ` Dave Martin
2018-09-28 13:39 ` [RFC PATCH v2 17/23] arm64/sve: In-kernel vector length availability query interface Dave Martin
2018-11-21 16:16 ` Alex Bennée
2018-11-21 16:35 ` Dave Martin
2018-11-21 16:46 ` Alex Bennée
2018-09-28 13:39 ` [RFC PATCH v2 18/23] KVM: arm64: Add arch vcpu ioctl hook Dave Martin
2018-11-02 8:30 ` Christoffer Dall
2018-09-28 13:39 ` [RFC PATCH v2 19/23] KVM: arm64/sve: Report and enable SVE API extensions for userspace Dave Martin
2018-11-22 15:23 ` Alex Bennée
2018-12-05 18:22 ` Dave Martin
2018-09-28 13:39 ` [RFC PATCH v2 20/23] KVM: arm64: Add arch vm ioctl hook Dave Martin
2018-11-02 8:32 ` Christoffer Dall
2018-11-15 18:04 ` Dave Martin
2018-11-20 10:58 ` Christoffer Dall
2018-11-20 14:19 ` Dave Martin
2018-09-28 13:39 ` [RFC PATCH v2 21/23] KVM: arm64/sve: allow KVM_ARM_SVE_CONFIG_QUERY on vm fd Dave Martin
2018-11-22 15:29 ` Alex Bennée
2018-09-28 13:39 ` [RFC PATCH v2 22/23] KVM: Documentation: Document arm64 core registers in detail Dave Martin
2018-09-28 13:39 ` [RFC PATCH v2 23/23] KVM: arm64/sve: Document KVM API extensions for SVE Dave Martin
2018-11-22 15:31 ` Alex Bennée
2018-12-05 17:59 ` Dave Martin
2018-11-22 15:34 ` [RFC PATCH v2 00/23] KVM: arm64: Initial support for SVE guests Alex Bennée
2018-12-04 15:50 ` Dave Martin
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=20181115170904.GO3505@e103592.cambridge.arm.com \
--to=dave.martin@arm.com \
--cc=alex.bennee@linaro.org \
--cc=ard.biesheuvel@linaro.org \
--cc=catalin.marinas@arm.com \
--cc=cdall@kernel.org \
--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 \
/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