From patchwork Thu Aug 16 18:42:07 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Greg Kroah-Hartman X-Patchwork-Id: 10567995 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id C290514E1 for ; Thu, 16 Aug 2018 18:44:26 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id C30A2285A5 for ; Thu, 16 Aug 2018 18:44:26 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id B48B328B2B; Thu, 16 Aug 2018 18:44:26 +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 02470285A5 for ; Thu, 16 Aug 2018 18:44:25 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id E4A626B0318; Thu, 16 Aug 2018 14:44:24 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id DFAC46B0319; Thu, 16 Aug 2018 14:44:24 -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 C9D956B031A; Thu, 16 Aug 2018 14:44:24 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from mail-pg1-f199.google.com (mail-pg1-f199.google.com [209.85.215.199]) by kanga.kvack.org (Postfix) with ESMTP id 83CD46B0318 for ; Thu, 16 Aug 2018 14:44:24 -0400 (EDT) Received: by mail-pg1-f199.google.com with SMTP id q12-v6so2419219pgp.6 for ; Thu, 16 Aug 2018 11:44:24 -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:user-agent :mime-version; bh=LTSk6VANoPJyYwaY8nLzKXtAnE4KKK2ZWPttAwf5VLc=; b=gUCN9uYtLKXELjk5RJonxss3Tpvo2ZnqkLZfrt+6QzCoOfayk5XYRchllw6d72HMSt VocmylLpIdBsHB/Kf3iR+caRJ7h/hIchcFr8jJAv941Em7a0t/dKbpQQSviTKxRIX8w9 ztg0X8nfxB0VyLaAGXdjcJ6EYrrerPWQezD/UBcS3kJ9bKKBgV7fMRDq6qSMhULLn57Z NzHM0eOvuBYt91ImNqpd946CdeC5qt8gk9ooXGf0IiRZqDYsDs/j1Pk32grcaoJ2HHQ1 a7bfu5OUOS9FrmPaPqM0jdFM4vkf9JYYytSqniGJBonkCtUsWAeGvQNNNxdVgB1XyJnp OTMQ== X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of gregkh@linuxfoundation.org designates 140.211.169.12 as permitted sender) smtp.mailfrom=gregkh@linuxfoundation.org X-Gm-Message-State: AOUpUlGr7+YtDtfGNRvTOa/wdRIi99jdCQI/TcUeny6SkqigsMxVMswu GGcFIEE9DrEDeHmvp+68pVlgtD3mVJRj202nm9W9SUFbKdZvpn6pkrEWE9vzhj7gcqJOvLSLnQI HZ0c/gN+SKBKC12AMmcNvLI3bcb8FYyOgKoUaQZRBoeWiWqdhFC6wHCw60NoU0A7DEg== X-Received: by 2002:a62:4a41:: with SMTP id x62-v6mr33646862pfa.45.1534445064207; Thu, 16 Aug 2018 11:44:24 -0700 (PDT) X-Google-Smtp-Source: AA+uWPzu49fEZuWqMuc+tz86v7BRWvT7r3FdSgMcho1rOuEwwAqlQ/PLTD0rjWVuYoFzNlUhGD+m X-Received: by 2002:a62:4a41:: with SMTP id x62-v6mr33646833pfa.45.1534445063503; Thu, 16 Aug 2018 11:44:23 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1534445063; cv=none; d=google.com; s=arc-20160816; b=nAnOZvN5NH5n0AVqE/kpPPzN3DrAH1UD5rS5ZWUIW9lsI+XWkxSfV5deAkPHxUj4PZ BB9tz3gqeuBQESvCwoDhx/AXaxTvvt/rupY5I2+nf1/gyq+cH+ldVl5YCubhMdoJlcrh QoVaTPE4zwbmnH6VctLnIF3qXoTxKB1Q1+1lLEGmWx31AvSBqRIbN+kOBI+PiM+WyUNL D//a6BkKmwBBD68ZZ4FTNIq+hYGOCUZ1M6QT97DQ0KUt3tAHZM8A+XygzMjQ29+pjoGe y1QCCvgbiKwmU9Z2xxWFaaA2G7hcNgRKkf0+oU9TBpqCmpKbcokZcrMMIxv7UpxE+CYd Hh8w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=mime-version:user-agent:references:in-reply-to:message-id:date :subject:cc:to:from:arc-authentication-results; bh=LTSk6VANoPJyYwaY8nLzKXtAnE4KKK2ZWPttAwf5VLc=; b=R2zsRBV/SBxPABwwP65gz9SPih5EwFGtbo96a6Sad/NtmIrlCZfWnr8leJA8EpoajT 3hNRV0iiZWtJkLthSMVOEKrcNPpREJ4j21kLmn+ZZD9MRahN+xPTsBgt+ss5Le/aSLzW CUdkjulhIOMyGa0cvCBihrwScjOqKG9dylFuk8bE5QP6c7OVgooVkKNHCnk8xomGYVbt H54SW5b2p30DFYdujtSjcKy2EQmOAH/+svZjtP1abm+XPIStsf3vSf4TJ9N7KKhwzGDt RNaW5vnKhPGjYWLkpu1c5DgG0eqewu0bUjimDkPsgVfKL/SJEYbUIkGIRltvJjEl5373 ZTwg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of gregkh@linuxfoundation.org designates 140.211.169.12 as permitted sender) smtp.mailfrom=gregkh@linuxfoundation.org Received: from mail.linuxfoundation.org (mail.linuxfoundation.org. [140.211.169.12]) by mx.google.com with ESMTPS id 33-v6si64749plh.16.2018.08.16.11.44.23 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 16 Aug 2018 11:44:23 -0700 (PDT) Received-SPF: pass (google.com: domain of gregkh@linuxfoundation.org designates 140.211.169.12 as permitted sender) client-ip=140.211.169.12; Authentication-Results: mx.google.com; spf=pass (google.com: domain of gregkh@linuxfoundation.org designates 140.211.169.12 as permitted sender) smtp.mailfrom=gregkh@linuxfoundation.org Received: from localhost (unknown [194.244.16.108]) by mail.linuxfoundation.org (Postfix) with ESMTPSA id 99319CB7; Thu, 16 Aug 2018 18:44:22 +0000 (UTC) From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Chintan Pandya , Toshi Kani , Thomas Gleixner , mhocko@suse.com, akpm@linux-foundation.org, hpa@zytor.com, linux-mm@kvack.org, linux-arm-kernel@lists.infradead.org, Will Deacon , Joerg Roedel Subject: [PATCH 4.9 14/15] ioremap: Update pgtable free interfaces with addr Date: Thu, 16 Aug 2018 20:42:07 +0200 Message-Id: <20180816171627.286156369@linuxfoundation.org> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20180816171625.340082081@linuxfoundation.org> References: <20180816171625.340082081@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review MIME-Version: 1.0 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 4.9-stable review patch. If anyone has any objections, please let me know. ------------------ From: Chintan Pandya commit 785a19f9d1dd8a4ab2d0633be4656653bd3de1fc upstream. 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 Signed-off-by: Thomas Gleixner Cc: mhocko@suse.com Cc: akpm@linux-foundation.org Cc: hpa@zytor.com Cc: linux-mm@kvack.org Cc: linux-arm-kernel@lists.infradead.org Cc: Will Deacon Cc: Joerg Roedel Cc: stable@vger.kernel.org Cc: Andrew Morton Cc: Michal Hocko Cc: "H. Peter Anvin" Cc: Link: https://lkml.kernel.org/r/20180627141348.21777-3-toshi.kani@hpe.com Signed-off-by: Greg Kroah-Hartman --- 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(-) --- a/arch/arm64/mm/mmu.c +++ b/arch/arm64/mm/mmu.c @@ -804,12 +804,12 @@ int pmd_clear_huge(pmd_t *pmd) 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); } --- a/arch/x86/mm/pgtable.c +++ b/arch/x86/mm/pgtable.c @@ -657,11 +657,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; @@ -672,7 +673,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); @@ -684,11 +685,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; @@ -704,7 +706,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); } @@ -713,7 +715,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); } --- a/include/asm-generic/pgtable.h +++ b/include/asm-generic/pgtable.h @@ -779,8 +779,8 @@ int pud_set_huge(pud_t *pud, phys_addr_t 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 pud_set_huge(pud_t *pud, phys_addr_t addr, pgprot_t prot) { @@ -798,11 +798,11 @@ static inline int pmd_clear_huge(pmd_t * { 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; } --- a/lib/ioremap.c +++ b/lib/ioremap.c @@ -84,7 +84,7 @@ static inline int ioremap_pmd_range(pud_ 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; } @@ -111,7 +111,7 @@ static inline int ioremap_pud_range(pgd_ 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; }