From 80a39ad19eaef1bf1472d681c3f174fb2e9db357 Mon Sep 17 00:00:00 2001 From: Heiko Carstens Date: Thu, 12 Jan 2012 17:17:27 -0800 Subject: [PATCH] --- yaml --- r: 284351 b: refs/heads/master c: 43570fd2f47ba518145e9289f54cde3dba4c8b25 h: refs/heads/master i: 284349: 9527de1c7b298716886d50e852ebc39cc3817590 284347: 2c842705b076fba00a9d437fdafe2fd38e6defd8 284343: 562743986f0cd053e8d57b44d3ced2491740ad79 284335: a0411dda5b6de05fcfb76690ceb938ea33acefde 284319: 7d7bcc5b303fd122ecfd17a473cbabbc3caf172a 284287: 9585608ae40598dd4a4a5d3f9be7a6103cdd25b9 v: v3 --- [refs] | 2 +- trunk/arch/Kconfig | 8 ++++++++ trunk/arch/x86/Kconfig | 1 + trunk/include/linux/mm_types.h | 9 ++++----- trunk/mm/slub.c | 6 +++--- 5 files changed, 17 insertions(+), 9 deletions(-) diff --git a/[refs] b/[refs] index 65a99aee026c..8f5b9ffb4d86 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 0d259cf8190b9c446eefd5225ffcc3941e76a432 +refs/heads/master: 43570fd2f47ba518145e9289f54cde3dba4c8b25 diff --git a/trunk/arch/Kconfig b/trunk/arch/Kconfig index 2505740b81d2..a2c5c077c32d 100644 --- a/trunk/arch/Kconfig +++ b/trunk/arch/Kconfig @@ -185,4 +185,12 @@ config HAVE_RCU_TABLE_FREE config ARCH_HAVE_NMI_SAFE_CMPXCHG bool +config HAVE_ALIGNED_STRUCT_PAGE + bool + help + This makes sure that struct pages are double word aligned and that + e.g. the SLUB allocator can perform double word atomic operations + on a struct page for better performance. However selecting this + might increase the size of a struct page by a word. + source "kernel/gcov/Kconfig" diff --git a/trunk/arch/x86/Kconfig b/trunk/arch/x86/Kconfig index a150f4c35e94..5201a2c27239 100644 --- a/trunk/arch/x86/Kconfig +++ b/trunk/arch/x86/Kconfig @@ -60,6 +60,7 @@ config X86 select PERF_EVENTS select HAVE_PERF_EVENTS_NMI select ANON_INODES + select HAVE_ALIGNED_STRUCT_PAGE if SLUB && !M386 select HAVE_ARCH_KMEMCHECK select HAVE_USER_RETURN_NOTIFIER select ARCH_BINFMT_ELF_RANDOMIZE_PIE diff --git a/trunk/include/linux/mm_types.h b/trunk/include/linux/mm_types.h index 5b42f1b34eb7..3cc3062b3767 100644 --- a/trunk/include/linux/mm_types.h +++ b/trunk/include/linux/mm_types.h @@ -151,12 +151,11 @@ struct page { #endif } /* - * If another subsystem starts using the double word pairing for atomic - * operations on struct page then it must change the #if to ensure - * proper alignment of the page struct. + * The struct page can be forced to be double word aligned so that atomic ops + * on double words work. The SLUB allocator can make use of such a feature. */ -#if defined(CONFIG_SLUB) && defined(CONFIG_CMPXCHG_LOCAL) - __attribute__((__aligned__(2*sizeof(unsigned long)))) +#ifdef CONFIG_HAVE_ALIGNED_STRUCT_PAGE + __aligned(2 * sizeof(unsigned long)) #endif ; diff --git a/trunk/mm/slub.c b/trunk/mm/slub.c index 5d37b5e44140..72aa84134609 100644 --- a/trunk/mm/slub.c +++ b/trunk/mm/slub.c @@ -366,7 +366,7 @@ static inline bool __cmpxchg_double_slab(struct kmem_cache *s, struct page *page const char *n) { VM_BUG_ON(!irqs_disabled()); -#ifdef CONFIG_CMPXCHG_DOUBLE +#if defined(CONFIG_CMPXCHG_DOUBLE) && defined(CONFIG_HAVE_ALIGNED_STRUCT_PAGE) if (s->flags & __CMPXCHG_DOUBLE) { if (cmpxchg_double(&page->freelist, &page->counters, freelist_old, counters_old, @@ -400,7 +400,7 @@ static inline bool cmpxchg_double_slab(struct kmem_cache *s, struct page *page, void *freelist_new, unsigned long counters_new, const char *n) { -#ifdef CONFIG_CMPXCHG_DOUBLE +#if defined(CONFIG_CMPXCHG_DOUBLE) && defined(CONFIG_HAVE_ALIGNED_STRUCT_PAGE) if (s->flags & __CMPXCHG_DOUBLE) { if (cmpxchg_double(&page->freelist, &page->counters, freelist_old, counters_old, @@ -3014,7 +3014,7 @@ static int kmem_cache_open(struct kmem_cache *s, } } -#ifdef CONFIG_CMPXCHG_DOUBLE +#if defined(CONFIG_CMPXCHG_DOUBLE) && defined(CONFIG_HAVE_ALIGNED_STRUCT_PAGE) if (system_has_cmpxchg_double() && (s->flags & SLAB_DEBUG_FLAGS) == 0) /* Enable fast mode */ s->flags |= __CMPXCHG_DOUBLE;