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