From: Marc Zyngier <maz@kernel.org>
To: Mark Brown <broonie@kernel.org>
Cc: Catalin Marinas <catalin.marinas@arm.com>,
Will Deacon <will@kernel.org>,
Lorenzo Pieralisi <lpieralisi@kernel.org>,
Mark Rutland <mark.rutland@arm.com>,
Sami Mujawar <Sami.Mujawar@arm.com>,
Thomas Gleixner <tglx@linutronix.de>,
linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev
Subject: Re: [PATCH v2 08/14] arm64/cpufeature: Detect PE support for FEAT_NMI
Date: Mon, 05 Dec 2022 18:03:07 +0000 [thread overview]
Message-ID: <86r0xdlodg.wl-maz@kernel.org> (raw)
In-Reply-To: <20221112151708.175147-9-broonie@kernel.org>
On Sat, 12 Nov 2022 15:17:02 +0000,
Mark Brown <broonie@kernel.org> wrote:
>
> Use of FEAT_NMI requires that all the PEs in the system and the GIC have NMI
> support. This patch implements the PE part of that detection.
>
> In order to avoid problematic interactions between real and pseudo NMIs
> we disable the architected feature if the user has enabled pseudo NMIs
> on the command line. If this is done on a system where support for the
> architected feature is detected then a warning is printed during boot in
> order to help users spot what is likely to be a misconfiguration.
>
> Signed-off-by: Mark Brown <broonie@kernel.org>
> ---
> arch/arm64/include/asm/cpufeature.h | 6 ++++
> arch/arm64/kernel/cpufeature.c | 55 ++++++++++++++++++++++++++++-
> arch/arm64/tools/cpucaps | 1 +
> 3 files changed, 61 insertions(+), 1 deletion(-)
>
> diff --git a/arch/arm64/include/asm/cpufeature.h b/arch/arm64/include/asm/cpufeature.h
> index f73f11b55042..85eeb331a0ef 100644
> --- a/arch/arm64/include/asm/cpufeature.h
> +++ b/arch/arm64/include/asm/cpufeature.h
> @@ -809,6 +809,12 @@ static __always_inline bool system_uses_irq_prio_masking(void)
> cpus_have_const_cap(ARM64_HAS_IRQ_PRIO_MASKING);
> }
>
> +static __always_inline bool system_uses_nmi(void)
> +{
> + return IS_ENABLED(CONFIG_ARM64_NMI) &&
> + cpus_have_const_cap(ARM64_HAS_NMI);
> +}
> +
> static inline bool system_supports_mte(void)
> {
> return IS_ENABLED(CONFIG_ARM64_MTE) &&
> diff --git a/arch/arm64/kernel/cpufeature.c b/arch/arm64/kernel/cpufeature.c
> index 6062454a9067..18ab50b76f50 100644
> --- a/arch/arm64/kernel/cpufeature.c
> +++ b/arch/arm64/kernel/cpufeature.c
> @@ -84,6 +84,7 @@
> #include <asm/kvm_host.h>
> #include <asm/mmu_context.h>
> #include <asm/mte.h>
> +#include <asm/nmi.h>
> #include <asm/processor.h>
> #include <asm/smp.h>
> #include <asm/sysreg.h>
> @@ -243,6 +244,7 @@ static const struct arm64_ftr_bits ftr_id_aa64pfr0[] = {
> };
>
> static const struct arm64_ftr_bits ftr_id_aa64pfr1[] = {
> + ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64PFR1_EL1_NMI_SHIFT, 4, 0),
> ARM64_FTR_BITS(FTR_VISIBLE_IF_IS_ENABLED(CONFIG_ARM64_SME),
> FTR_STRICT, FTR_LOWER_SAFE, ID_AA64PFR1_EL1_SME_SHIFT, 4, 0),
> ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64PFR1_EL1_MPAM_frac_SHIFT, 4, 0),
> @@ -2008,9 +2010,11 @@ static void cpu_enable_e0pd(struct arm64_cpu_capabilities const *cap)
> }
> #endif /* CONFIG_ARM64_E0PD */
>
> -#ifdef CONFIG_ARM64_PSEUDO_NMI
> +#if IS_ENABLED(CONFIG_ARM64_PSEUDO_NMI) || IS_ENABLED(CONFIG_ARM64_NMI)
> static bool enable_pseudo_nmi;
> +#endif
>
> +#ifdef CONFIG_ARM64_PSEUDO_NMI
> static int __init early_enable_pseudo_nmi(char *p)
> {
> return strtobool(p, &enable_pseudo_nmi);
> @@ -2024,6 +2028,41 @@ static bool can_use_gic_priorities(const struct arm64_cpu_capabilities *entry,
> }
> #endif
>
> +#ifdef CONFIG_ARM64_NMI
> +static bool has_nmi(const struct arm64_cpu_capabilities *entry, int scope)
> +{
> + if (!has_cpuid_feature(entry, scope))
> + return false;
> +
> + /*
> + * Having both real and pseudo NMIs enabled simultaneously is
> + * likely to cause confusion. Since pseudo NMIs must be
> + * enabled with an explicit command line option, if the user
> + * has set that option on a system with real NMIs for some
> + * reason assume they know what they're doing.
> + */
> + if (IS_ENABLED(CONFIG_ARM64_PSEUDO_NMI) && enable_pseudo_nmi) {
> + pr_info("Pseudo NMI enabled, not using architected NMI\n");
> + return false;
> + }
> +
> + return true;
> +}
> +
> +static void nmi_enable(const struct arm64_cpu_capabilities *__unused)
> +{
> + /*
> + * Enable use of NMIs controlled by ALLINT, SPINTMASK should
> + * be clear by default but make it explicit that we are using
> + * this mode. Ensure that ALLINT is clear first in order to
> + * avoid leaving things masked.
> + */
> + _allint_clear();
> + sysreg_clear_set(sctlr_el1, SCTLR_EL1_SPINTMASK, SCTLR_EL1_NMI);
> + isb();
> +}
> +#endif
> +
> #ifdef CONFIG_ARM64_BTI
> static void bti_enable(const struct arm64_cpu_capabilities *__unused)
> {
> @@ -2640,6 +2679,20 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
> .matches = has_cpuid_feature,
> .cpu_enable = cpu_trap_el0_impdef,
> },
> +#ifdef CONFIG_ARM64_NMI
> + {
> + .desc = "Non-maskable Interrupts",
> + .capability = ARM64_HAS_NMI,
> + .type = ARM64_CPUCAP_BOOT_CPU_FEATURE,
PSEUDO_NMI uses ARM64_CPUCAP_STRICT_BOOT_CPU_FEATURE. What is the
rational for using a different policy here?
> + .sys_reg = SYS_ID_AA64PFR1_EL1,
> + .sign = FTR_UNSIGNED,
> + .field_pos = ID_AA64PFR1_EL1_NMI_SHIFT,
> + .field_width = 4,
> + .min_field_value = ID_AA64PFR1_EL1_NMI_IMP,
> + .matches = has_nmi,
> + .cpu_enable = nmi_enable,
> + },
> +#endif
> {},
> };
The whole thing is way too restrictive: KVM definitely needs to know
that the feature exists, even if there is no use for it in the host
kernel. There is no reason why guests shouldn't be able to use this
even if the host doesn't care about it.
Which means you need two properties: one that advertises the
availability of the feature, and one that makes use of it in the
kernel.
Thanks,
M.
--
Without deviation from the norm, progress is not possible.
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2022-12-05 18:04 UTC|newest]
Thread overview: 48+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-11-12 15:16 [PATCH v2 00/14] arm64/nmi: Support for FEAT_NMI Mark Brown
2022-11-12 15:16 ` [PATCH v2 01/14] arm64/booting: Document boot requirements " Mark Brown
2022-11-12 15:16 ` [PATCH v2 02/14] arm64/sysreg: Add definition for ICC_NMIAR1_EL1 Mark Brown
2022-11-12 15:16 ` [PATCH v2 03/14] arm64/sysreg: Add definition of ISR_EL1 Mark Brown
2022-12-05 16:45 ` Marc Zyngier
2022-11-12 15:16 ` [PATCH v2 04/14] arm64/sysreg: Add definitions for immediate versions of MSR ALLINT Mark Brown
2022-12-05 16:38 ` Marc Zyngier
2022-12-05 17:11 ` Mark Brown
2022-12-07 19:18 ` Marc Zyngier
2022-12-07 19:42 ` Mark Brown
2022-11-12 15:16 ` [PATCH v2 05/14] arm64/asm: Introduce assembly macros for managing ALLINT Mark Brown
2022-12-05 17:29 ` Marc Zyngier
2022-12-05 18:24 ` Mark Brown
2022-12-07 19:14 ` Marc Zyngier
2022-11-12 15:17 ` [PATCH v2 06/14] arm64/hyp-stub: Enable access to ALLINT Mark Brown
2022-12-05 17:50 ` Marc Zyngier
2022-11-12 15:17 ` [PATCH v2 07/14] arm64/idreg: Add an override for FEAT_NMI Mark Brown
2022-11-12 15:17 ` [PATCH v2 08/14] arm64/cpufeature: Detect PE support " Mark Brown
2022-12-05 18:03 ` Marc Zyngier [this message]
2022-12-05 19:32 ` Mark Brown
2022-12-07 19:06 ` Marc Zyngier
2022-11-12 15:17 ` [PATCH v2 09/14] KVM: arm64: Hide FEAT_NMI from guests Mark Brown
2022-12-05 18:06 ` Marc Zyngier
2022-12-05 19:03 ` Mark Brown
2022-12-07 19:03 ` Marc Zyngier
2022-12-07 19:33 ` Mark Brown
2022-11-12 15:17 ` [PATCH v2 10/14] arm64/nmi: Manage masking for superpriority interrupts along with DAIF Mark Brown
2022-12-05 18:47 ` Marc Zyngier
2022-12-05 20:52 ` Mark Brown
2022-12-08 17:19 ` Lorenzo Pieralisi
2022-12-12 14:03 ` Mark Brown
2022-12-13 8:37 ` Lorenzo Pieralisi
2022-12-13 13:15 ` Mark Brown
2022-12-15 13:32 ` Marc Zyngier
2022-12-12 14:40 ` Mark Rutland
2022-12-15 13:21 ` Mark Brown
2022-11-12 15:17 ` [PATCH v2 11/14] arm64/irq: Document handling of FEAT_NMI in irqflags.h Mark Brown
2022-11-12 15:17 ` [PATCH v2 12/14] arm64/nmi: Add handling of superpriority interrupts as NMIs Mark Brown
2022-12-07 11:03 ` Marc Zyngier
2022-12-07 13:24 ` Mark Brown
2022-12-07 18:57 ` Marc Zyngier
2022-12-07 19:15 ` Mark Brown
2022-11-12 15:17 ` [PATCH v2 13/14] arm64/nmi: Add Kconfig for NMI Mark Brown
2022-11-12 15:17 ` [PATCH v2 14/14] irqchip/gic-v3: Implement FEAT_GICv3_NMI support Mark Brown
2022-12-07 15:20 ` Marc Zyngier
2022-12-02 18:42 ` [PATCH v2 00/14] arm64/nmi: Support for FEAT_NMI Marc Zyngier
2022-12-03 8:25 ` Lorenzo Pieralisi
2022-12-03 9:45 ` Marc Zyngier
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=86r0xdlodg.wl-maz@kernel.org \
--to=maz@kernel.org \
--cc=Sami.Mujawar@arm.com \
--cc=broonie@kernel.org \
--cc=catalin.marinas@arm.com \
--cc=kvmarm@lists.linux.dev \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=lpieralisi@kernel.org \
--cc=mark.rutland@arm.com \
--cc=tglx@linutronix.de \
--cc=will@kernel.org \
/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;
as well as URLs for NNTP newsgroup(s).