mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-11-01 00:48:50 +00:00
a0776ec8e9
It's not efficient to use a per-cpu variable just to store how many physical stack register a cpu has. Ever since the incarnation of ia64 up till upcoming Montecito processor, that variable has "glued" to 96. Having a variable in memory means that the kernel is burning an extra cacheline access on every syscall and kernel exit path. Such "static" value is better served with the instruction patching utility exists today. Convert ia64_phys_stacked_size_p8 into dynamic insn patching. This also has a pleasant side effect of eliminating access to per-cpu area while psr.ic=0 in the kernel exit path. (fixable for per-cpu DTC work, but why bother?) There are some concerns with the default value that the instruc- tion encoded in the kernel image. It shouldn't be concerned. The reasons are: (1) cpu_init() is called at CPU initialization. In there, we find out physical stack register size from PAL and patch two instructions in kernel exit code. The code in question can not be executed before the patching is done. (2) current implementation stores zero in ia64_phys_stacked_size_p8, and that's what the current kernel exit path loads the value with. With the new code, it is equivalent that we store reg size 96 in ia64_phys_stacked_size_p8, thus creating a better safety net. Given (1) above can never fail, having (2) is just a bonus. All in all, this patch allow one less memory reference in the kernel exit path, thus reducing syscall and interrupt return latency; and avoid polluting potential useful data in the CPU cache. Signed-off-by: Ken Chen <kenneth.w.chen@intel.com> Signed-off-by: Tony Luck <tony.luck@intel.com>
24 lines
1,002 B
C
24 lines
1,002 B
C
#ifndef _ASM_IA64_SECTIONS_H
|
|
#define _ASM_IA64_SECTIONS_H
|
|
|
|
/*
|
|
* Copyright (C) 1998-2003 Hewlett-Packard Co
|
|
* David Mosberger-Tang <davidm@hpl.hp.com>
|
|
*/
|
|
|
|
#include <asm-generic/sections.h>
|
|
|
|
extern char __per_cpu_start[], __per_cpu_end[], __phys_per_cpu_start[];
|
|
extern char __start___vtop_patchlist[], __end___vtop_patchlist[];
|
|
extern char __start___mckinley_e9_bundles[], __end___mckinley_e9_bundles[];
|
|
extern char __start___phys_stack_reg_patchlist[], __end___phys_stack_reg_patchlist[];
|
|
extern char __start_gate_section[];
|
|
extern char __start_gate_mckinley_e9_patchlist[], __end_gate_mckinley_e9_patchlist[];
|
|
extern char __start_gate_vtop_patchlist[], __end_gate_vtop_patchlist[];
|
|
extern char __start_gate_fsyscall_patchlist[], __end_gate_fsyscall_patchlist[];
|
|
extern char __start_gate_brl_fsys_bubble_down_patchlist[], __end_gate_brl_fsys_bubble_down_patchlist[];
|
|
extern char __start_unwind[], __end_unwind[];
|
|
extern char __start_ivt_text[], __end_ivt_text[];
|
|
|
|
#endif /* _ASM_IA64_SECTIONS_H */
|
|
|