Thread (5 messages) flat view 5 messages, 3 authors, 2006-09-22

Re: [Fastboot] [PATCH] kdump: don't call __ioremap() for pfn = 0

From: Vivek Goyal <hidden>
Date: 2006-09-21 14:11:31

On Thu, Sep 21, 2006 at 09:02:37PM +1000, Michael Ellerman wrote:
On Thu, 2006-09-21 at 10:07 +0530, Sachin P. Sant wrote:
quoted
Hi

While using dd command to retrive the dump from /dev/oldmem, there comes
a rare case where pfn value is zero. In this case the __ioremap() call 
returns
NULL and hence copying fails.

# dd if=/dev/oldmem of=/dev/null
dd: reading `/dev/oldmem': Bad address
0+0 records in
0+0 records out
0 bytes (0 B) copied, 0.000121 seconds, 0.0 kB/s

Attached is a patch to fix this problem. During such rare cases don't call
__ioremap() to do the address translation, instead use __va() .
It's not really rare, it's just when we're reading /dev/oldmem directly.

We can actually use the __va() trick for the whole linear mapping rather
than just pfn 0, which saves the ioremap. We also shouldn't really be
trying to iounmap(__va(0)).
Makes sense. We can take advantage of linear mappings mapped till max_pfn
and avoid ioremap().
+
+static size_t copy_oldmem_vaddr(void *vaddr, char *buf, size_t csize,
+				unsigned long offset, int userbuf)
+{
+	if (userbuf) {
+		if (copy_to_user((char __user *)buf, (vaddr + offset), csize)) {
+			return -EFAULT;
+		}
Probably you can get rid of above pair of braces as there is only single
statement under if.
 
-	if (userbuf) {
-		if (copy_to_user((char __user *)buf, (vaddr + offset), csize)) {
-			iounmap(vaddr);
-			return -EFAULT;
-		}
-	} else
-		memcpy(buf, (vaddr + offset), csize);
+	if (pfn < max_pfn) {
Should this be (pfn <= max_pfn) ?

-Vivek
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help