From f7c05e993032f3797ad6544a62d51a51fa16137c Mon Sep 17 00:00:00 2001 From: caelli Date: Wed, 17 Apr 2024 14:56:44 +0800 Subject: [PATCH] alinux: arm64: adjust tk_core memory layout to #29722367 On some specific hardware with 128 bytes LLC cacheline, tk_core may cause false sharing problem. We can align it to 128 bytes so that it won't be affected by other global variables. This change will make a bit waste on cache utilization but get good number of performance improvement. So for both 64 and 128 bytes aligned LLC cacheline, we adjust tk_core memory layout to avoid potential cacheline contention. Signed-off-by: Peng Wang Acked-by: Shanpei Chen Reviewed-by: Shile Zhang Signed-off-by: caelli Reviewed-by: yilingjin Reviewed-by: yuehongwu Signed-off-by: Jianping Liu --- arch/arm64/Kconfig | 10 ++++++++++ arch/arm64/configs/tencent.config | 1 + kernel/time/timekeeping.c | 15 +++++++++++++++ 3 files changed, 26 insertions(+) diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index 8bcd353e333e..4826d10e9f37 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig @@ -1101,6 +1101,16 @@ config ARCH_HAS_CACHE_LINE_SIZE config ARCH_ENABLE_SPLIT_PMD_PTLOCK def_bool y if PGTABLE_LEVELS > 2 +config ARCH_LLC_128_WORKAROUND + bool "Workaround for 128 bytes LLC cacheline" + depends on ARM64 + default n + help + LLC cacheline size may be up to 128 bytes, and this + is useful if you want to do workaround on such + case. It can be used to align memory address to get + good cache utilization et al. + config SECCOMP bool "Enable seccomp to safely compute untrusted bytecode" ---help--- diff --git a/arch/arm64/configs/tencent.config b/arch/arm64/configs/tencent.config index 59bb3fe625f5..d89c63cbe2bd 100644 --- a/arch/arm64/configs/tencent.config +++ b/arch/arm64/configs/tencent.config @@ -666,6 +666,7 @@ CONFIG_SCSI_AIC7XXX=m CONFIG_SCSI_AIC79XX=m CONFIG_AIC79XX_CMDS_PER_DEVICE=4 CONFIG_AIC79XX_RESET_DELAY_MS=15000 +CONFIG_ARCH_LLC_128_WORKAROUND=y # CONFIG_AIC79XX_DEBUG_ENABLE is not set # CONFIG_AIC79XX_REG_PRETTY_PRINT is not set CONFIG_SCSI_AIC94XX=m diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c index 2bc278dd9854..384e6216336d 100644 --- a/kernel/time/timekeeping.c +++ b/kernel/time/timekeeping.c @@ -46,9 +46,24 @@ enum timekeeping_adv_mode { * cache line. */ static struct { +#ifdef CONFIG_ARCH_LLC_128_WORKAROUND + /* Start seq on the middle of 128 bytes aligned address to + * keep some members of tk_core in the same 64 bytes for + * principle of locality while pushing others to another LLC + * cacheline to avoid false sharing. + */ + u8 padding1[64]; + seqcount_t seq; + /* Push some timekeeper memebers to another LLC cacheline */ + u8 padding2[16]; + struct timekeeper timekeeper; + /* For 128 bytes LLC cacheline */ +} tk_core __aligned(128) = { +#else seqcount_t seq; struct timekeeper timekeeper; } tk_core ____cacheline_aligned = { +#endif .seq = SEQCNT_ZERO(tk_core.seq), };