From patchwork Thu Dec 6 18:21:34 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Will Deacon X-Patchwork-Id: 153054 Delivered-To: patch@linaro.org Received: by 2002:a2e:299d:0:0:0:0:0 with SMTP id p29-v6csp10859796ljp; Thu, 6 Dec 2018 10:21:18 -0800 (PST) X-Google-Smtp-Source: AFSGD/XFJlhFqd9h7W1qHjBh0ohhbtBT1orTHM5+trNKhMvTpgsrd5wJK9CJNUZUOGU3eMdy6JbT X-Received: by 2002:a62:399b:: with SMTP id u27mr30618056pfj.181.1544120478710; Thu, 06 Dec 2018 10:21:18 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1544120478; cv=none; d=google.com; s=arc-20160816; b=B8YYcpMG64uNLfT7AEcBtucpWM0J8Qm9tmTQegc8LmYVUoEGxyvUIWd/JPbk1tgsBQ m/0aeKxxelOhCHnAE8yU8FoPZzXIskJsqp7wdfjS6pW/ZLvApSIk0/NVVB2Ec4XOxdIg yr+xHz74ACc+9EYAtq3/iEs5W3enMcdIee0laU6IxQAQ2V/pckXD4K1Hbhx6h9i8G7GO 4mMFXNT7iVO8zpal792GZDEcXvK4/Jr0kEQkJ94yTe4BlbImuddZhlP3Lafbg+soiwCE T8n8J3Iv/G3CGNvHfkyDRFRAogZbJ8xbGhNY7y7qzEkv1j4ISA6NAJsDeEeD3vMkHCDr 0QVQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from; bh=1Ou78OtI/MFN3FEOfIqRBplaVjPGG1HlQbCtT73huwU=; b=QIXbBEsQqrbNP0o5aeJQmYe62gfSQVUCaKw8I62U0yCdXpjFf3oEqFd/dzSOhWcEBb HraBYE9YGj1oYvA2ruD6XvloBVQX35porpBznocgNt0dhyr0PWpsAA9Ix0N8CPPP5sZT V0Qf/hRYKslcfHKJLHl8c00zoeV7bY7RXrsl7vrdNsLWMp58PY+BE4nYG0nONDhvDDwn hCUMklOXxgmzvgNyVCVGW7e+9ephvcTjYxZFube51VKkKMdoAk4UGpXmvCOkvcMkq+e6 DkLRyZubLhAiAdEH5WnoPuuaqsRJHEYHEWaDkJ0/uc8lOQN8gPbr9jtfm2DJP+GZnx1z hS1A== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id n8si799809plk.9.2018.12.06.10.21.18; Thu, 06 Dec 2018 10:21:18 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726115AbeLFSVR (ORCPT + 31 others); Thu, 6 Dec 2018 13:21:17 -0500 Received: from foss.arm.com ([217.140.101.70]:57872 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725945AbeLFSVQ (ORCPT ); Thu, 6 Dec 2018 13:21:16 -0500 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 C825815AD; Thu, 6 Dec 2018 10:21:15 -0800 (PST) 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 98AF23F71D; Thu, 6 Dec 2018 10:21:15 -0800 (PST) Received: by edgewater-inn.cambridge.arm.com (Postfix, from userid 1000) id AEC071AE0BF1; Thu, 6 Dec 2018 18:21:36 +0000 (GMT) From: Will Deacon To: akpm@linux-foundation.org Cc: linux-kernel@vger.kernel.org, linux-mm@kvack.org, cpandya@codeaurora.org, toshi.kani@hpe.com, tglx@linutronix.de, mhocko@suse.com, sean.j.christopherson@intel.com, Will Deacon Subject: [RESEND PATCH v4 4/5] lib/ioremap: Ensure phys_addr actually corresponds to a physical address Date: Thu, 6 Dec 2018 18:21:34 +0000 Message-Id: <1544120495-17438-5-git-send-email-will.deacon@arm.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1544120495-17438-1-git-send-email-will.deacon@arm.com> References: <1544120495-17438-1-git-send-email-will.deacon@arm.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 Tested-by: Sean Christopherson Reviewed-by: Sean Christopherson Signed-off-by: Will Deacon --- lib/ioremap.c | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) -- 2.1.4 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);