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
|
@ -539,22 +539,6 @@ config ARCH_RANDOM
|
|||
|
||||
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
|
||||
|
||||
menu "Memory setup"
|
||||
|
|
|
@ -15,14 +15,9 @@ struct alt_instr {
|
|||
u8 replacementlen; /* length of new instruction */
|
||||
} __packed;
|
||||
|
||||
#ifdef CONFIG_ALTERNATIVES
|
||||
extern void apply_alternative_instructions(void);
|
||||
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
|
||||
void apply_alternative_instructions(void);
|
||||
void apply_alternatives(struct alt_instr *start, struct alt_instr *end);
|
||||
|
||||
/*
|
||||
* |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" \
|
||||
INSTR_LEN_SANITY_CHECK(altinstr_len(num))
|
||||
|
||||
#ifdef CONFIG_ALTERNATIVES
|
||||
/* alternative assembly primitive: */
|
||||
#define ALTERNATIVE(oldinstr, altinstr, facility) \
|
||||
".pushsection .altinstr_replacement, \"ax\"\n" \
|
||||
|
@ -130,14 +124,6 @@ static inline void apply_alternatives(struct alt_instr *start,
|
|||
ALTINSTR_ENTRY(facility1, 1) \
|
||||
ALTINSTR_ENTRY(facility2, 2) \
|
||||
".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.
|
||||
|
|
|
@ -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 += 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 += 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
|
||||
|
||||
|
@ -77,7 +77,6 @@ obj-$(CONFIG_KPROBES) += kprobes.o
|
|||
obj-$(CONFIG_FUNCTION_TRACER) += mcount.o ftrace.o
|
||||
obj-$(CONFIG_CRASH_DUMP) += crash_dump.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_cpum_cf_events.o
|
||||
|
|
|
@ -433,18 +433,15 @@ int module_finalize(const Elf_Ehdr *hdr,
|
|||
const Elf_Shdr *s;
|
||||
char *secstrings;
|
||||
|
||||
if (IS_ENABLED(CONFIG_ALTERNATIVES)) {
|
||||
secstrings = (void *)hdr + sechdrs[hdr->e_shstrndx].sh_offset;
|
||||
for (s = sechdrs; s < sechdrs + hdr->e_shnum; s++) {
|
||||
if (!strcmp(".altinstructions",
|
||||
secstrings + s->sh_name)) {
|
||||
if (!strcmp(".altinstructions", secstrings + s->sh_name)) {
|
||||
/* patch .altinstructions */
|
||||
void *aseg = (void *)s->sh_addr;
|
||||
|
||||
apply_alternatives(aseg, aseg + s->sh_size);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
jump_label_apply_nops(me);
|
||||
return 0;
|
||||
|
|
Loading…
Reference in New Issue