mbox series

[0/2] arm64: cpucap handling cleanups

Message ID 20231212170910.3745497-1-mark.rutland@arm.com (mailing list archive)
Headers show
Series arm64: cpucap handling cleanups | expand

Message

Mark Rutland Dec. 12, 2023, 5:09 p.m. UTC
The recent changes to remove cpus_have_const_cap() left a period between
detecting cpucaps and patching alternatives where it is necessary to use
cpus_have_cap() to check that a cpucap has been detected. During this
period we do a few things, and there's a risk that code using a mixture
of cpus_have_cap() and alternative_has_cap_*() sees an inconsistent
state.

These patches rework the cpucap code to minimize the period between
detecting cpucaps and patching the relevant alternatives, deferring
other work until after the alternatives have been patched. This removes
the need for some code to use cpus_have_cap(), and allows them to use
common helper functions that may use alternative_has_cap_*() internally,
making them consistent with other kernel code.

This cleanup was requested by Will across:

  https://lore.kernel.org/linux-arm-kernel/20231127154818.GA8453@willie-the-truck/
  https://lore.kernel.org/linux-arm-kernel/20231127163103.GA8627@willie-the-truck/
  https://lore.kernel.org/linux-arm-kernel/20231127164127.GB8627@willie-the-truck/
  https://lore.kernel.org/linux-arm-kernel/20231128110339.GA9717@willie-the-truck/

The patches are based on the arm64 for-next/fixes branch, whose HEAD
commit is currently:

  f5259997f3e8d6ed ("arm64: Avoid enabling KPTI unnecessarily")

... which patch 1 is partially a cleanup for.

I've given both patches some testing in a few configurations (e.g.
with and without nVHE forced on the command line) to check that
detection and patching works as expected.

Mark.

Mark Rutland (2):
  arm64: Cleanup system cpucap handling
  arm64: Align boot cpucap handling with system cpucap handling

 arch/arm64/include/asm/cpufeature.h |   1 +
 arch/arm64/kernel/cpufeature.c      | 105 +++++++++++++++-------------
 arch/arm64/kernel/fpsimd.c          |   4 +-
 arch/arm64/kernel/smp.c             |  12 +---
 4 files changed, 64 insertions(+), 58 deletions(-)

Comments

Will Deacon Dec. 13, 2023, 5:25 p.m. UTC | #1
On Tue, 12 Dec 2023 17:09:08 +0000, Mark Rutland wrote:
> The recent changes to remove cpus_have_const_cap() left a period between
> detecting cpucaps and patching alternatives where it is necessary to use
> cpus_have_cap() to check that a cpucap has been detected. During this
> period we do a few things, and there's a risk that code using a mixture
> of cpus_have_cap() and alternative_has_cap_*() sees an inconsistent
> state.
> 
> [...]

Applied to arm64 (for-next/cpufeature), thanks!

Basing the series on for-next/fixes makes it fiddly to manage, so I
dropped the kpti_install_ng_mappings() hunk from patch 1 and will
re-introduce it when I merge the branches together.

[1/2] arm64: Cleanup system cpucap handling
      https://git.kernel.org/arm64/c/63a2d92e1461
[2/2] arm64: Align boot cpucap handling with system cpucap handling
      https://git.kernel.org/arm64/c/eb15d707c252

Cheers,
Mark Rutland Dec. 13, 2023, 5:39 p.m. UTC | #2
On Wed, Dec 13, 2023 at 05:25:18PM +0000, Will Deacon wrote:
> On Tue, 12 Dec 2023 17:09:08 +0000, Mark Rutland wrote:
> > The recent changes to remove cpus_have_const_cap() left a period between
> > detecting cpucaps and patching alternatives where it is necessary to use
> > cpus_have_cap() to check that a cpucap has been detected. During this
> > period we do a few things, and there's a risk that code using a mixture
> > of cpus_have_cap() and alternative_has_cap_*() sees an inconsistent
> > state.
> > 
> > [...]
> 
> Applied to arm64 (for-next/cpufeature), thanks!
> 
> Basing the series on for-next/fixes makes it fiddly to manage, so I
> dropped the kpti_install_ng_mappings() hunk from patch 1 and will
> re-introduce it when I merge the branches together.

Thanks, and sorry for the hassle!

The changes and resolution in that branch look good to me (and build and boot
cleanly); I'll go throw that on my test system and see if anything blows up
overnight.

Mark.

> [1/2] arm64: Cleanup system cpucap handling
>       https://git.kernel.org/arm64/c/63a2d92e1461
> [2/2] arm64: Align boot cpucap handling with system cpucap handling
>       https://git.kernel.org/arm64/c/eb15d707c252
> 
> Cheers,
> -- 
> Will
> 
> https://fixes.arm64.dev
> https://next.arm64.dev
> https://will.arm64.dev