Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1350912

[PATCH] memremap: check pfn validity before passing to pfn_to_page()

Path csiph.com!aioe.org!gothmog.csi.it!bofh.it!news.nic.it!robomod
From Ard Biesheuvel <ard.biesheuvel@linaro.org>
Newsgroups linux.kernel
Subject [PATCH] memremap: check pfn validity before passing to pfn_to_page()
Date Sat, 05 Mar 2016 16:40:02 +0100
Message-ID <r9mtc-89y-9@gated-at.bofh.it> (permalink)
X-Original-To linux-kernel@vger.kernel.org, dan.j.williams@intel.com
Dkim-Signature v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id; bh=6h6EmTL6xhcBCpGO6qEN8Sj1YbTBj8zSsbJT/DccBQE=; b=gsm0PHSdDLP5x2F3SqCOAdEbxWo9P1IHiRQk2Ve1CUwXyU8mpn4Uetl0RORGvHndsS maxUAlXR2GHgivJWB2rU9Y8OfLEMkWa9PwScdN0w8MdpfNc6fcQPMFGHS+dfDX9oTqDF BgwZQR9iyzkGNJdzKZJwGB8IiuJawDPofpD6U=
X-Google-Dkim-Signature v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=6h6EmTL6xhcBCpGO6qEN8Sj1YbTBj8zSsbJT/DccBQE=; b=iUL2CUYPebVh2C9rWLOHUR1X/9gFNHE1nwgR+N6Z9XhKGQxKWx0V4JqvWGWDQaxFQb fRHSYMg9t7N2Qaq3/dMjlcoJS9k0+XKvAjjpDbGjzY0aseLGCiAHjx+pTIMBjPTBYCBC IsdLywOMy+ePrbajPAYDyWnAn0xECiAC7ptIG/0v/AfP+3wzfl+q2Ym6e73dbXYNFOYY MMwlsjIrbPlmhxK+APJok1aem2EDhsMthn2BUroNi7KFkjEh8s49oJjV/JrDmUpeyhpz 39VKLzkNJPtTXdEDyCdJN6x/u/Oiks4+3+FpZUB+cAQDtpVJLBo9LpkNQlmZix4VwyCP vd2Q==
X-Gm-Message-State AD7BkJLh5rmkduXJ1FzyQ5Frs2ojKJMLikPviq4Vie3bv7vnFloFroVMwKvRVl59fpk+UNvu
X-Received by 10.28.54.197 with SMTP id y66mr4056144wmh.16.1457191968341; Sat, 05 Mar 2016 07:32:48 -0800 (PST)
X-Mailer git-send-email 1.9.1
Sender robomod@news.nic.it
List-ID <linux-kernel.vger.kernel.org>
X-Mailing-List linux-kernel@vger.kernel.org
Approved robomod@news.nic.it
Lines 38
Organization linux.* mail to news gateway
X-Original-Cc linux-arm-kernel@lists.infradead.org, akpm@linux-foundation.org, Ard Biesheuvel <ard.biesheuvel@linaro.org>
X-Original-Date Sat, 5 Mar 2016 16:32:38 +0100
X-Original-Message-ID <1457191958-5263-1-git-send-email-ard.biesheuvel@linaro.org>
X-Original-Sender linux-kernel-owner@vger.kernel.org
Xref csiph.com linux.kernel:1350912

Show key headers only | View raw


In memremap's helper function try_ram_remap(), we dereference a struct page
pointer that was derived from a PFN that is known to be covered by a
'System RAM' iomem region, and is thus assumed to be a 'valid' PFN, i.e., a
PFN that has a struct page associated with it and is covered by the kernel
direct mapping.
However, the assumption that there is a 1:1 relation between the System RAM
iomem region and the kernel direct mapping is not universally valid on all
architectures, and on ARM and arm64, 'System RAM' may include regions for
which pfn_valid() returns false.

Generally speaking, both __va() and pfn_to_page() should only ever be called
on PFNs/physical addresses for which pfn_valid() returns true, so add that
check to try_ram_remap().

Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
---
 kernel/memremap.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/kernel/memremap.c b/kernel/memremap.c
index b981a7b023f0..03fa254f61f6 100644
--- a/kernel/memremap.c
+++ b/kernel/memremap.c
@@ -29,10 +29,10 @@ __weak void __iomem *ioremap_cache(resource_size_t offset, unsigned long size)
 
 static void *try_ram_remap(resource_size_t offset, size_t size)
 {
-	struct page *page = pfn_to_page(offset >> PAGE_SHIFT);
+	unsigned long pfn = PHYS_PFN(offset);
 
 	/* In the simple case just return the existing linear address */
-	if (!PageHighMem(page))
+	if (pfn_valid(pfn) && !PageHighMem(pfn_to_page(pfn)))
 		return __va(offset);
 	return NULL; /* fallback to ioremap_cache */
 }
-- 
1.9.1

Back to linux.kernel | Previous | Next | Find similar | Unroll thread


Thread

[PATCH] memremap: check pfn validity before passing to pfn_to_page() Ard Biesheuvel <ard.biesheuvel@linaro.org> - 2016-03-05 16:40 +0100

csiph-web