diff options
author | Will Deacon <will.deacon@arm.com> | 2015-07-28 19:07:28 +0100 |
---|---|---|
committer | Will Deacon <will.deacon@arm.com> | 2015-07-30 19:07:28 +0100 |
commit | ef5e724b25c9f90b7683bb2d45833ebac0989dcb (patch) | |
tree | ba29fb37e3442b0bba787ed1edbb23c7b30f45d6 /arch/arm64/include/asm/alternative.h | |
parent | 6c020ea8dc3a8adee81b6f141428a7a75249706e (diff) | |
download | lwn-ef5e724b25c9f90b7683bb2d45833ebac0989dcb.tar.gz lwn-ef5e724b25c9f90b7683bb2d45833ebac0989dcb.zip |
arm64: alternative: put secondary CPUs into polling loop during patch
When patching the kernel text with alternatives, we may end up patching
parts of the stop_machine state machine (e.g. atomic_dec_and_test in
ack_state) and consequently corrupt the instruction stream of any
secondary CPUs.
This patch passes the cpu_online_mask to stop_machine, forcing all of
the CPUs into our own callback which can place the secondary cores into
a dumb (but safe!) polling loop whilst the patching is carried out.
Signed-off-by: Will Deacon <will.deacon@arm.com>
Diffstat (limited to 'arch/arm64/include/asm/alternative.h')
-rw-r--r-- | arch/arm64/include/asm/alternative.h | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/arch/arm64/include/asm/alternative.h b/arch/arm64/include/asm/alternative.h index b474e9106bc2..d56ec0715157 100644 --- a/arch/arm64/include/asm/alternative.h +++ b/arch/arm64/include/asm/alternative.h @@ -3,6 +3,7 @@ #ifndef __ASSEMBLY__ +#include <linux/init.h> #include <linux/kconfig.h> #include <linux/types.h> #include <linux/stddef.h> @@ -16,7 +17,7 @@ struct alt_instr { u8 alt_len; /* size of new instruction(s), <= orig_len */ }; -void apply_alternatives_all(void); +void __init apply_alternatives_all(void); void apply_alternatives(void *start, size_t length); void free_alternatives_memory(void); |