Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756494Ab3JNMpe (ORCPT ); Mon, 14 Oct 2013 08:45:34 -0400 Received: from mga03.intel.com ([143.182.124.21]:10367 "EHLO mga03.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756082Ab3JNMpc (ORCPT ); Mon, 14 Oct 2013 08:45:32 -0400 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="4.93,492,1378882800"; d="scan'208";a="374435788" From: "Kirill A. Shutemov" To: Andrew Morton , Peter Zijlstra Cc: Max Filippov , Chris Zankel , Christoph Lameter , Pekka Enberg , Matt Mackall , linux-kernel@vger.kernel.org, linux-mm@kvack.org, linux-arch@vger.kernel.org, linux-xtensa@linux-xtensa.org, "Kirill A. Shutemov" Subject: [PATCH 1/2] mm: try to detect that page->ptl is in use Date: Mon, 14 Oct 2013 15:45:22 +0300 Message-Id: <1381754723-21783-1-git-send-email-kirill.shutemov@linux.intel.com> X-Mailer: git-send-email 1.8.4.rc3 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2253 Lines: 57 prep_new_page() initialize page->private (and therefore page->ptl) with 0. Make sure nobody took it in use in between allocation of the page and page table constructor. It can happen if arch try to use slab for page table allocation: slab code uses page->slab_cache and page->first_page (for tail pages), which share storage with page->ptl. Signed-off-by: Kirill A. Shutemov --- Documentation/vm/split_page_table_lock | 4 ++++ include/linux/mm.h | 9 +++++++++ 2 files changed, 13 insertions(+) diff --git a/Documentation/vm/split_page_table_lock b/Documentation/vm/split_page_table_lock index e2f617b732..3c54f7dca2 100644 --- a/Documentation/vm/split_page_table_lock +++ b/Documentation/vm/split_page_table_lock @@ -53,6 +53,10 @@ There's no need in special enabling of PTE split page table lock: everything required is done by pgtable_page_ctor() and pgtable_page_dtor(), which must be called on PTE table allocation / freeing. +Make sure the architecture doesn't use slab allocator for page table +allacation: slab uses page->slab_cache and page->first_page for its pages. +These fields share storage with page->ptl. + PMD split lock only makes sense if you have more than two page table levels. diff --git a/include/linux/mm.h b/include/linux/mm.h index 658e8b317f..9a4a873b2f 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -1262,6 +1262,15 @@ static inline spinlock_t *pte_lockptr(struct mm_struct *mm, pmd_t *pmd) static inline bool ptlock_init(struct page *page) { + /* + * prep_new_page() initialize page->private (and therefore page->ptl) + * with 0. Make sure nobody took it in use in between. + * + * It can happen if arch try to use slab for page table allocation: + * slab code uses page->slab_cache and page->first_page (for tail + * pages), which share storage with page->ptl. + */ + VM_BUG_ON(page->ptl); if (!ptlock_alloc(page)) return false; spin_lock_init(ptlock_ptr(page)); -- 1.8.4.rc3 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/