From patchwork Mon Nov 26 17:07:46 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Will Deacon X-Patchwork-Id: 152054 Delivered-To: patch@linaro.org Received: by 2002:a2e:299d:0:0:0:0:0 with SMTP id p29-v6csp92144ljp; Mon, 26 Nov 2018 09:08:23 -0800 (PST) X-Google-Smtp-Source: AFSGD/UL2hI6UI9U+pT/0IiH2iUaCGQh3sc4fWuw2t5CQZDvO5FeyLx4BoqqEzkpcRk39C39bcKS X-Received: by 2002:a17:902:8346:: with SMTP id z6mr28512931pln.340.1543252102915; Mon, 26 Nov 2018 09:08:22 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1543252102; cv=none; d=google.com; s=arc-20160816; b=lXOFHyMSjz44hEh+aiIEhNBl8AR29ML+W2AlnXinEhvB1UhtzPwx5XRAGsnWO20ek9 QOBthSlpJIUuGMnleZAHpwKFGrT+7zK2vbiWcdhIifCHFmHqqczUVBf4VGQbHjgsPdvd Tw75IkvhW1Plo2o1JEc5rEWrQ4z5OaYzcInlv2O1FmPRSxUzei7oM88ENDOn/G9KznHX wI8wBt/pOV7JBkRiDvQDUJbh+AGYcfmhDixw6lYsVKc0W2VkYpzVTEkNDkBPx4dfdDBO u+xSe8U9WBj+rHcg0hQW1phKhKtyW3mg79SbmFK/n1UOluEJRLkGIBakw2hjVWlJN2I9 Wzuw== 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=gyaouhO6M09bNRRp3jEmM8H6PKnPVZFp5tgRSOGTTCE=; b=HnGJ2a4WP77PvpF1/Vr7aO3M5scXY9GZnjC2FFh1GyiiHb5YYVXHsD0bu6rVhSR/qm T8kZ1w4wSFx8ZOpzqursAJTesxlfDeULuJep5BZdedKzp9X59OhkTYVjVRQMkZtWBmn4 pyzMQo+4GuuUxPSxQ/SZ1mc9AsqQ03e0HKP3YwpJQhBqA3z9+F4ADoQDKQNAWn81c74u rqJbtKEWbmz0yLhky1jt0yGd+34H3RDDrrgiHS7tQfU2e3i/2nkzI6qvhd2C1MFHOENk pQwhWoM4o/8pQwDxjCQ+yVYsvR0WkzUb5k0P7ZU35jHZT3XW/cBZzWUMT5O4OH6/zxIq MeYg== 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 y25si809125pgl.226.2018.11.26.09.08.12; Mon, 26 Nov 2018 09:08:22 -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 S1726956AbeK0ECf (ORCPT + 32 others); Mon, 26 Nov 2018 23:02:35 -0500 Received: from usa-sjc-mx-foss1.foss.arm.com ([217.140.101.70]:42960 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726210AbeK0ECN (ORCPT ); Mon, 26 Nov 2018 23:02:13 -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 090881993; Mon, 26 Nov 2018 09:07:31 -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 CD0B03F59C; Mon, 26 Nov 2018 09:07:30 -0800 (PST) Received: by edgewater-inn.cambridge.arm.com (Postfix, from userid 1000) id 47AA11AE0B68; Mon, 26 Nov 2018 17:07:48 +0000 (GMT) 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 v4 4/5] lib/ioremap: Ensure phys_addr actually corresponds to a physical address Date: Mon, 26 Nov 2018 17:07:46 +0000 Message-Id: <1543252067-30831-5-git-send-email-will.deacon@arm.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1543252067-30831-1-git-send-email-will.deacon@arm.com> References: <1543252067-30831-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 Signed-off-by: Will Deacon --- lib/ioremap.c | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) -- 2.1.4 Tested-by: Sean Christopherson Reviewed-by: Sean Christopherson 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);