From abc0a7bdac17dce62444f1e5b75b34402dc0c152 Mon Sep 17 00:00:00 2001 From: Dominique Martinet Date: Fri, 13 Jul 2018 15:40:47 +0900 Subject: [PATCH] mcs_rwlock: remove aligned(64) attribute if ENABLE_UBSAN The attribute would impose 64-bytes alignment that we do not respect later because the whole structures (e.g. process/thread) are allocated at 32bytes boundaries with kmalloc These are however justified for performance reason as we do not want them on same page cache line, so just accept slower performance for UBSAN only Change-Id: Ia28968257675b7ae97b0391471986e6bf6485b7b --- arch/arm64/kernel/include/arch-lock.h | 25 +++++++++++++++++++++---- arch/x86_64/kernel/include/arch-lock.h | 25 +++++++++++++++++++++---- 2 files changed, 42 insertions(+), 8 deletions(-) diff --git a/arch/arm64/kernel/include/arch-lock.h b/arch/arm64/kernel/include/arch-lock.h index 5d4d092d..b464fd8b 100644 --- a/arch/arm64/kernel/include/arch-lock.h +++ b/arch/arm64/kernel/include/arch-lock.h @@ -8,6 +8,7 @@ #include #include "affinity.h" #include +#include "config.h" //#define DEBUG_SPINLOCK //#define DEBUG_MCS_RWLOCK @@ -259,7 +260,11 @@ typedef struct mcs_lock_node { unsigned long locked; struct mcs_lock_node *next; unsigned long irqsave; -} __attribute__((aligned(64))) mcs_lock_node_t; +#ifndef ENABLE_UBSAN +} __aligned(64) mcs_lock_node_t; +#else +} mcs_lock_node_t; +#endif typedef mcs_lock_node_t mcs_lock_t; @@ -349,14 +354,22 @@ typedef struct mcs_rwlock_node { char dmy1; // unused char dmy2; // unused struct mcs_rwlock_node *next; -} __attribute__((aligned(64))) mcs_rwlock_node_t; +#ifndef ENABLE_UBSAN +} __aligned(64) mcs_rwlock_node_t; +#else +} mcs_rwlock_node_t; +#endif typedef struct mcs_rwlock_node_irqsave { #ifndef SPINLOCK_IN_MCS_RWLOCK struct mcs_rwlock_node node; #endif unsigned long irqsave; -} __attribute__((aligned(64))) mcs_rwlock_node_irqsave_t; +#ifndef ENABLE_UBSAN +} __aligned(64) mcs_rwlock_node_irqsave_t; +#else +} mcs_rwlock_node_irqsave_t; +#endif typedef struct mcs_rwlock_lock { #ifdef SPINLOCK_IN_MCS_RWLOCK @@ -365,7 +378,11 @@ typedef struct mcs_rwlock_lock { struct mcs_rwlock_node reader; /* common reader lock */ struct mcs_rwlock_node *node; /* base */ #endif -} __attribute__((aligned(64))) mcs_rwlock_lock_t; +#ifndef ENABLE_UBSAN +} __aligned(64) mcs_rwlock_lock_t; +#else +} mcs_rwlock_lock_t; +#endif static void mcs_rwlock_init(struct mcs_rwlock_lock *lock) diff --git a/arch/x86_64/kernel/include/arch-lock.h b/arch/x86_64/kernel/include/arch-lock.h index da4bdbfe..3726353a 100644 --- a/arch/x86_64/kernel/include/arch-lock.h +++ b/arch/x86_64/kernel/include/arch-lock.h @@ -7,6 +7,7 @@ #include #include #include +#include "config.h" //#define DEBUG_SPINLOCK //#define DEBUG_MCS_RWLOCK @@ -182,7 +183,11 @@ typedef struct mcs_lock_node { unsigned long locked; struct mcs_lock_node *next; unsigned long irqsave; -} __attribute__((aligned(64))) mcs_lock_node_t; +#ifndef ENABLE_UBSAN +} __aligned(64) mcs_lock_node_t; +#else +} mcs_lock_node_t; +#endif typedef mcs_lock_node_t mcs_lock_t; @@ -275,14 +280,22 @@ typedef struct mcs_rwlock_node { char dmy1; // unused char dmy2; // unused struct mcs_rwlock_node *next; -} __attribute__((aligned(64))) mcs_rwlock_node_t; +#ifndef ENABLE_UBSAN +} __aligned(64) mcs_rwlock_node_t; +#else +} mcs_rwlock_node_t; +#endif typedef struct mcs_rwlock_node_irqsave { #ifndef SPINLOCK_IN_MCS_RWLOCK struct mcs_rwlock_node node; #endif unsigned long irqsave; -} __attribute__((aligned(64))) mcs_rwlock_node_irqsave_t; +#ifndef ENABLE_UBSAN +} __aligned(64) mcs_rwlock_node_irqsave_t; +#else +} mcs_rwlock_node_irqsave_t; +#endif typedef struct mcs_rwlock_lock { #ifdef SPINLOCK_IN_MCS_RWLOCK @@ -291,7 +304,11 @@ typedef struct mcs_rwlock_lock { struct mcs_rwlock_node reader; /* common reader lock */ struct mcs_rwlock_node *node; /* base */ #endif -} __attribute__((aligned(64))) mcs_rwlock_lock_t; +#ifndef ENABLE_UBSAN +} __aligned(64) mcs_rwlock_lock_t; +#else +} mcs_rwlock_lock_t; +#endif static void mcs_rwlock_init(struct mcs_rwlock_lock *lock)