From patchwork Wed Dec 10 18:00:37 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christophe Leroy X-Patchwork-Id: 419808 X-Patchwork-Delegate: scottwood@freescale.com Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [103.22.144.68]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 6ABD41400E9 for ; Thu, 11 Dec 2014 05:03:39 +1100 (AEDT) Received: from ozlabs.org (ozlabs.org [103.22.144.67]) by lists.ozlabs.org (Postfix) with ESMTP id 591421A0F69 for ; Thu, 11 Dec 2014 05:03:39 +1100 (AEDT) X-Original-To: linuxppc-dev@lists.ozlabs.org Delivered-To: linuxppc-dev@lists.ozlabs.org Received: from mailhub1.si.c-s.fr (pegase1.c-s.fr [93.17.236.30]) by lists.ozlabs.org (Postfix) with ESMTP id 2A9341A09CC for ; Thu, 11 Dec 2014 05:01:16 +1100 (AEDT) Received: from localhost (mailhub1-int [192.168.12.234]) by localhost (Postfix) with ESMTP id E9AE21C80E6; Wed, 10 Dec 2014 19:01:13 +0100 (CET) X-Virus-Scanned: amavisd-new at c-s.fr Received: from mailhub1.si.c-s.fr ([192.168.12.234]) by localhost (mailhub1.c-s.fr [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id yWJH4dB_sK55; Wed, 10 Dec 2014 19:00:38 +0100 (CET) Received: from messagerie.si.c-s.fr (messagerie [192.168.25.192]) by pegase1.c-s.fr (Postfix) with ESMTP id 505B11C80ED; Wed, 10 Dec 2014 19:00:38 +0100 (CET) Received: from localhost (localhost [127.0.0.1]) by messagerie.si.c-s.fr (Postfix) with ESMTP id 3E995C73C5; Wed, 10 Dec 2014 19:00:38 +0100 (CET) X-Virus-Scanned: amavisd-new at c-s.fr Received: from messagerie.si.c-s.fr ([127.0.0.1]) by localhost (messagerie.si.c-s.fr [127.0.0.1]) (amavisd-new, port 10023) with ESMTP id hhGNzRlsOW41; Wed, 10 Dec 2014 19:00:38 +0100 (CET) Received: from PO10863.localdomain (unknown [172.25.231.75]) by messagerie.si.c-s.fr (Postfix) with ESMTP id 017C6C73C4; Wed, 10 Dec 2014 19:00:37 +0100 (CET) Received: by localhost.localdomain (Postfix, from userid 0) id C46001A5D62; Wed, 10 Dec 2014 19:00:37 +0100 (CET) From: Christophe Leroy To: Benjamin Herrenschmidt , Paul Mackerras , Michael Ellerman , scottwood@freescale.com Subject: [PATCH 2/4] powerpc32: properly clear page table when 0 is not a good default PTE value Message-Id: <20141210180037.C46001A5D62@localhost.localdomain> Date: Wed, 10 Dec 2014 19:00:37 +0100 (CET) Cc: linuxppc-dev@lists.ozlabs.org, linux-kernel@vger.kernel.org X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.18 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" Some HW invert some PTE bits. In some case, __pte(0) is not 0 so the PTEs shall be properly set prior to being used. Signed-off-by: Christophe Leroy --- arch/powerpc/mm/pgtable_32.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/arch/powerpc/mm/pgtable_32.c b/arch/powerpc/mm/pgtable_32.c index a349089..71a2821 100644 --- a/arch/powerpc/mm/pgtable_32.c +++ b/arch/powerpc/mm/pgtable_32.c @@ -96,6 +96,14 @@ void pgd_free(struct mm_struct *mm, pgd_t *pgd) #endif } +static inline void pte_alloc_clear(pte_t *pte) +{ + int i; + + for (i = 0; i < PTRS_PER_PTE; i++) + pte[i] = __pte(0); +} + __init_refok pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long address) { pte_t *pte; @@ -109,18 +117,24 @@ __init_refok pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long add if (pte) clear_page(pte); } + if (pte && !pte_none(*pte)) + pte_alloc_clear(pte); return pte; } pgtable_t pte_alloc_one(struct mm_struct *mm, unsigned long address) { struct page *ptepage; + pte_t *pte; gfp_t flags = GFP_KERNEL | __GFP_REPEAT | __GFP_ZERO; ptepage = alloc_pages(flags, 0); if (!ptepage) return NULL; + pte = (pte_t *)pfn_to_kaddr(page_to_pfn(ptepage)); + if (!pte_none(*pte)) + pte_alloc_clear(pte); if (!pgtable_page_ctor(ptepage)) { __free_page(ptepage); return NULL;