diff options
author | Thomas Gleixner <tglx@linutronix.de> | 2022-09-15 14:11:01 +0300 |
---|---|---|
committer | Peter Zijlstra <peterz@infradead.org> | 2022-10-17 17:41:03 +0300 |
commit | e57ef2ed97c1d078973298658a8096644a1e9e09 (patch) | |
tree | 79cb9a8835ab832a8e8c302abf1ffe0c0ad96c5f /arch/x86/include/asm/current.h | |
parent | fdc9ee7e97aa2c1dfa7ebb092fffec40ffa59108 (diff) | |
download | linux-e57ef2ed97c1d078973298658a8096644a1e9e09.tar.xz |
x86: Put hot per CPU variables into a struct
The layout of per-cpu variables is at the mercy of the compiler. This
can lead to random performance fluctuations from build to build.
Create a structure to hold some of the hottest per-cpu variables,
starting with current_task.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lore.kernel.org/r/20220915111145.179707194@infradead.org
Diffstat (limited to 'arch/x86/include/asm/current.h')
-rw-r--r-- | arch/x86/include/asm/current.h | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/arch/x86/include/asm/current.h b/arch/x86/include/asm/current.h index 3e204e6140b5..63c42ac3cd86 100644 --- a/arch/x86/include/asm/current.h +++ b/arch/x86/include/asm/current.h @@ -3,16 +3,29 @@ #define _ASM_X86_CURRENT_H #include <linux/compiler.h> -#include <asm/percpu.h> #ifndef __ASSEMBLY__ + +#include <linux/cache.h> +#include <asm/percpu.h> + struct task_struct; -DECLARE_PER_CPU(struct task_struct *, current_task); +struct pcpu_hot { + union { + struct { + struct task_struct *current_task; + }; + u8 pad[64]; + }; +}; +static_assert(sizeof(struct pcpu_hot) == 64); + +DECLARE_PER_CPU_ALIGNED(struct pcpu_hot, pcpu_hot); static __always_inline struct task_struct *get_current(void) { - return this_cpu_read_stable(current_task); + return this_cpu_read_stable(pcpu_hot.current_task); } #define current get_current() |