[PATCH v2 0/8] arm64: alternatives: improvements

Ard Biesheuvel ardb at kernel.org
Tue Sep 13 06:36:35 PDT 2022


On Mon, 12 Sept 2022 at 17:22, Mark Rutland <mark.rutland at arm.com> wrote:
>
> This series reworks the arm64 alternatives code. The major aim is to
> make the patching code more consistent and robust, and as a benefit we
> can also make the kernel Image smaller.
>
> Largely, the series makes two structural changes:
>
> 1) Replacing cpucap static branches with equivalent alternatives.
>
>    This helps with a number of existing pain points:
>
>    * Each static branch has metadata in the __jump_table section, which
>      is not discarded after features are finalized. This wastes some
>      space, and slows down the patching of other static branches.
>
>    * The static branches are patched at a different point in time from
>      the alternatives, so changes are not atomic. This leaves a
>      transient period where there could be a mismatch between the
>      behaviour of alternatives and static branches, which could be
>      problematic for some features (e.g. pseudo-NMI).
>
>    * More (instrumentable) kernel code is executed to patch each static
>      branch, which can be risky when patching certain features (e.g.
>      irqflags management for pseudo-NMI).
>
>    * When CONFIG_JUMP_LABEL=n, static branches are turned into a load of
>      a flag and a conditional branch. This means it isn't safe to use
>      such static branches in an alternative address space (e.g. the
>      NVHE/PKVM hyp code), where the generated address isn't safe to
>      acccess.
>
>    Note that all supported toolchains have asm goto support, and since
>    commit:
>
>      a0a12c3ed057af57 ("asm goto: eradicate CC_HAS_ASM_GOTO)"
>
>    ... the CC_HAS_ASM_GOTO Kconfig symbol has been removed, so no
>    feature check is necessary, and we can always make use of asm goto.
>
> 2) Associating callback alternatives with a cpucap.
>
>    This removes the need to special-case alternatives with callbacks,
>    making it clearer when the callbacks will be invoked, and making it
>    possible to add boot-time callbacks in future.
>
>    This also makes it possible to add shared callbacks for common
>    operations (e.g. where the replacement consists purely of NOPs),
>    saving space.
>
> With this series applied, the resulting vmlinux is ~364KiB smaller, and
> the resulting Image is 64KiB smaller (due to padding and alignment):
>
> | % ls -al vmlinux-*
> | -rwxr-xr-x 1 mark mark 134644592 Sep  1 15:25 vmlinux-after
> | -rwxr-xr-x 1 mark mark 135018072 Sep  1 15:23 vmlinux-v6.0-rc3
> | % ls -al Image-*
> | -rw-r--r-- 1 mark mark 37108224 Sep  1 15:25 Image-after
> | -rw-r--r-- 1 mark mark 37173760 Sep  1 15:23 Image-v6.0-rc3
>
> Note: this patch does *NOT* address latent issues with noinstr safety in
> the existing alternatives callbacks, which will be addressed in a
> separate patch series.
>
> Since v1 [1]:
> * Expand commit message for making alt_region const
> * Remove unused macro
> * Fix typos and phrasing
> * Add R-b from Joey
>
> [1] https://lore.kernel.org/r/20220901151403.1735836-1-mark.rutland@arm.com
>
> Mark.
>
> Mark Rutland (8):
>   arm64: cpufeature: make cpus_have_cap() noinstr-safe
>   arm64: alternatives: kvm: prepare for cap changes
>   arm64: alternatives: proton-pack: prepare for cap changes
>   arm64: alternatives: hoist print out of __apply_alternatives()
>   arm64: alternatives: make alt_region const
>   arm64: alternatives: have callbacks take a cap
>   arm64: alternatives: add alternative_has_feature_*()
>   arm64: alternatives: add shared NOP callback
>

Reviewed-by: Ard Biesheuvel <ardb at kernel.org>

>  arch/arm64/include/asm/alternative-macros.h | 59 ++++++++++++++++--
>  arch/arm64/include/asm/assembler.h          | 10 ++--
>  arch/arm64/include/asm/cpufeature.h         | 15 ++---
>  arch/arm64/include/asm/kvm_mmu.h            |  5 +-
>  arch/arm64/include/asm/lse.h                |  5 +-
>  arch/arm64/kernel/alternative.c             | 66 ++++++++++++---------
>  arch/arm64/kernel/cpufeature.c              | 44 ++++++--------
>  arch/arm64/kernel/entry.S                   |  8 +--
>  arch/arm64/kernel/image-vars.h              |  5 +-
>  arch/arm64/kernel/proton-pack.c             |  2 +-
>  arch/arm64/kvm/hyp/hyp-entry.S              |  4 +-
>  arch/arm64/kvm/va_layout.c                  |  5 +-
>  arch/arm64/tools/cpucaps                    |  2 +
>  13 files changed, 137 insertions(+), 93 deletions(-)
>
> --
> 2.30.2
>



More information about the linux-arm-kernel mailing list