From patchwork Wed Mar 6 06:10:21 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Aneesh Kumar K.V" X-Patchwork-Id: 225361 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from ozlabs.org (localhost [IPv6:::1]) by ozlabs.org (Postfix) with ESMTP id B083D2C1CDA for ; Wed, 6 Mar 2013 17:22:42 +1100 (EST) Received: from e23smtp09.au.ibm.com (e23smtp09.au.ibm.com [202.81.31.142]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client CN "e23smtp09.au.ibm.com", Issuer "GeoTrust SSL CA" (not verified)) by ozlabs.org (Postfix) with ESMTPS id 7D6A82C055F for ; Wed, 6 Mar 2013 17:11:17 +1100 (EST) Received: from /spool/local by e23smtp09.au.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Wed, 6 Mar 2013 16:03:38 +1000 Received: from d23dlp01.au.ibm.com (202.81.31.203) by e23smtp09.au.ibm.com (202.81.31.206) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Wed, 6 Mar 2013 16:03:36 +1000 Received: from d23relay05.au.ibm.com (d23relay05.au.ibm.com [9.190.235.152]) by d23dlp01.au.ibm.com (Postfix) with ESMTP id 51A122CE8051 for ; Wed, 6 Mar 2013 17:11:13 +1100 (EST) Received: from d23av04.au.ibm.com (d23av04.au.ibm.com [9.190.235.139]) by d23relay05.au.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r265wSrk61210760 for ; Wed, 6 Mar 2013 16:58:28 +1100 Received: from d23av04.au.ibm.com (loopback [127.0.0.1]) by d23av04.au.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id r266BCni015346 for ; Wed, 6 Mar 2013 17:11:12 +1100 Received: from skywalker.in.ibm.com ([9.77.127.166]) by d23av04.au.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id r266AWkd014073; Wed, 6 Mar 2013 17:11:10 +1100 From: "Aneesh Kumar K.V" To: benh@kernel.crashing.org, paulus@samba.org Subject: [PATCH -V2 20/26] powerpc/THP: Differentiate THP PMD entries from HUGETLB PMD entries Date: Wed, 6 Mar 2013 11:40:21 +0530 Message-Id: <1362550227-575-21-git-send-email-aneesh.kumar@linux.vnet.ibm.com> X-Mailer: git-send-email 1.7.10 In-Reply-To: <1362550227-575-1-git-send-email-aneesh.kumar@linux.vnet.ibm.com> References: <1362550227-575-1-git-send-email-aneesh.kumar@linux.vnet.ibm.com> X-Content-Scanned: Fidelis XPS MAILER x-cbid: 13030606-3568-0000-0000-0000033FBF82 Cc: linuxppc-dev@lists.ozlabs.org, "Aneesh Kumar K.V" X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org Sender: "Linuxppc-dev" From: "Aneesh Kumar K.V" HUGETLB clear the top bit of PMD entries and use that to indicate a HUGETLB page directory. Since we store pfns in PMDs for THP, we would have the top bit cleared by default. Add the top bit mask for THP PMD entries and clear that when we are looking for pmd_pfn. Signed-off-by: Aneesh Kumar K.V --- arch/powerpc/include/asm/pgtable.h | 15 ++++++++++++--- arch/powerpc/mm/pgtable.c | 5 ++++- arch/powerpc/mm/pgtable_64.c | 2 +- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/arch/powerpc/include/asm/pgtable.h b/arch/powerpc/include/asm/pgtable.h index e637842..09f3a77 100644 --- a/arch/powerpc/include/asm/pgtable.h +++ b/arch/powerpc/include/asm/pgtable.h @@ -31,7 +31,7 @@ struct mm_struct; #define PMD_HUGE_EXEC 0x004 /* No execute on POWER4 and newer (we invert) */ #define PMD_HUGE_SPLITTING 0x008 #define PMD_HUGE_HASHPTE 0x010 -#define PMD_ISHUGE 0x020 +#define _PMD_ISHUGE 0x020 #define PMD_HUGE_DIRTY 0x080 /* C: page changed */ #define PMD_HUGE_ACCESSED 0x100 /* R: page referenced */ #define PMD_HUGE_RW 0x200 /* software: user write access allowed */ @@ -44,6 +44,14 @@ struct mm_struct; #define PMD_HUGE_RPN_SHIFT PTE_RPN_SHIFT #define HUGE_PAGE_SIZE (ASM_CONST(1) << 24) #define HUGE_PAGE_MASK (~(HUGE_PAGE_SIZE - 1)) +/* + * HugeTLB looks at the top bit of the Linux page table entries to + * decide whether it is a huge page directory or not. Mark HUGE + * PMD to differentiate + */ +#define PMD_HUGE_NOT_HUGETLB (ASM_CONST(1) << 63) +#define PMD_ISHUGE (_PMD_ISHUGE | PMD_HUGE_NOT_HUGETLB) +#define PMD_HUGE_PROTBITS (0xfff | PMD_HUGE_NOT_HUGETLB) #ifndef __ASSEMBLY__ extern void hpte_need_hugepage_flush(struct mm_struct *mm, unsigned long addr, @@ -61,7 +69,8 @@ static inline unsigned long pmd_pfn(pmd_t pmd) /* * Only called for huge page pmd */ - return pmd_val(pmd) >> PMD_HUGE_RPN_SHIFT; + unsigned long val = pmd_val(pmd) & ~PMD_HUGE_PROTBITS; + return val >> PMD_HUGE_RPN_SHIFT; } static inline int pmd_young(pmd_t pmd) @@ -95,7 +104,7 @@ static inline int pmd_trans_splitting(pmd_t pmd) static inline int pmd_trans_huge(pmd_t pmd) { - return pmd_val(pmd) & PMD_ISHUGE; + return ((pmd_val(pmd) & PMD_ISHUGE) == PMD_ISHUGE); } /* We will enable it in the last patch */ diff --git a/arch/powerpc/mm/pgtable.c b/arch/powerpc/mm/pgtable.c index 77ce864..84e7b71 100644 --- a/arch/powerpc/mm/pgtable.c +++ b/arch/powerpc/mm/pgtable.c @@ -524,7 +524,10 @@ static pmd_t pmd_set_protbits(pmd_t pmd, pgprot_t pgprot) pmd_t pfn_pmd(unsigned long pfn, pgprot_t pgprot) { pmd_t pmd; - + /* + * We cannot support that many PFNs + */ + VM_BUG_ON(pfn & PMD_HUGE_NOT_HUGETLB); pmd_val(pmd) = pfn << PMD_HUGE_RPN_SHIFT; pmd_val(pmd) |= PMD_ISHUGE; pmd = pmd_set_protbits(pmd, pgprot); diff --git a/arch/powerpc/mm/pgtable_64.c b/arch/powerpc/mm/pgtable_64.c index 313fe01..a506059 100644 --- a/arch/powerpc/mm/pgtable_64.c +++ b/arch/powerpc/mm/pgtable_64.c @@ -345,7 +345,7 @@ EXPORT_SYMBOL(__iounmap_at); struct page *pmd_page(pmd_t pmd) { #ifdef CONFIG_TRANSPARENT_HUGEPAGE - if (pmd_val(pmd) & PMD_ISHUGE) + if ((pmd_val(pmd) & PMD_ISHUGE) == PMD_ISHUGE) return pfn_to_page(pmd_pfn(pmd)); #endif return virt_to_page(pmd_page_vaddr(pmd));