From patchwork Wed Sep 12 10:26:13 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Will Deacon X-Patchwork-Id: 10597329 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 3AE166CB for ; Wed, 12 Sep 2018 10:26:13 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 29C8129A7C for ; Wed, 12 Sep 2018 10:26:13 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 1E5E129A94; Wed, 12 Sep 2018 10:26:13 +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 8381E29A7C for ; Wed, 12 Sep 2018 10:26:12 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id D38788E0004; Wed, 12 Sep 2018 06:26:04 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id CC4A78E0007; Wed, 12 Sep 2018 06:26:04 -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 8F2798E0004; Wed, 12 Sep 2018 06:26:04 -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 5F6CB8E0006 for ; Wed, 12 Sep 2018 06:26:04 -0400 (EDT) Received: by mail-oi0-f70.google.com with SMTP id j17-v6so1744188oii.8 for ; Wed, 12 Sep 2018 03:26:04 -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=mCQhMX470BDGByPnZUeAM4vjCfUfWAlr0VZ7SYs45do=; b=Ecni2UZuW7t4Abk0kAzlPamJd9Y2qR8Z+dJXoSLuOn7qgU+fkyDZ9bnMnT4vsePdlH WijQ5hVLzJyctVaULX3ndx3s09vMwd+soegSz2UIhVPNMvQcw14YjvmLFYIwMxvubmkG XdDnKfj0BZtTayKVCqiuF8JqAqZetCxQzrTlhkyj8mBzmlcldwooK/YUmJascP1k0ekF X/O4RkTUSFViRNXJDvOUNw6b3jM2ev6VI6Z5zo8vxx1Y0MfkwGT+szUmAjjCj+YOUGsT 73wqKrHpcIK7E/XojyMmFqSgW71xZH6/K/Z5jm/upNqLXBiThR4IUuKezGTeebqnd14h EPnw== 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: APzg51A1CU60aJM6D+NEE0Vfp7qVHvN3sRYRnf3AVmaG12jUji48u0ic j40SNfn2U8wKilfh4qSuZcVDKnoTj072yOPvWJlGVL4CJL0XwW4YEQsDWOhqm6IiLPYLaOhXD+r iKXwp5YCv52FNAUmIqAI1O7eEol2QAn0G6YE50udnaudP9ayRnpmy+KA4mbWQ2Dnq0g== X-Received: by 2002:aca:56d1:: with SMTP id k200-v6mr1318718oib.319.1536747964101; Wed, 12 Sep 2018 03:26:04 -0700 (PDT) X-Google-Smtp-Source: ANB0VdZCu765DKLE17kikQGZOvQeEFwdA58Olgc5bhFlYMmFE/HB8Kd0y6buwZNPMgY9bjKSVqW3 X-Received: by 2002:aca:56d1:: with SMTP id k200-v6mr1318650oib.319.1536747963059; Wed, 12 Sep 2018 03:26:03 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1536747963; cv=none; d=google.com; s=arc-20160816; b=rnjUqLcqYMsk6ZfQ3ozBH4w+uAlcJQKazOI1GZNczzc2T8RPSdbQ96dUPO9Y0EEcTH dYIIBJ1h8F9w320qBMjbXwjGdhnuaTVGbiyFIr/8wfuZ0eatY3R0sp6B0Fg7av3YHEc2 B82GH1Xktg5ug/rApu5CN3j79lFTmYbf4mTZFItQWe+oPOyKmraJj2Ie6h9i5SuMy9KV dPmPuuNrrbXmke32bPEHltEBO0i//zeAmmXWz6nDmw8hi5nVXyAZ0AgPz5wl4e8YN4ne AMIuuwWQB78wRPdh2jZRRwpESEDoy31mdOfVrNx71CBN7pMD38o2zP0vI1k+ECbRYUwm C4gA== 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=mCQhMX470BDGByPnZUeAM4vjCfUfWAlr0VZ7SYs45do=; b=yjykGZdYVq1m6QPudgxyxqK2kKc2/WLRs6PzWLX2htSO7zf683prHTBjVzh+1flGSd J5MrnM9QkuaDwYs2cdFwKDyMig8y1hFQxNQ3biunkF4pq5qtKupt/ArFtanh/uib5yiU Bxi990BxNLDSG/NEWRAoRD/Q0rdQUosDOtoVm6R6TJJo/n3PnETq6xA3WtpKheM71B5E g2jlIG2X+SmLERdmUI/T0ruLQbV0XAuodvAKAhusytqEp6VeZkW77ScoDpXCZQAc9DLM DcI9vPT4+5RGtvOmrKtCGfKQ7Khcen46FentmDJJ4SYSHfSxsSt2Rgcq6VXaWPSMkzLb PhFQ== 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 (usa-sjc-mx-foss1.foss.arm.com. [217.140.101.70]) by mx.google.com with ESMTP id t145-v6si437785oih.243.2018.09.12.03.26.02 for ; Wed, 12 Sep 2018 03:26:02 -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 1F1481684; Wed, 12 Sep 2018 03:26:02 -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 E55DB3F614; Wed, 12 Sep 2018 03:26:01 -0700 (PDT) Received: by edgewater-inn.cambridge.arm.com (Postfix, from userid 1000) id B42871AE3411; Wed, 12 Sep 2018 11:26:18 +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, Will Deacon Subject: [PATCH 4/5] lib/ioremap: Ensure phys_addr actually corresponds to a physical address Date: Wed, 12 Sep 2018 11:26:13 +0100 Message-Id: <1536747974-25875-5-git-send-email-will.deacon@arm.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1536747974-25875-1-git-send-email-will.deacon@arm.com> References: <1536747974-25875-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 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..fc834a59c90c 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++, addr = next, phys_addr += PMD_SIZE, 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++, addr = next, phys_addr += PUD_SIZE, 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++, addr = next, phys_addr += P4D_SIZE, 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++, addr = next, phys_addr += PGDIR_SIZE, addr != end); flush_cache_vmap(start, end);