From: jbeulich@xxxxxxxxxx Subject: allow use of split page table lock in non-debug case Patch-mainline: obsolete Index: head-2007-02-27/include/linux/mm.h =================================================================== --- head-2007-02-27.orig/include/linux/mm.h 2007-02-27 16:25:00.000000000 +0100 +++ head-2007-02-27/include/linux/mm.h 2007-02-28 17:11:56.000000000 +0100 @@ -891,7 +891,11 @@ static inline pmd_t *pmd_alloc(struct mm #define pte_lock_init(_page) do { \ spin_lock_init(__pte_lockptr(_page)); \ } while (0) -#define pte_lock_deinit(page) ((page)->mapping = NULL) +#define pte_lock_deinit(_page) do { \ + if ((void *)&((struct page *)0)->mapping \ + < (void *)(__pte_lockptr((struct page *)0) + 1)) \ + (_page)->mapping = NULL; \ +} while (0) #define pte_lockptr(mm, pmd) ({(void)(mm); __pte_lockptr(pmd_page(*(pmd)));}) #else /* Index: head-2007-02-27/include/linux/page-flags.h =================================================================== --- head-2007-02-27.orig/include/linux/page-flags.h 2007-02-27 16:26:22.000000000 +0100 +++ head-2007-02-27/include/linux/page-flags.h 2007-02-28 16:38:41.000000000 +0100 @@ -254,8 +254,16 @@ static inline void SetPageUptodate(struc #define ClearPageUncached(page) clear_bit(PG_uncached, &(page)->flags) #define PageForeign(page) test_bit(PG_foreign, &(page)->flags) +#if NR_CPUS >= CONFIG_SPLIT_PTLOCK_CPUS +#define PageForeignCheck() \ + BUILD_BUG_ON((void *)&((struct page *)0)->mapping \ + < (void *)(__pte_lockptr((struct page *)0) + 1)) +#else +#define PageForeignCheck() ((void)0) +#endif #define SetPageForeign(page, dtor) do { \ set_bit(PG_foreign, &(page)->flags); \ + PageForeignCheck(); \ (page)->mapping = (void *)dtor; \ } while (0) #define ClearPageForeign(page) do { \ Index: head-2007-02-27/mm/Kconfig =================================================================== --- head-2007-02-27.orig/mm/Kconfig 2007-02-27 16:23:14.000000000 +0100 +++ head-2007-02-27/mm/Kconfig 2007-02-28 16:26:48.000000000 +0100 @@ -139,7 +139,8 @@ config SPLIT_PTLOCK_CPUS int default "4096" if ARM && !CPU_CACHE_VIPT default "4096" if PARISC && !PA20 - default "4096" if X86_XEN || X86_64_XEN + default "4096" if X86_XEN && (PREEMPT || DEBUG_SPINLOCK || DEBUG_LOCK_ALLOC) + default "4096" if X86_64_XEN && (DEBUG_SPINLOCK || DEBUG_LOCK_ALLOC) default "4" #