Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1758934Ab3IHQyJ (ORCPT ); Sun, 8 Sep 2013 12:54:09 -0400 Received: from e28smtp02.in.ibm.com ([122.248.162.2]:52237 "EHLO e28smtp02.in.ibm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1758765Ab3IHQyF (ORCPT ); Sun, 8 Sep 2013 12:54:05 -0400 From: "Aneesh Kumar K.V" To: Naoya Horiguchi , linux-mm@kvack.org Cc: Andrew Morton , Mel Gorman , Andi Kleen , Michal Hocko , KOSAKI Motohiro , Rik van Riel , Andrea Arcangeli , kirill.shutemov@linux.intel.com, Alex Thorlton , linux-kernel@vger.kernel.org Subject: Re: [PATCH 1/2] hugetlbfs: support split page table lock In-Reply-To: <1378416466-30913-2-git-send-email-n-horiguchi@ah.jp.nec.com> References: <1378416466-30913-1-git-send-email-n-horiguchi@ah.jp.nec.com> <1378416466-30913-2-git-send-email-n-horiguchi@ah.jp.nec.com> User-Agent: Notmuch/0.16+32~g01f5508 (http://notmuchmail.org) Emacs/24.3.50.1 (x86_64-unknown-linux-gnu) Date: Sun, 08 Sep 2013 22:23:55 +0530 Message-ID: <871u4zi7a4.fsf@linux.vnet.ibm.com> MIME-Version: 1.0 Content-Type: text/plain X-TM-AS-MML: No X-Content-Scanned: Fidelis XPS MAILER x-cbid: 13090816-5816-0000-0000-000009CB9D2B Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3504 Lines: 98 Naoya Horiguchi writes: > Currently all of page table handling by hugetlbfs code are done under > mm->page_table_lock. So when a process have many threads and they heavily > access to the memory, lock contention happens and impacts the performance. > > This patch makes hugepage support split page table lock so that we use > page->ptl of the leaf node of page table tree which is pte for normal pages > but can be pmd and/or pud for hugepages of some architectures. > > ChangeLog v3: > - disable split ptl for ppc with USE_SPLIT_PTLOCKS_HUGETLB. > - remove replacement in some architecture dependent code. This is justified > because an allocation of pgd/pud/pmd/pte entry can race with other > allocation, not with read/write access, so we can use different locks. > http://thread.gmane.org/gmane.linux.kernel.mm/106292/focus=106458 > > ChangeLog v2: > - add split ptl on other archs missed in v1 > - drop changes on arch/{powerpc,tile}/mm/hugetlbpage.c > > Signed-off-by: Naoya Horiguchi > --- > include/linux/hugetlb.h | 20 +++++++++++ > include/linux/mm_types.h | 2 ++ > mm/hugetlb.c | 92 +++++++++++++++++++++++++++++------------------- > mm/mempolicy.c | 5 +-- > mm/migrate.c | 4 +-- > mm/rmap.c | 2 +- > 6 files changed, 84 insertions(+), 41 deletions(-) > > diff --git v3.11-rc3.orig/include/linux/hugetlb.h v3.11-rc3/include/linux/hugetlb.h > index 0393270..5cb8a4e 100644 > --- v3.11-rc3.orig/include/linux/hugetlb.h > +++ v3.11-rc3/include/linux/hugetlb.h > @@ -80,6 +80,24 @@ extern const unsigned long hugetlb_zero, hugetlb_infinity; > extern int sysctl_hugetlb_shm_group; > extern struct list_head huge_boot_pages; > > +#if USE_SPLIT_PTLOCKS_HUGETLB > +#define huge_pte_lockptr(mm, ptep) ({__pte_lockptr(virt_to_page(ptep)); }) > +#else /* !USE_SPLIT_PTLOCKS_HUGETLB */ > +#define huge_pte_lockptr(mm, ptep) ({&(mm)->page_table_lock; }) > +#endif /* USE_SPLIT_PTLOCKS_HUGETLB */ > + > +#define huge_pte_offset_lock(mm, address, ptlp) \ > +({ \ > + pte_t *__pte = huge_pte_offset(mm, address); \ > + spinlock_t *__ptl = NULL; \ > + if (__pte) { \ > + __ptl = huge_pte_lockptr(mm, __pte); \ > + *(ptlp) = __ptl; \ > + spin_lock(__ptl); \ > + } \ > + __pte; \ > +}) why not a static inline function ? > + > /* arch callbacks */ > > pte_t *huge_pte_alloc(struct mm_struct *mm,> @@ -164,6 +182,8 @@ static inline void __unmap_hugepage_range(struct mmu_gather *tlb, > BUG(); > } > > +#define huge_pte_lockptr(mm, ptep) 0 > + > #endif /* !CONFIG_HUGETLB_PAGE */ > > #define HUGETLB_ANON_FILE "anon_hugepage" > diff --git v3.11-rc3.orig/include/linux/mm_types.h v3.11-rc3/include/linux/mm_types.h > index fb425aa..cfb8c6f 100644 > --- v3.11-rc3.orig/include/linux/mm_types.h > +++ v3.11-rc3/include/linux/mm_types.h > @@ -24,6 +24,8 @@ > struct address_space; > > #define USE_SPLIT_PTLOCKS (NR_CPUS >= CONFIG_SPLIT_PTLOCK_CPUS) > +#define USE_SPLIT_PTLOCKS_HUGETLB \ > + (USE_SPLIT_PTLOCKS && !defined(CONFIG_PPC)) > Is that a common pattern ? Don't we generally use HAVE_ARCH_SPLIT_PTLOCKS in arch config file ? Also are we sure this is only an issue with PPC ? -aneesh -- 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/