Received: by 2002:ac0:a5b6:0:0:0:0:0 with SMTP id m51-v6csp545112imm; Fri, 1 Jun 2018 05:41:26 -0700 (PDT) X-Google-Smtp-Source: ADUXVKK2zRSQSUek7EaHmfYjO2r76zvmQdTyWTIByeV2zLWxS13AScedhoChd2tBL5/JksxdiNRT X-Received: by 2002:a62:3a59:: with SMTP id h86-v6mr10778442pfa.209.1527856885992; Fri, 01 Jun 2018 05:41:25 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1527856885; cv=none; d=google.com; s=arc-20160816; b=HaBSqe3TO2QI4R1tGq+Jzwc3+FSvm0pfUnByc86L/F09xKG48ypk0lE5tKolJCR2x5 9IRFwzQRKnbb0gdWlOgO3O3vwn2tuNrp2jaabLYvYWR3vo5jCZM+aOs2PCk72jRgKzec BaCQfcMD7MbBDcfQvM1dJwU15OiGC4Q6tZ05+csFvuWgDd0kWUxSPbIwcPXwJbcruAcM BBugvIYzXsKwqVfM39fNj2t0YKNq8Mrig8/gazRW6TDHlHswgDuKpvj65ssrDVWu3G91 /46UFbd4PfRJoOep9etdJZhdi3hhHT9qsoNqT+jJUii5XtCYufmZLEjSm8OVZulxYhAl 9aBQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dmarc-filter:dkim-signature:dkim-signature :arc-authentication-results; bh=efJ4AxchfCy9QlrkFvRTmKHnSJHE1OzdsxzsKQZ5Wy8=; b=un/jDjPf/0BGyh/KSJLYx1CLp4Eb5WgQOZISBRIIksmS2yb+BEtczNPx1Gbfg+syg9 ZkIZETEZ6yN22Fwso9OgzVqGOOD8tXlacBM/enxa5aZ7+TOk/u4so/0j3tr3hcdKuRns uGcmcmfSQxKV4wRDSsAWYWHvTD4LGMb1rJfh+keMLq/JCuBG9WmLzurGrIeUIqzdLdmF 00rusBdz7P8n6xsgiy8CLkj5Wm56Vu/DmVlpF1igm4Avqsfo6pr5S0FwG27t+DlRlEzE LIMnu44lxRpx6N8maTGO/gYAQEPtQ6XFS0y0CPY38rMqvfPLfevsk+Xe4JGRTX1MZEL0 dO7A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@codeaurora.org header.s=default header.b=btLbi6SJ; dkim=pass header.i=@codeaurora.org header.s=default header.b=ZcpRBFln; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id l3-v6si39133292pld.96.2018.06.01.05.41.11; Fri, 01 Jun 2018 05:41:25 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@codeaurora.org header.s=default header.b=btLbi6SJ; dkim=pass header.i=@codeaurora.org header.s=default header.b=ZcpRBFln; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752018AbeFAMj4 (ORCPT + 99 others); Fri, 1 Jun 2018 08:39:56 -0400 Received: from smtp.codeaurora.org ([198.145.29.96]:50178 "EHLO smtp.codeaurora.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751998AbeFAMjv (ORCPT ); Fri, 1 Jun 2018 08:39:51 -0400 Received: by smtp.codeaurora.org (Postfix, from userid 1000) id 2B48F60263; Fri, 1 Jun 2018 12:39:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1527856791; bh=i4i1rmejrHl7Vn6RirwVAaFpScz1MR6f0LNsxMPPcSw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=btLbi6SJ3eybYualpQK7hPEBJt1wP6NpHHJRdWxk0k8h7TgS20M/AzX2Arg0BbHmp qmHwPx9Td1UeEECb/oBOKk/E1ly6CVwaCH68G6qNkmPZMHrcMMVZ7tHcG6DaOt4qQ/ hiPHrwuK3eBFfYoJLAvzrCPC3h4J/IQNL0Eo5cVU= X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on pdx-caf-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.8 required=2.0 tests=ALL_TRUSTED,BAYES_00, DKIM_SIGNED,T_DKIM_INVALID autolearn=no autolearn_force=no version=3.4.0 Received: from cpandya-linux.qualcomm.com (blr-c-bdr-fw-01_globalnat_allzones-outside.qualcomm.com [103.229.19.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: cpandya@smtp.codeaurora.org) by smtp.codeaurora.org (Postfix) with ESMTPSA id 518D860263; Fri, 1 Jun 2018 12:39:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1527856778; bh=i4i1rmejrHl7Vn6RirwVAaFpScz1MR6f0LNsxMPPcSw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ZcpRBFlnxYkiBdQtTMEdfMkKYyrzBPabr8fxb3Oq9W6UW1p67IxT/X+1FbsheoMnn NV3XOa2uEV/+fG/fBSc+WCDbTYr83FeGW2lCAp83Z4Pq2WqaEco1HDChRWnCIHKYas jJSeE4dXyhkgJkg5+1q/nGHxv5AeXu8tbqvt1cTQ= DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org 518D860263 Authentication-Results: pdx-caf-mail.web.codeaurora.org; dmarc=none (p=none dis=none) header.from=codeaurora.org Authentication-Results: pdx-caf-mail.web.codeaurora.org; spf=none smtp.mailfrom=cpandya@codeaurora.org From: Chintan Pandya To: will.deacon@arm.com, catalin.marinas@arm.com, mark.rutland@arm.com, akpm@linux-foundation.org Cc: toshi.kani@hpe.com, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Chintan Pandya , Michal Hocko , Thomas Gleixner , Ingo Molnar , "H. Peter Anvin" , Joerg Roedel , Subject: [PATCH v12 1/5] ioremap: Update pgtable free interfaces with addr Date: Fri, 1 Jun 2018 18:09:14 +0530 Message-Id: <1527856758-27169-2-git-send-email-cpandya@codeaurora.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1527856758-27169-1-git-send-email-cpandya@codeaurora.org> References: <1527856758-27169-1-git-send-email-cpandya@codeaurora.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Chintan Pandya The following kernel panic was observed on ARM64 platform due to a stale TLB entry. 1. ioremap with 4K size, a valid pte page table is set. 2. iounmap it, its pte entry is set to 0. 3. ioremap the same address with 2M size, update its pmd entry with a new value. 4. CPU may hit an exception because the old pmd entry is still in TLB, which leads to a kernel panic. Commit b6bdb7517c3d ("mm/vmalloc: add interfaces to free unmapped page table") has addressed this panic by falling to pte mappings in the above case on ARM64. To support pmd mappings in all cases, TLB purge needs to be performed in this case on ARM64. Add a new arg, 'addr', to pud_free_pmd_page() and pmd_free_pte_page() so that TLB purge can be added later in seprate patches. [toshi@hpe.com: merge changes, rewrite patch description] Fixes: 28ee90fe6048 ("x86/mm: implement free pmd/pte page interfaces") Signed-off-by: Chintan Pandya Signed-off-by: Toshi Kani Cc: Andrew Morton Cc: Michal Hocko Cc: Thomas Gleixner Cc: Ingo Molnar Cc: "H. Peter Anvin" Cc: Will Deacon Cc: Joerg Roedel Cc: --- arch/arm64/mm/mmu.c | 4 ++-- arch/x86/mm/pgtable.c | 8 +++++--- include/asm-generic/pgtable.h | 8 ++++---- lib/ioremap.c | 4 ++-- 4 files changed, 13 insertions(+), 11 deletions(-) diff --git a/arch/arm64/mm/mmu.c b/arch/arm64/mm/mmu.c index 493ff75..8ae5d7a 100644 --- a/arch/arm64/mm/mmu.c +++ b/arch/arm64/mm/mmu.c @@ -977,12 +977,12 @@ int pmd_clear_huge(pmd_t *pmdp) return 1; } -int pud_free_pmd_page(pud_t *pud) +int pud_free_pmd_page(pud_t *pud, unsigned long addr) { return pud_none(*pud); } -int pmd_free_pte_page(pmd_t *pmd) +int pmd_free_pte_page(pmd_t *pmd, unsigned long addr) { return pmd_none(*pmd); } diff --git a/arch/x86/mm/pgtable.c b/arch/x86/mm/pgtable.c index ffc8c13..37e3cba 100644 --- a/arch/x86/mm/pgtable.c +++ b/arch/x86/mm/pgtable.c @@ -718,11 +718,12 @@ int pmd_clear_huge(pmd_t *pmd) /** * pud_free_pmd_page - Clear pud entry and free pmd page. * @pud: Pointer to a PUD. + * @addr: Virtual address associated with pud. * * Context: The pud range has been unmaped and TLB purged. * Return: 1 if clearing the entry succeeded. 0 otherwise. */ -int pud_free_pmd_page(pud_t *pud) +int pud_free_pmd_page(pud_t *pud, unsigned long addr) { pmd_t *pmd; int i; @@ -733,7 +734,7 @@ int pud_free_pmd_page(pud_t *pud) pmd = (pmd_t *)pud_page_vaddr(*pud); for (i = 0; i < PTRS_PER_PMD; i++) - if (!pmd_free_pte_page(&pmd[i])) + if (!pmd_free_pte_page(&pmd[i], addr + (i * PMD_SIZE))) return 0; pud_clear(pud); @@ -745,11 +746,12 @@ int pud_free_pmd_page(pud_t *pud) /** * pmd_free_pte_page - Clear pmd entry and free pte page. * @pmd: Pointer to a PMD. + * @addr: Virtual address associated with pmd. * * Context: The pmd range has been unmaped and TLB purged. * Return: 1 if clearing the entry succeeded. 0 otherwise. */ -int pmd_free_pte_page(pmd_t *pmd) +int pmd_free_pte_page(pmd_t *pmd, unsigned long addr) { pte_t *pte; diff --git a/include/asm-generic/pgtable.h b/include/asm-generic/pgtable.h index f59639a..b081794 100644 --- a/include/asm-generic/pgtable.h +++ b/include/asm-generic/pgtable.h @@ -1019,8 +1019,8 @@ static inline int p4d_clear_huge(p4d_t *p4d) int pmd_set_huge(pmd_t *pmd, phys_addr_t addr, pgprot_t prot); int pud_clear_huge(pud_t *pud); int pmd_clear_huge(pmd_t *pmd); -int pud_free_pmd_page(pud_t *pud); -int pmd_free_pte_page(pmd_t *pmd); +int pud_free_pmd_page(pud_t *pud, unsigned long addr); +int pmd_free_pte_page(pmd_t *pmd, unsigned long addr); #else /* !CONFIG_HAVE_ARCH_HUGE_VMAP */ static inline int p4d_set_huge(p4d_t *p4d, phys_addr_t addr, pgprot_t prot) { @@ -1046,11 +1046,11 @@ static inline int pmd_clear_huge(pmd_t *pmd) { return 0; } -static inline int pud_free_pmd_page(pud_t *pud) +static inline int pud_free_pmd_page(pud_t *pud, unsigned long addr) { return 0; } -static inline int pmd_free_pte_page(pmd_t *pmd) +static inline int pmd_free_pte_page(pmd_t *pmd, unsigned long addr) { return 0; } diff --git a/lib/ioremap.c b/lib/ioremap.c index 54e5bba..517f585 100644 --- a/lib/ioremap.c +++ b/lib/ioremap.c @@ -92,7 +92,7 @@ static inline int ioremap_pmd_range(pud_t *pud, unsigned long addr, if (ioremap_pmd_enabled() && ((next - addr) == PMD_SIZE) && IS_ALIGNED(phys_addr + addr, PMD_SIZE) && - pmd_free_pte_page(pmd)) { + pmd_free_pte_page(pmd, addr)) { if (pmd_set_huge(pmd, phys_addr + addr, prot)) continue; } @@ -119,7 +119,7 @@ static inline int ioremap_pud_range(p4d_t *p4d, unsigned long addr, if (ioremap_pud_enabled() && ((next - addr) == PUD_SIZE) && IS_ALIGNED(phys_addr + addr, PUD_SIZE) && - pud_free_pmd_page(pud)) { + pud_free_pmd_page(pud, addr)) { if (pud_set_huge(pud, phys_addr + addr, prot)) continue; } -- Qualcomm India Private Limited, on behalf of Qualcomm Innovation Center, Inc., is a member of Code Aurora Forum, a Linux Foundation Collaborative Project