From patchwork Wed Jun 27 14:13:47 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Kani, Toshi" X-Patchwork-Id: 10491761 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 33EBF60230 for ; Wed, 27 Jun 2018 14:15:56 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 2325429371 for ; Wed, 27 Jun 2018 14:15:56 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 1725D2937C; Wed, 27 Jun 2018 14:15:56 +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 5AEB529371 for ; Wed, 27 Jun 2018 14:15:55 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id A1AC36B0266; Wed, 27 Jun 2018 10:15:52 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id 9CC3E6B0269; Wed, 27 Jun 2018 10:15:52 -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 7F8BA6B026A; Wed, 27 Jun 2018 10:15:52 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from mail-ot0-f197.google.com (mail-ot0-f197.google.com [74.125.82.197]) by kanga.kvack.org (Postfix) with ESMTP id 543836B0266 for ; Wed, 27 Jun 2018 10:15:52 -0400 (EDT) Received: by mail-ot0-f197.google.com with SMTP id q10-v6so1596201otl.13 for ; Wed, 27 Jun 2018 07:15:52 -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:in-reply-to:references; bh=xkq7vH78hYF9UJdVj6kNa+eWTY0e2mDszSbrn0E8kVY=; b=UNLeGR5ABiskVUhaxpMEcj/73JZveh/V9VxgeEBFcvIucjSS5uRRgcFTOT5f+aWCtU Ld6TBjD3ZvvUIH3rHlhMW0jnpKy9qeTh8WgwWGR7a8FmsCpx8+PfuUVKJktPzZdUTwOs S0nmc/wmtyjInuu1GaZqwmkmtEU4DQfXjO3QI/tHIiIeLUu1ogzsFsWQE0cOX/ssYRU2 DaSuHTBW2qSekdBsAz1cuLBwx0TxdiKOOGOquWWzI4b1yB7Cmv4sDmw+9tmXFWdxC1Xx nL5R6R7x2QvfOasGuLjWtCs5ihkad0be4mpxzwku/T8CF3RPrIvQnkgkjp4C9QAODJIY IwvQ== X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of toshi.kani@hpe.com designates 15.241.140.78 as permitted sender) smtp.mailfrom=toshi.kani@hpe.com X-Gm-Message-State: APt69E11ugITsiLasZwIIdkaI2c8m8S5CtouR+bA1YWaBQUKt8tsAw8L i0BemwhKFVa+X1z0NBOE60exW42VFoqsnPTnctKMsejfbwvsPk/33txMz2q8cUIbXGjzV07AbP7 1TCa1frp9+QTBMmllCvqwsx/TOjaTRHVEBFa+MXWFHVqnXEgZ73/cdsYmqcoVU11p/A== X-Received: by 2002:a9d:55d0:: with SMTP id z16-v6mr3754939oti.176.1530108952058; Wed, 27 Jun 2018 07:15:52 -0700 (PDT) X-Google-Smtp-Source: AAOMgpe/FgkK/+0ZHOFLkmSKWlIY8CYWLQCVPr2vlTKWphETcTrMJPVHTfHM6vLFsjHeSm8MrDv+ X-Received: by 2002:a9d:55d0:: with SMTP id z16-v6mr3754905oti.176.1530108951246; Wed, 27 Jun 2018 07:15:51 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1530108951; cv=none; d=google.com; s=arc-20160816; b=l6EsvQ5V5UE6q8gOi7+g91r40m5+jd2rxqEM4fDhllsRddQTGa0keAccnU3AGEv2Mc i9T6YCEMlSiWL7Lig+euviRpCJjqOzaFyqmBXpYaFHKfHuios8tHl/PCCNSvkSbKalfV FQoiKzVhtxTgfBnYMEbcYlfzKdK2y6mtR59ZlBG70pdwxYgeSbOZQHGyWOtRX3cZ7d4p g/Da/YzB9tX2l3z0pmI1CUaBxYfy2FITwEiBXZHKgcO1Rbyiby8uWw504OdPrcqx8Ivz TZh+HfIYFA0Q72JPZsg5uUd32ESXSDeHOkOG9FZxtOYttdq8OjACpkRGJW6tx/ZIDsqF pIJA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:cc:to:from :arc-authentication-results; bh=xkq7vH78hYF9UJdVj6kNa+eWTY0e2mDszSbrn0E8kVY=; b=YVTxfCrNJE/8lRLcar5ANQysAmcHG6nOBJ4omvdX6ikZ9VuHumC6K6mK3ij4hpvP3g 2Ak6uP8Wd5F7UHRJVbXSRMikZ3MsfDzsrzolnDG3h9DmeZfGQKR8aX1fKNXVD4LJulAJ uDILRgMMVN2jtM31OXugSvVetcheA6J27YCLtfKdxxFMDY7Fo83pDk0qg83Cw41yMOCF 9lEkhrOTA6RFzi50paxrlXKUWC4jLJGGw6kHSeWR9rMEkMKVKnDnZdgf3Yl1kj+kIWwO CLbugBQ2C5kzp9qWzcuDZzMOODkEFQYg/zmUtxP9KQQa9IClFYDrPN6Tpmz1DZRpWYmU DEww== 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.140.78 as permitted sender) smtp.mailfrom=toshi.kani@hpe.com Received: from g4t3425.houston.hpe.com (g4t3425.houston.hpe.com. [15.241.140.78]) by mx.google.com with ESMTPS id w189-v6si1336232oif.376.2018.06.27.07.15.51 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 27 Jun 2018 07:15:51 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of toshi.kani@hpe.com designates 15.241.140.78 as permitted sender) client-ip=15.241.140.78; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of toshi.kani@hpe.com designates 15.241.140.78 as permitted sender) smtp.mailfrom=toshi.kani@hpe.com Received: from g4t3433.houston.hpecorp.net (g4t3433.houston.hpecorp.net [16.208.49.245]) by g4t3425.houston.hpe.com (Postfix) with ESMTP id CC4AAAC; Wed, 27 Jun 2018 14:15:50 +0000 (UTC) Received: from misato.americas.hpqcorp.net (unknown [10.34.81.122]) by g4t3433.houston.hpecorp.net (Postfix) with ESMTP id EDFAE46; Wed, 27 Jun 2018 14:15:49 +0000 (UTC) From: Toshi Kani To: mhocko@suse.com, akpm@linux-foundation.org, tglx@linutronix.de, mingo@redhat.com, hpa@zytor.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 , Will Deacon , Joerg Roedel , stable@vger.kernel.org Subject: [PATCH v4 2/3] ioremap: Update pgtable free interfaces with addr Date: Wed, 27 Jun 2018 08:13:47 -0600 Message-Id: <20180627141348.21777-3-toshi.kani@hpe.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180627141348.21777-1-toshi.kani@hpe.com> References: <20180627141348.21777-1-toshi.kani@hpe.com> 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.kani@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 | 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 493ff75670ff..8ae5d7ae4af3 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 1aeb7a5dbce5..fbd14e506758 100644 --- a/arch/x86/mm/pgtable.c +++ b/arch/x86/mm/pgtable.c @@ -723,11 +723,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; @@ -738,7 +739,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); @@ -750,11 +751,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; @@ -770,7 +772,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); } @@ -779,7 +781,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; }