提交 22fc6ecc 编写于 作者: R Ravikiran G Thirumalai 提交者: Linus Torvalds

[PATCH] Change maxaligned_in_smp alignemnt macros to internodealigned_in_smp macros

____cacheline_maxaligned_in_smp is currently used to align critical structures
and avoid false sharing.  It uses per-arch L1_CACHE_SHIFT_MAX and people find
L1_CACHE_SHIFT_MAX useless.

However, we have been using ____cacheline_maxaligned_in_smp to align
structures on the internode cacheline size.  As per Andi's suggestion,
following patch kills ____cacheline_maxaligned_in_smp and introduces
INTERNODE_CACHE_SHIFT, which defaults to L1_CACHE_SHIFT for all arches.
Arches needing L3/Internode cacheline alignment can define
INTERNODE_CACHE_SHIFT in the arch asm/cache.h.  Patch replaces
____cacheline_maxaligned_in_smp with ____cacheline_internodealigned_in_smp

With this patch, L1_CACHE_SHIFT_MAX can be killed
Signed-off-by: NRavikiran Thirumalai <kiran@scalex86.org>
Signed-off-by: NShai Fultheim <shai@scalex86.org>
Signed-off-by: NAndi Kleen <ak@suse.de>
Signed-off-by: NAndrew Morton <akpm@osdl.org>
Signed-off-by: NLinus Torvalds <torvalds@osdl.org>
上级 6d524aed
...@@ -42,5 +42,5 @@ EXPORT_SYMBOL(init_task); ...@@ -42,5 +42,5 @@ EXPORT_SYMBOL(init_task);
* per-CPU TSS segments. Threads are completely 'soft' on Linux, * per-CPU TSS segments. Threads are completely 'soft' on Linux,
* no more per-task TSS's. * no more per-task TSS's.
*/ */
DEFINE_PER_CPU(struct tss_struct, init_tss) ____cacheline_maxaligned_in_smp = INIT_TSS; DEFINE_PER_CPU(struct tss_struct, init_tss) ____cacheline_internodealigned_in_smp = INIT_TSS;
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
#include <linux/cpu.h> #include <linux/cpu.h>
#include <linux/delay.h> #include <linux/delay.h>
DEFINE_PER_CPU(irq_cpustat_t, irq_stat) ____cacheline_maxaligned_in_smp; DEFINE_PER_CPU(irq_cpustat_t, irq_stat) ____cacheline_internodealigned_in_smp;
EXPORT_PER_CPU_SYMBOL(irq_stat); EXPORT_PER_CPU_SYMBOL(irq_stat);
#ifndef CONFIG_X86_LOCAL_APIC #ifndef CONFIG_X86_LOCAL_APIC
......
...@@ -44,6 +44,6 @@ EXPORT_SYMBOL(init_task); ...@@ -44,6 +44,6 @@ EXPORT_SYMBOL(init_task);
* section. Since TSS's are completely CPU-local, we want them * section. Since TSS's are completely CPU-local, we want them
* on exact cacheline boundaries, to eliminate cacheline ping-pong. * on exact cacheline boundaries, to eliminate cacheline ping-pong.
*/ */
DEFINE_PER_CPU(struct tss_struct, init_tss) ____cacheline_maxaligned_in_smp = INIT_TSS; DEFINE_PER_CPU(struct tss_struct, init_tss) ____cacheline_internodealigned_in_smp = INIT_TSS;
#define ALIGN_TO_4K __attribute__((section(".data.init_task"))) #define ALIGN_TO_4K __attribute__((section(".data.init_task")))
...@@ -45,12 +45,21 @@ ...@@ -45,12 +45,21 @@
#endif /* CONFIG_SMP */ #endif /* CONFIG_SMP */
#endif #endif
#if !defined(____cacheline_maxaligned_in_smp) /*
* The maximum alignment needed for some critical structures
* These could be inter-node cacheline sizes/L3 cacheline
* size etc. Define this in asm/cache.h for your arch
*/
#ifndef INTERNODE_CACHE_SHIFT
#define INTERNODE_CACHE_SHIFT L1_CACHE_SHIFT
#endif
#if !defined(____cacheline_internodealigned_in_smp)
#if defined(CONFIG_SMP) #if defined(CONFIG_SMP)
#define ____cacheline_maxaligned_in_smp \ #define ____cacheline_internodealigned_in_smp \
__attribute__((__aligned__(1 << (L1_CACHE_SHIFT_MAX)))) __attribute__((__aligned__(1 << (INTERNODE_CACHE_SHIFT))))
#else #else
#define ____cacheline_maxaligned_in_smp #define ____cacheline_internodealigned_in_smp
#endif #endif
#endif #endif
......
...@@ -801,7 +801,7 @@ typedef struct hwif_s { ...@@ -801,7 +801,7 @@ typedef struct hwif_s {
unsigned dma; unsigned dma;
void (*led_act)(void *data, int rw); void (*led_act)(void *data, int rw);
} ____cacheline_maxaligned_in_smp ide_hwif_t; } ____cacheline_internodealigned_in_smp ide_hwif_t;
/* /*
* internal ide interrupt handler type * internal ide interrupt handler type
......
...@@ -38,7 +38,7 @@ struct pglist_data; ...@@ -38,7 +38,7 @@ struct pglist_data;
#if defined(CONFIG_SMP) #if defined(CONFIG_SMP)
struct zone_padding { struct zone_padding {
char x[0]; char x[0];
} ____cacheline_maxaligned_in_smp; } ____cacheline_internodealigned_in_smp;
#define ZONE_PADDING(name) struct zone_padding name; #define ZONE_PADDING(name) struct zone_padding name;
#else #else
#define ZONE_PADDING(name) #define ZONE_PADDING(name)
...@@ -233,7 +233,7 @@ struct zone { ...@@ -233,7 +233,7 @@ struct zone {
* rarely used fields: * rarely used fields:
*/ */
char *name; char *name;
} ____cacheline_maxaligned_in_smp; } ____cacheline_internodealigned_in_smp;
/* /*
......
...@@ -65,7 +65,7 @@ struct rcu_ctrlblk { ...@@ -65,7 +65,7 @@ struct rcu_ctrlblk {
long cur; /* Current batch number. */ long cur; /* Current batch number. */
long completed; /* Number of the last completed batch */ long completed; /* Number of the last completed batch */
int next_pending; /* Is the next batch already waiting? */ int next_pending; /* Is the next batch already waiting? */
} ____cacheline_maxaligned_in_smp; } ____cacheline_internodealigned_in_smp;
/* Is batch a before batch b ? */ /* Is batch a before batch b ? */
static inline int rcu_batch_before(long a, long b) static inline int rcu_batch_before(long a, long b)
......
...@@ -61,9 +61,9 @@ struct rcu_state { ...@@ -61,9 +61,9 @@ struct rcu_state {
/* for current batch to proceed. */ /* for current batch to proceed. */
}; };
static struct rcu_state rcu_state ____cacheline_maxaligned_in_smp = static struct rcu_state rcu_state ____cacheline_internodealigned_in_smp =
{.lock = SPIN_LOCK_UNLOCKED, .cpumask = CPU_MASK_NONE }; {.lock = SPIN_LOCK_UNLOCKED, .cpumask = CPU_MASK_NONE };
static struct rcu_state rcu_bh_state ____cacheline_maxaligned_in_smp = static struct rcu_state rcu_bh_state ____cacheline_internodealigned_in_smp =
{.lock = SPIN_LOCK_UNLOCKED, .cpumask = CPU_MASK_NONE }; {.lock = SPIN_LOCK_UNLOCKED, .cpumask = CPU_MASK_NONE };
DEFINE_PER_CPU(struct rcu_data, rcu_data) = { 0L }; DEFINE_PER_CPU(struct rcu_data, rcu_data) = { 0L };
......
...@@ -18,10 +18,10 @@ ...@@ -18,10 +18,10 @@
*/ */
#ifdef CONFIG_SPARSEMEM_EXTREME #ifdef CONFIG_SPARSEMEM_EXTREME
struct mem_section *mem_section[NR_SECTION_ROOTS] struct mem_section *mem_section[NR_SECTION_ROOTS]
____cacheline_maxaligned_in_smp; ____cacheline_internodealigned_in_smp;
#else #else
struct mem_section mem_section[NR_SECTION_ROOTS][SECTIONS_PER_ROOT] struct mem_section mem_section[NR_SECTION_ROOTS][SECTIONS_PER_ROOT]
____cacheline_maxaligned_in_smp; ____cacheline_internodealigned_in_smp;
#endif #endif
EXPORT_SYMBOL(mem_section); EXPORT_SYMBOL(mem_section);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册