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 <rocking@linux.alibaba.com> Acked-by: Shanpei Chen <shanpeic@linux.alibaba.com> Reviewed-by: Shile Zhang <shile.zhang@linux.alibaba.com> Signed-off-by: caelli <caelli@tencent.com> Reviewed-by: yilingjin <yilingjin@tencent.com> Reviewed-by: yuehongwu <yuehongwu@tencent.com> Signed-off-by: Jianping Liu <frankjpliu@tencent.com>
This commit is contained in:
parent
0af6134c5d
commit
f7c05e9930
|
@ -1101,6 +1101,16 @@ config ARCH_HAS_CACHE_LINE_SIZE
|
||||||
config ARCH_ENABLE_SPLIT_PMD_PTLOCK
|
config ARCH_ENABLE_SPLIT_PMD_PTLOCK
|
||||||
def_bool y if PGTABLE_LEVELS > 2
|
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
|
config SECCOMP
|
||||||
bool "Enable seccomp to safely compute untrusted bytecode"
|
bool "Enable seccomp to safely compute untrusted bytecode"
|
||||||
---help---
|
---help---
|
||||||
|
|
|
@ -666,6 +666,7 @@ CONFIG_SCSI_AIC7XXX=m
|
||||||
CONFIG_SCSI_AIC79XX=m
|
CONFIG_SCSI_AIC79XX=m
|
||||||
CONFIG_AIC79XX_CMDS_PER_DEVICE=4
|
CONFIG_AIC79XX_CMDS_PER_DEVICE=4
|
||||||
CONFIG_AIC79XX_RESET_DELAY_MS=15000
|
CONFIG_AIC79XX_RESET_DELAY_MS=15000
|
||||||
|
CONFIG_ARCH_LLC_128_WORKAROUND=y
|
||||||
# CONFIG_AIC79XX_DEBUG_ENABLE is not set
|
# CONFIG_AIC79XX_DEBUG_ENABLE is not set
|
||||||
# CONFIG_AIC79XX_REG_PRETTY_PRINT is not set
|
# CONFIG_AIC79XX_REG_PRETTY_PRINT is not set
|
||||||
CONFIG_SCSI_AIC94XX=m
|
CONFIG_SCSI_AIC94XX=m
|
||||||
|
|
|
@ -46,9 +46,24 @@ enum timekeeping_adv_mode {
|
||||||
* cache line.
|
* cache line.
|
||||||
*/
|
*/
|
||||||
static struct {
|
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;
|
seqcount_t seq;
|
||||||
struct timekeeper timekeeper;
|
struct timekeeper timekeeper;
|
||||||
} tk_core ____cacheline_aligned = {
|
} tk_core ____cacheline_aligned = {
|
||||||
|
#endif
|
||||||
.seq = SEQCNT_ZERO(tk_core.seq),
|
.seq = SEQCNT_ZERO(tk_core.seq),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue