[PATCH] kdump, oldmem: support mmap on /dev/oldmem

From: HATAYAMA Daisuke
Date: Tue Jan 29 2013 - 23:02:02 EST


Support mmap() on /dev/oldmem to improve performance of reading
/proc/vmcore. Currently, read to /proc/vmcore is done by read_oldmem()
that uses ioremap and iounmap per a single page; for example, if
memory is 1GB, ioremap/iounmap is called (1GB / 4KB)-times, that is,
262144 times. This causes big performance degradation.

By this patch, we saw improvement on simple benchmark from

200 [MiB/sec] to over 100.00 [GiB/sec].

We don't permit mapping over saved_max_pfn as is done in read_oldmem()
and mapping memory as neither writable nor executable.

Signed-off-by: HATAYAMA Daisuke <d.hatayama@xxxxxxxxxxxxxx>
---
drivers/char/mem.c | 27 +++++++++++++++++++++++++++
1 files changed, 27 insertions(+), 0 deletions(-)

diff --git a/drivers/char/mem.c b/drivers/char/mem.c
index c6fa3bc..e9046634 100644
--- a/drivers/char/mem.c
+++ b/drivers/char/mem.c
@@ -388,6 +388,32 @@ static ssize_t read_oldmem(struct file *file, char __u=
ser *buf,
}
return read;
}
+
+/*
+ * Mmap memory corresponding to the old kernel.
+ */
+static int mmap_oldmem(struct file *file, struct vm_area_struct *vma)
+{
+ size_t size =3D vma->vm_end - vma->vm_start;
+ unsigned long pfn =3D vma->vm_pgoff;
+
+ if (pfn + (size >> PAGE_SHIFT) > saved_max_pfn + 1)
+ return -EINVAL;
+
+ if (vma->vm_flags & (VM_WRITE | VM_EXEC))
+ return -EPERM;
+
+ vma->vm_flags &=3D ~(VM_MAYWRITE | VM_MAYEXEC);
+
+ if (remap_pfn_range(vma,
+ vma->vm_start,
+ pfn,
+ size,
+ vma->vm_page_prot))
+ return -EAGAIN;
+
+ return 0;
+}
#endif
=20
#ifdef CONFIG_DEVKMEM
@@ -806,6 +832,7 @@ static const struct file_operations oldmem_fops =3D {
.read =3D read_oldmem,
.open =3D open_oldmem,
.llseek =3D default_llseek,
+ .mmap =3D mmap_oldmem,
};
#endif
=20
--=20
1.7.7.6


--_002_33710E6CAA200E4583255F4FB666C4E20AC36B01G01JPEXMBYT03_
Content-Type: application/x-gzip; name="tool.tar.gz"
Content-Description: tool.tar.gz
Content-Disposition: attachment; filename="tool.tar.gz"; size=2173;
creation-date="Mon, 04 Feb 2013 04:47:09 GMT";
modification-date="Mon, 04 Feb 2013 04:47:09 GMT"
Content-Transfer-Encoding: base64

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
ApZHACgAAA==

--_002_33710E6CAA200E4583255F4FB666C4E20AC36B01G01JPEXMBYT03_--
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/