From patchwork Thu May 17 15:57:34 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Kani, Toshi" X-Patchwork-Id: 10407063 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 687C860247 for ; Thu, 17 May 2018 15:58:54 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 56F9727F7F for ; Thu, 17 May 2018 15:58:54 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 4AB61285BA; Thu, 17 May 2018 15:58:54 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAYES_00, MAILING_LIST_MULTI, RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.1 Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 3C78227F7F for ; Thu, 17 May 2018 15:58:52 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 01F336B0502; Thu, 17 May 2018 11:58:52 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id F12396B0503; Thu, 17 May 2018 11:58:51 -0400 (EDT) X-Original-To: int-list-linux-mm@kvack.org X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id E00166B0504; Thu, 17 May 2018 11:58:51 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from mail-oi0-f70.google.com (mail-oi0-f70.google.com [209.85.218.70]) by kanga.kvack.org (Postfix) with ESMTP id B55316B0502 for ; Thu, 17 May 2018 11:58:51 -0400 (EDT) Received: by mail-oi0-f70.google.com with SMTP id x195-v6so3167392oix.18 for ; Thu, 17 May 2018 08:58:51 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-original-authentication-results:x-gm-message-state:from:to:cc :subject:date:message-id; bh=eA9XC4GL9QyE/JjcjSeskYtUDMfA17SuRQnmyHfab6I=; b=dOkrvY0EQcA2zALrjzR9lXTKrsfoU8/dWcYdR8wMMoKTJUmGBMvaT3RNFzJD9skUNM TDsOvywlVrZ/++J7goIrvP+nMTWc0iJCoH0dhcbM7ILoR0Gxze84E588W0rj3z0Pp84e KNgxLlZ5A1WD9edhnIod8t1DoEz/3VkEoKqExQc531Ip92Vh1jklqXb0vSPVELFG5ihH 3W2MWVomPkgR6ojWVp6LRYX2DFAJY2MYew/fKnj3aM9x/QaUk9OnmGQGMDr/tTs31fHG msLNYf2+TC72WJM1IDtnIWoYdDqVlHJlfgt2kFNEa1rGjrU7feQAmlCD2pz5AlffP/xw EmZw== X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of toshi.kani@hpe.com designates 15.241.48.72 as permitted sender) smtp.mailfrom=toshi.kani@hpe.com X-Gm-Message-State: ALKqPwceqrWzq0mmtU9+1LGHWfaxrOU6FNDEkyG9FGFUOsBaoTOoblQc xLZrE3RRzJ0vr3YF8fSh8XWB/TZGqs73OcU+yFu8uLu4VDOKvFC5GYeMzznf1X4+m0/SQoWEkhj dJq2s9/wt3+NUcBrVB93b4xrA0nd08ZvkV4s6HPkJWRmcDnDucyFh3ekGBcLi2jzY7g== X-Received: by 2002:aca:3387:: with SMTP id z129-v6mr3718011oiz.49.1526572731421; Thu, 17 May 2018 08:58:51 -0700 (PDT) X-Google-Smtp-Source: AB8JxZptMK4OuRCfHewBOH8MNMTvWvmuqh9hFAZi43LFkGZOqUOymR2FcSUyAkH9TtCfyNwSFwCA X-Received: by 2002:aca:3387:: with SMTP id z129-v6mr3717973oiz.49.1526572730042; Thu, 17 May 2018 08:58:50 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1526572730; cv=none; d=google.com; s=arc-20160816; b=EWs95WjemaXVTXtlUYATJEYlvssIGts2Umx+77UeG3Zt4PHhdDhVLV+FwBGBsiAU8e nVLaqbf1DESnCwVZDTI8ktwHh0qyEcCnhS9Z8i75SK1F/5s91Pt2KMAXnGHmmkoKgcTe 7FySF1WCId0ZnrUfUap7gyJVxWkdmHbXwd54Q9IMtsG4nYh4sHJpeuIRYtBefd3DQuZS IhYrEk02tZP1OYDaaJdDpsjrWTP0mMxKUkoEuvduMyoQHBISxI2B6N3DJtU4Mflf8v++ eJaA9XQC8ADAvVltSwbK310xb5PD3LtL32lDlRXm9xz5lTIiAKnxvW8MG+3M7St3MBNk xuNQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=message-id:date:subject:cc:to:from:arc-authentication-results; bh=eA9XC4GL9QyE/JjcjSeskYtUDMfA17SuRQnmyHfab6I=; b=UE8DgSUIeO8fTnAAwUuNnXen3PV6ibm5Ibmc+cB1EDrUNogPG9hIGvL9XEkImoQE6z PYEbZTjG6Et7o0Xujo7FhyAcJRnrP3RYb7OVRgutdwuYDg9h+rzNkhvJtgF27JKov+ac Rlcs/a5pOiS9SnchCc38XdAEvZadOGb4fNb3e/tOeLSfcIVn/UhLrF3CkodG6k3iD7gn WM0F71USN2tBgridmQCk3JVC7qYKEBHO8o0+xAr6ISPLJp0I7rKeY30E0ppbwhfJulo5 59+OTY6kEdt7jK2S+5xr4KSXqYdSJ2sezznPIPrUb0WacT+gmSC3LUF43c2ir2z0EVIT W+UQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of toshi.kani@hpe.com designates 15.241.48.72 as permitted sender) smtp.mailfrom=toshi.kani@hpe.com Received: from g9t5008.houston.hpe.com (g9t5008.houston.hpe.com. [15.241.48.72]) by mx.google.com with ESMTPS id s8-v6si1893018ota.184.2018.05.17.08.58.49 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 17 May 2018 08:58:50 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of toshi.kani@hpe.com designates 15.241.48.72 as permitted sender) client-ip=15.241.48.72; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of toshi.kani@hpe.com designates 15.241.48.72 as permitted sender) smtp.mailfrom=toshi.kani@hpe.com Received: from g4t3433.houston.hpecorp.net (g4t3433.houston.hpecorp.net [16.208.49.245]) by g9t5008.houston.hpe.com (Postfix) with ESMTP id 6187075; Thu, 17 May 2018 15:58:49 +0000 (UTC) Received: from misato.americas.hpqcorp.net (unknown [10.34.81.122]) by g4t3433.houston.hpecorp.net (Postfix) with ESMTP id 5A6073BB; Thu, 17 May 2018 15:58:48 +0000 (UTC) From: Toshi Kani To: mhocko@suse.com, akpm@linux-foundation.org, tglx@linutronix.de, mingo@redhat.com, hpa@zytor.com, will.deacon@arm.com Cc: cpandya@codeaurora.org, linux-mm@kvack.org, x86@kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Toshi Kani , Joerg Roedel , stable@vger.kernel.org Subject: [PATCH v3-UPADATE 2/3] ioremap: Update pgtable free interfaces with addr Date: Thu, 17 May 2018 09:57:34 -0600 Message-Id: <20180517155734.1700-1-toshi.kani@hpe.com> X-Mailer: git-send-email 2.14.3 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: X-Virus-Scanned: ClamAV using ClamSMTP 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: --- v3-UPDATE - Rewrite patch description --- arch/arm64/mm/mmu.c | 4 ++-- arch/x86/mm/pgtable.c | 12 +++++++----- include/asm-generic/pgtable.h | 8 ++++---- lib/ioremap.c | 4 ++-- 4 files changed, 15 insertions(+), 13 deletions(-) diff --git a/arch/arm64/mm/mmu.c b/arch/arm64/mm/mmu.c index 2dbb2c9f1ec1..da98828609a1 100644 --- a/arch/arm64/mm/mmu.c +++ b/arch/arm64/mm/mmu.c @@ -973,12 +973,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 3f7180bc5f52..f60fdf411103 100644 --- a/arch/x86/mm/pgtable.c +++ b/arch/x86/mm/pgtable.c @@ -719,11 +719,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; @@ -734,7 +735,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); @@ -746,11 +747,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; @@ -766,7 +768,7 @@ int pmd_free_pte_page(pmd_t *pmd) #else /* !CONFIG_X86_64 */ -int pud_free_pmd_page(pud_t *pud) +int pud_free_pmd_page(pud_t *pud, unsigned long addr) { return pud_none(*pud); } @@ -775,7 +777,7 @@ int pud_free_pmd_page(pud_t *pud) * Disable free page handling on x86-PAE. This assures that ioremap() * does not update sync'd pmd entries. See vmalloc_sync_one(). */ -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/include/asm-generic/pgtable.h b/include/asm-generic/pgtable.h index f59639afaa39..b081794ba135 100644 --- a/include/asm-generic/pgtable.h +++ b/include/asm-generic/pgtable.h @@ -1019,8 +1019,8 @@ int pud_set_huge(pud_t *pud, phys_addr_t addr, pgprot_t prot); 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 54e5bbaa3200..517f5853ffed 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; }