s390: enable CPU alternatives unconditionally
Remove the CPU_ALTERNATIVES config option and enable the code unconditionally. The config option was only added to avoid a conflict with the named saved segment support. Since that code is gone there is no reason to keep the CPU_ALTERNATIVES config option. Just enable it unconditionally to also reduce the number of config options and make it less likely that something breaks. Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
This commit is contained in:
parent
a6de0a91d9
commit
049a2c2d48
4 changed files with 10 additions and 44 deletions
|
@ -539,22 +539,6 @@ config ARCH_RANDOM
|
||||||
|
|
||||||
If unsure, say Y.
|
If unsure, say Y.
|
||||||
|
|
||||||
config ALTERNATIVES
|
|
||||||
def_bool y
|
|
||||||
prompt "Patch optimized instructions for running CPU type"
|
|
||||||
help
|
|
||||||
When enabled the kernel code is compiled with additional
|
|
||||||
alternative instructions blocks optimized for newer CPU types.
|
|
||||||
These alternative instructions blocks are patched at kernel boot
|
|
||||||
time when running CPU supports them. This mechanism is used to
|
|
||||||
optimize some critical code paths (i.e. spinlocks) for newer CPUs
|
|
||||||
even if kernel is build to support older machine generations.
|
|
||||||
|
|
||||||
This mechanism could be disabled by appending "noaltinstr"
|
|
||||||
option to the kernel command line.
|
|
||||||
|
|
||||||
If unsure, say Y.
|
|
||||||
|
|
||||||
endmenu
|
endmenu
|
||||||
|
|
||||||
menu "Memory setup"
|
menu "Memory setup"
|
||||||
|
|
|
@ -15,14 +15,9 @@ struct alt_instr {
|
||||||
u8 replacementlen; /* length of new instruction */
|
u8 replacementlen; /* length of new instruction */
|
||||||
} __packed;
|
} __packed;
|
||||||
|
|
||||||
#ifdef CONFIG_ALTERNATIVES
|
void apply_alternative_instructions(void);
|
||||||
extern void apply_alternative_instructions(void);
|
void apply_alternatives(struct alt_instr *start, struct alt_instr *end);
|
||||||
extern void apply_alternatives(struct alt_instr *start, struct alt_instr *end);
|
|
||||||
#else
|
|
||||||
static inline void apply_alternative_instructions(void) {};
|
|
||||||
static inline void apply_alternatives(struct alt_instr *start,
|
|
||||||
struct alt_instr *end) {};
|
|
||||||
#endif
|
|
||||||
/*
|
/*
|
||||||
* |661: |662: |6620 |663:
|
* |661: |662: |6620 |663:
|
||||||
* +-----------+---------------------+
|
* +-----------+---------------------+
|
||||||
|
@ -109,7 +104,6 @@ static inline void apply_alternatives(struct alt_instr *start,
|
||||||
b_altinstr(num)":\n\t" altinstr "\n" e_altinstr(num) ":\n" \
|
b_altinstr(num)":\n\t" altinstr "\n" e_altinstr(num) ":\n" \
|
||||||
INSTR_LEN_SANITY_CHECK(altinstr_len(num))
|
INSTR_LEN_SANITY_CHECK(altinstr_len(num))
|
||||||
|
|
||||||
#ifdef CONFIG_ALTERNATIVES
|
|
||||||
/* alternative assembly primitive: */
|
/* alternative assembly primitive: */
|
||||||
#define ALTERNATIVE(oldinstr, altinstr, facility) \
|
#define ALTERNATIVE(oldinstr, altinstr, facility) \
|
||||||
".pushsection .altinstr_replacement, \"ax\"\n" \
|
".pushsection .altinstr_replacement, \"ax\"\n" \
|
||||||
|
@ -130,14 +124,6 @@ static inline void apply_alternatives(struct alt_instr *start,
|
||||||
ALTINSTR_ENTRY(facility1, 1) \
|
ALTINSTR_ENTRY(facility1, 1) \
|
||||||
ALTINSTR_ENTRY(facility2, 2) \
|
ALTINSTR_ENTRY(facility2, 2) \
|
||||||
".popsection\n"
|
".popsection\n"
|
||||||
#else
|
|
||||||
/* Alternative instructions are disabled, let's put just oldinstr in */
|
|
||||||
#define ALTERNATIVE(oldinstr, altinstr, facility) \
|
|
||||||
oldinstr "\n"
|
|
||||||
|
|
||||||
#define ALTERNATIVE_2(oldinstr, altinstr1, facility1, altinstr2, facility2) \
|
|
||||||
oldinstr "\n"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Alternative instructions for different CPU types or capabilities.
|
* Alternative instructions for different CPU types or capabilities.
|
||||||
|
|
|
@ -59,7 +59,7 @@ obj-y += processor.o sys_s390.o ptrace.o signal.o cpcmd.o ebcdic.o nmi.o
|
||||||
obj-y += debug.o irq.o ipl.o dis.o diag.o vdso.o als.o
|
obj-y += debug.o irq.o ipl.o dis.o diag.o vdso.o als.o
|
||||||
obj-y += sysinfo.o jump_label.o lgr.o os_info.o machine_kexec.o pgm_check.o
|
obj-y += sysinfo.o jump_label.o lgr.o os_info.o machine_kexec.o pgm_check.o
|
||||||
obj-y += runtime_instr.o cache.o fpu.o dumpstack.o guarded_storage.o sthyi.o
|
obj-y += runtime_instr.o cache.o fpu.o dumpstack.o guarded_storage.o sthyi.o
|
||||||
obj-y += entry.o reipl.o relocate_kernel.o kdebugfs.o
|
obj-y += entry.o reipl.o relocate_kernel.o kdebugfs.o alternative.o
|
||||||
|
|
||||||
extra-y += head.o head64.o vmlinux.lds
|
extra-y += head.o head64.o vmlinux.lds
|
||||||
|
|
||||||
|
@ -77,7 +77,6 @@ obj-$(CONFIG_KPROBES) += kprobes.o
|
||||||
obj-$(CONFIG_FUNCTION_TRACER) += mcount.o ftrace.o
|
obj-$(CONFIG_FUNCTION_TRACER) += mcount.o ftrace.o
|
||||||
obj-$(CONFIG_CRASH_DUMP) += crash_dump.o
|
obj-$(CONFIG_CRASH_DUMP) += crash_dump.o
|
||||||
obj-$(CONFIG_UPROBES) += uprobes.o
|
obj-$(CONFIG_UPROBES) += uprobes.o
|
||||||
obj-$(CONFIG_ALTERNATIVES) += alternative.o
|
|
||||||
|
|
||||||
obj-$(CONFIG_PERF_EVENTS) += perf_event.o perf_cpum_cf.o perf_cpum_sf.o
|
obj-$(CONFIG_PERF_EVENTS) += perf_event.o perf_cpum_cf.o perf_cpum_sf.o
|
||||||
obj-$(CONFIG_PERF_EVENTS) += perf_cpum_cf_events.o
|
obj-$(CONFIG_PERF_EVENTS) += perf_cpum_cf_events.o
|
||||||
|
|
|
@ -433,16 +433,13 @@ int module_finalize(const Elf_Ehdr *hdr,
|
||||||
const Elf_Shdr *s;
|
const Elf_Shdr *s;
|
||||||
char *secstrings;
|
char *secstrings;
|
||||||
|
|
||||||
if (IS_ENABLED(CONFIG_ALTERNATIVES)) {
|
secstrings = (void *)hdr + sechdrs[hdr->e_shstrndx].sh_offset;
|
||||||
secstrings = (void *)hdr + sechdrs[hdr->e_shstrndx].sh_offset;
|
for (s = sechdrs; s < sechdrs + hdr->e_shnum; s++) {
|
||||||
for (s = sechdrs; s < sechdrs + hdr->e_shnum; s++) {
|
if (!strcmp(".altinstructions", secstrings + s->sh_name)) {
|
||||||
if (!strcmp(".altinstructions",
|
/* patch .altinstructions */
|
||||||
secstrings + s->sh_name)) {
|
void *aseg = (void *)s->sh_addr;
|
||||||
/* patch .altinstructions */
|
|
||||||
void *aseg = (void *)s->sh_addr;
|
|
||||||
|
|
||||||
apply_alternatives(aseg, aseg + s->sh_size);
|
apply_alternatives(aseg, aseg + s->sh_size);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue