Re: [PATCH v4 04/26] arm64: alternative: Apply alternatives early in boot process

From: Julien Thierry
Date: Fri May 25 2018 - 08:00:32 EST




On 25/05/18 11:00, Suzuki K Poulose wrote:
On 25/05/18 10:49, Julien Thierry wrote:
From: Daniel Thompson <daniel.thompson@xxxxxxxxxx>

Currently alternatives are applied very late in the boot process (and
a long time after we enable scheduling). Some alternative sequences,
such as those that alter the way CPU context is stored, must be applied
much earlier in the boot sequence.

Introduce apply_boot_alternatives() to allow some alternatives to be
applied immediately after we detect the CPU features of the boot CPU.

Signed-off-by: Daniel Thompson <daniel.thompson@xxxxxxxxxx>
[julien.thierry@xxxxxxx: rename to fit new cpufeature framework better,
ÂÂÂÂÂÂÂÂÂÂÂÂ apply BOOT_SCOPE feature early in boot]
Signed-off-by: Julien Thierry <julien.thierry@xxxxxxx>
Cc: Catalin Marinas <catalin.marinas@xxxxxxx>
Cc: Will Deacon <will.deacon@xxxxxxx>
Cc: Christoffer Dall <christoffer.dall@xxxxxxxxxx>
Cc: Suzuki K Poulose <suzuki.poulose@xxxxxxx>
---
 arch/arm64/include/asm/alternative.h | 3 +--
 arch/arm64/include/asm/cpufeature.h | 2 ++
 arch/arm64/kernel/alternative.c | 30 +++++++++++++++++++++++++++---
 arch/arm64/kernel/cpufeature.c | 5 +++++
 arch/arm64/kernel/smp.c | 7 +++++++
 5 files changed, 42 insertions(+), 5 deletions(-)


...

+unsigned long boot_capabilities;
+
 /*
ÂÂ * Flag to indicate if we have computed the system wide
ÂÂ * capabilities based on the boot time active CPUs. This
@@ -1370,6 +1372,9 @@ static void __update_cpu_capabilities(const struct arm64_cpu_capabilities *caps,
ÂÂÂÂÂÂÂÂÂ if (!cpus_have_cap(caps->capability) && caps->desc)
ÂÂÂÂÂÂÂÂÂÂÂÂÂ pr_info("%s %s\n", info, caps->desc);
ÂÂÂÂÂÂÂÂÂ cpus_set_cap(caps->capability);
+
+ÂÂÂÂÂÂÂ if (scope_mask & SCOPE_BOOT_CPU)
+ÂÂÂÂÂÂÂÂÂÂÂ __set_bit(caps->capability, &boot_capabilities);

Julien

I think this check is problematic. The scope_mask passed on by the boot CPU
is (SCOPE_BOOT_CPU | SCOPE_LOCAL_CPU) to cover both BOOT CPU capabilities *and*
CPU local capabilites on the boot CPU. So, you might apply the alternatives for
a "local" CPU erratum, which is not intended. You may change the above check to :

ÂÂÂÂif (caps->type & SCOPE_BOOT_CPU)

to make sure you check the "capability" has the SCOPE_BOOT_CPU set.


Makes sense, I'll do that.

Thanks,

--
Julien Thierry