From patchwork Wed Oct 10 16:23:03 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Will Deacon X-Patchwork-Id: 10634821 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 24FBE17E1 for ; Wed, 10 Oct 2018 16:23:29 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id C85AB2A648 for ; Wed, 10 Oct 2018 16:23:28 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id BBEBB2A675; Wed, 10 Oct 2018 16:23:28 +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 2F71E2A62F for ; Wed, 10 Oct 2018 16:23:28 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 4AFB66B0006; Wed, 10 Oct 2018 12:23:16 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id 4617A6B000A; Wed, 10 Oct 2018 12:23:16 -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 32BE56B000C; Wed, 10 Oct 2018 12:23:16 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from mail-ot1-f69.google.com (mail-ot1-f69.google.com [209.85.210.69]) by kanga.kvack.org (Postfix) with ESMTP id D48DE6B0006 for ; Wed, 10 Oct 2018 12:23:15 -0400 (EDT) Received: by mail-ot1-f69.google.com with SMTP id l89-v6so4042288otc.6 for ; Wed, 10 Oct 2018 09:23:15 -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=gyaouhO6M09bNRRp3jEmM8H6PKnPVZFp5tgRSOGTTCE=; b=OxLg+9aV4U1VwNZ6Jo4XgWDiYikLVVNVEKzHRZ70RPs6A2tchhvFufbhmC1xvrtsZ2 OWV6VSYFlrB7m/uswT4Yit0B9KWaCTP8MjV4+6GvQiYrVmSi57XS3xEGCitQ94chQw4k NxxhnNDD69scQarunsLBWbAxMsJmoAVXJefZaK1EeBZh7gDueUM2GDYkfteWi9VXn/o5 DWMKUGn40AEpHiLh92Bx81u0Xxr2AaVHQgqKIghxjw2UkrA0QTNq9n9GObwyBvPmkKGq iLr36sLrXhGWMSpJc8VQwDUJcWSWEwI33dodPLDwGPMnD2OPzUxv2Qj/72ZPics56hBo nizw== X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of will.deacon@arm.com designates 217.140.101.70 as permitted sender) smtp.mailfrom=will.deacon@arm.com X-Gm-Message-State: ABuFfoiMQ8zqFzdfMsSBxL2F3S5+ClCcj9ZURfFzbWhkgS1biv7CMdJW 1I5DLdO4HuiZDrwnjH3RC4Ze86tMvygW3XDnD8zc6RnnUy2Z1jKK5axCMd4h3J6D0kcjnKBg3OV xfDBeFOnlhnDwTwBRHrhkpAmpXBZe+5dafbbEwaCO9s8h2h5O/ldZmGgI6+psRIPuqw== X-Received: by 2002:a9d:d61:: with SMTP id 88mr16565825oti.245.1539188595589; Wed, 10 Oct 2018 09:23:15 -0700 (PDT) X-Google-Smtp-Source: ACcGV62Z+dkf5og3+fZtUMdtSbBsPfsxaMNMw0r9mhsan9wgTWCr/ZaLaTy7u3uQz4O6nPgQsGyG X-Received: by 2002:a9d:d61:: with SMTP id 88mr16565774oti.245.1539188594210; Wed, 10 Oct 2018 09:23:14 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1539188594; cv=none; d=google.com; s=arc-20160816; b=AoZi42bsCmO90SIKbOdrXjj/PbNh2jrU33GybV92flADIaTzFq+CBeyXeKFYOLp0sD ETWJC7MPpDW0IMOXW2MNJmduKnP0JJB2tXyi1BuXHqupOWufg6jUMGJ8o4smzCLNklh0 5By7yj0t/6vElP5ys0MnpvQ8sYUCu4b1G7H1O/aRZIWwNbEmZrIA1Rl8qFC/M55goD0S PyDO3ThNIjOztggZ7vysqIMBWBvXTTzZQoP2Wsk589+jMnQCrz+C555K5iPr4sVHaH83 XY1BK+WiEUppkCm8HYrXBgeCHe5x24+6md1aBrUbzfCRnghlNPtVQewTiWnpbZjdiQ8d kCYg== 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; bh=gyaouhO6M09bNRRp3jEmM8H6PKnPVZFp5tgRSOGTTCE=; b=QEwxxUeTp+Gg9mbhGYXZUCLxuHnEw2uHOasxPahr+B5WCejuXXGjS7v/H6/3i83nA+ mShbGgozm2T3q4STOl7hdZeFswFHldGdO2AYlERV8I/wj+DSEeEVowMyHbVpW++6ZalQ lCe9yazQuFKSD4BtgqHK9W46TCqrbwY8Bp0dckBRddUoQEScHI0H6Jnu6zwdnQ5U2VgQ 9ssCtMyVtl2OgsThAZ/0fNkW3Nl8J4vJWYKfDUH1tSavoa8X1uyuRA21tIxowbGzPw9N 53PEwC3h2nNLxG/PR3Kb0d5ep7CqCJBiSh4PipaxRXUwCAUrEir5Lpqp73IMGvb0m5OU /9ng== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of will.deacon@arm.com designates 217.140.101.70 as permitted sender) smtp.mailfrom=will.deacon@arm.com Received: from foss.arm.com (foss.arm.com. [217.140.101.70]) by mx.google.com with ESMTP id u23si5859244otf.19.2018.10.10.09.23.13 for ; Wed, 10 Oct 2018 09:23:14 -0700 (PDT) Received-SPF: pass (google.com: domain of will.deacon@arm.com designates 217.140.101.70 as permitted sender) client-ip=217.140.101.70; Authentication-Results: mx.google.com; spf=pass (google.com: domain of will.deacon@arm.com designates 217.140.101.70 as permitted sender) smtp.mailfrom=will.deacon@arm.com Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 8EEF31682; Wed, 10 Oct 2018 09:23:13 -0700 (PDT) Received: from edgewater-inn.cambridge.arm.com (usa-sjc-imap-foss1.foss.arm.com [10.72.51.249]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 60D913F5B3; Wed, 10 Oct 2018 09:23:13 -0700 (PDT) Received: by edgewater-inn.cambridge.arm.com (Postfix, from userid 1000) id 137311AE2D6C; Wed, 10 Oct 2018 17:23:13 +0100 (BST) From: Will Deacon To: linux-kernel@vger.kernel.org, linux-mm@kvack.org Cc: cpandya@codeaurora.org, toshi.kani@hpe.com, tglx@linutronix.de, mhocko@suse.com, akpm@linux-foundation.org, sean.j.christopherson@intel.com, Will Deacon Subject: [PATCH v3 4/5] lib/ioremap: Ensure phys_addr actually corresponds to a physical address Date: Wed, 10 Oct 2018 17:23:03 +0100 Message-Id: <1539188584-15819-5-git-send-email-will.deacon@arm.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1539188584-15819-1-git-send-email-will.deacon@arm.com> References: <1539188584-15819-1-git-send-email-will.deacon@arm.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 The current ioremap() code uses a phys_addr variable at each level of page table, which is confusingly offset by subtracting the base virtual address being mapped so that adding the current virtual address back on when iterating through the page table entries gives back the corresponding physical address. This is fairly confusing and results in all users of phys_addr having to add the current virtual address back on. Instead, this patch just updates phys_addr when iterating over the page table entries, ensuring that it's always up-to-date and doesn't require explicit offsetting. Cc: Chintan Pandya Cc: Toshi Kani Cc: Thomas Gleixner Cc: Michal Hocko Cc: Andrew Morton Cc: Sean Christopherson Signed-off-by: Will Deacon --- lib/ioremap.c | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/lib/ioremap.c b/lib/ioremap.c index 6c72764af19c..10d7c5485c39 100644 --- a/lib/ioremap.c +++ b/lib/ioremap.c @@ -101,19 +101,18 @@ static inline int ioremap_pmd_range(pud_t *pud, unsigned long addr, pmd_t *pmd; unsigned long next; - phys_addr -= addr; pmd = pmd_alloc(&init_mm, pud, addr); if (!pmd) return -ENOMEM; do { next = pmd_addr_end(addr, end); - if (ioremap_try_huge_pmd(pmd, addr, next, phys_addr + addr, prot)) + if (ioremap_try_huge_pmd(pmd, addr, next, phys_addr, prot)) continue; - if (ioremap_pte_range(pmd, addr, next, phys_addr + addr, prot)) + if (ioremap_pte_range(pmd, addr, next, phys_addr, prot)) return -ENOMEM; - } while (pmd++, addr = next, addr != end); + } while (pmd++, phys_addr += (next - addr), addr = next, addr != end); return 0; } @@ -142,19 +141,18 @@ static inline int ioremap_pud_range(p4d_t *p4d, unsigned long addr, pud_t *pud; unsigned long next; - phys_addr -= addr; pud = pud_alloc(&init_mm, p4d, addr); if (!pud) return -ENOMEM; do { next = pud_addr_end(addr, end); - if (ioremap_try_huge_pud(pud, addr, next, phys_addr + addr, prot)) + if (ioremap_try_huge_pud(pud, addr, next, phys_addr, prot)) continue; - if (ioremap_pmd_range(pud, addr, next, phys_addr + addr, prot)) + if (ioremap_pmd_range(pud, addr, next, phys_addr, prot)) return -ENOMEM; - } while (pud++, addr = next, addr != end); + } while (pud++, phys_addr += (next - addr), addr = next, addr != end); return 0; } @@ -164,7 +162,6 @@ static inline int ioremap_p4d_range(pgd_t *pgd, unsigned long addr, p4d_t *p4d; unsigned long next; - phys_addr -= addr; p4d = p4d_alloc(&init_mm, pgd, addr); if (!p4d) return -ENOMEM; @@ -173,14 +170,14 @@ static inline int ioremap_p4d_range(pgd_t *pgd, unsigned long addr, if (ioremap_p4d_enabled() && ((next - addr) == P4D_SIZE) && - IS_ALIGNED(phys_addr + addr, P4D_SIZE)) { - if (p4d_set_huge(p4d, phys_addr + addr, prot)) + IS_ALIGNED(phys_addr, P4D_SIZE)) { + if (p4d_set_huge(p4d, phys_addr, prot)) continue; } - if (ioremap_pud_range(p4d, addr, next, phys_addr + addr, prot)) + if (ioremap_pud_range(p4d, addr, next, phys_addr, prot)) return -ENOMEM; - } while (p4d++, addr = next, addr != end); + } while (p4d++, phys_addr += (next - addr), addr = next, addr != end); return 0; } @@ -196,14 +193,13 @@ int ioremap_page_range(unsigned long addr, BUG_ON(addr >= end); start = addr; - phys_addr -= addr; pgd = pgd_offset_k(addr); do { next = pgd_addr_end(addr, end); - err = ioremap_p4d_range(pgd, addr, next, phys_addr+addr, prot); + err = ioremap_p4d_range(pgd, addr, next, phys_addr, prot); if (err) break; - } while (pgd++, addr = next, addr != end); + } while (pgd++, phys_addr += (next - addr), addr = next, addr != end); flush_cache_vmap(start, end);