From: Ravikiran G Thirumalai vSMP specific alignment patch to 1. Define INTERNODE_CACHE_SHIFT for vSMP 2. Use this for alignment of critical structures 3. Use INTERNODE_CACHE_SHIFT for ARCH_MIN_TASKALIGN, and let the slab align task_struct allocations to the internode cacheline size 4. Introduce and use ARCH_MIN_MMSTRUCT_ALIGN for mm_struct slab allocations. Signed-off-by: Ravikiran Thirumalai Signed-off-by: Shai Fultheim Cc: Andi Kleen Signed-off-by: Andrew Morton --- include/asm-x86_64/cache.h | 12 ++++++++++++ include/asm-x86_64/processor.h | 6 ++++++ kernel/fork.c | 6 +++++- 3 files changed, 23 insertions(+), 1 deletion(-) diff -puN include/asm-x86_64/cache.h~inclusion-of-scalemp-vsmp-architecture-patches-vsmp_align include/asm-x86_64/cache.h --- devel/include/asm-x86_64/cache.h~inclusion-of-scalemp-vsmp-architecture-patches-vsmp_align 2005-12-12 02:16:50.000000000 -0800 +++ devel-akpm/include/asm-x86_64/cache.h 2005-12-12 02:16:50.000000000 -0800 @@ -11,4 +11,16 @@ #define L1_CACHE_BYTES (1 << L1_CACHE_SHIFT) #define L1_CACHE_SHIFT_MAX 7 /* largest L1 which this arch supports */ +#ifdef CONFIG_X86_VSMP + +/* vSMP Internode cacheline shift */ +#define INTERNODE_CACHE_SHIFT (12) +#ifdef CONFIG_SMP +#define __cacheline_aligned_in_smp \ + __attribute__((__aligned__(1 << (INTERNODE_CACHE_SHIFT)))) \ + __attribute__((__section__(".data.page_aligned"))) +#endif + +#endif + #endif diff -puN include/asm-x86_64/processor.h~inclusion-of-scalemp-vsmp-architecture-patches-vsmp_align include/asm-x86_64/processor.h --- devel/include/asm-x86_64/processor.h~inclusion-of-scalemp-vsmp-architecture-patches-vsmp_align 2005-12-12 02:16:50.000000000 -0800 +++ devel-akpm/include/asm-x86_64/processor.h 2005-12-12 02:16:50.000000000 -0800 @@ -227,7 +227,13 @@ struct tss_struct { extern struct cpuinfo_x86 boot_cpu_data; DECLARE_PER_CPU(struct tss_struct,init_tss); +#ifdef CONFIG_X86_VSMP +#define ARCH_MIN_TASKALIGN (1 << INTERNODE_CACHE_SHIFT) +#define ARCH_MIN_MMSTRUCT_ALIGN (1 << INTERNODE_CACHE_SHIFT) +#else #define ARCH_MIN_TASKALIGN 16 +#define ARCH_MIN_MMSTRUCT_ALIGN 0 +#endif struct thread_struct { unsigned long rsp0; diff -puN kernel/fork.c~inclusion-of-scalemp-vsmp-architecture-patches-vsmp_align kernel/fork.c --- devel/kernel/fork.c~inclusion-of-scalemp-vsmp-architecture-patches-vsmp_align 2005-12-12 02:16:50.000000000 -0800 +++ devel-akpm/kernel/fork.c 2005-12-12 02:16:50.000000000 -0800 @@ -1290,6 +1290,10 @@ long do_fork(unsigned long clone_flags, return pid; } +#ifndef ARCH_MIN_MMSTRUCT_ALIGN +#define ARCH_MIN_MMSTRUCT_ALIGN 0 +#endif + void __init proc_caches_init(void) { sighand_cachep = kmem_cache_create("sighand_cache", @@ -1308,6 +1312,6 @@ void __init proc_caches_init(void) sizeof(struct vm_area_struct), 0, SLAB_PANIC, NULL, NULL); mm_cachep = kmem_cache_create("mm_struct", - sizeof(struct mm_struct), 0, + sizeof(struct mm_struct), ARCH_MIN_MMSTRUCT_ALIGN, SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL, NULL); } _