From: HATAYAMA Daisuke <d.hatayama@jp.fujitsu.com> To: vgoyal@redhat.com, ebiederm@xmission.com, cpw@sgi.com, kumagai-atsushi@mxc.nes.nec.co.jp, lisa.mitchell@hp.com, heiko.carstens@de.ibm.com, akpm@linux-foundation.org Cc: kexec@lists.infradead.org, linux-kernel@vger.kernel.org, zhangyanfei@cn.fujitsu.com Subject: [PATCH v3 21/21] vmcore: introduce mmap_vmcore() Date: Sat, 16 Mar 2013 13:02:45 +0900 [thread overview] Message-ID: <20130316040245.15064.91206.stgit@localhost6.localdomain6> (raw) In-Reply-To: <20130316040003.15064.62308.stgit@localhost6.localdomain6> This patch introduces mmap_vmcore(). If flag MEM_TYPE_CURRENT_KERNEL is set, remapped is the buffer on the 2nd kernel. If not set, remapped is some area in old memory. Neither writable nor executable mapping is permitted even with mprotect(). Non-writable mapping is also requirement of remap_pfn_range() when mapping linear pages on non-consequtive physical pages; see is_cow_mapping(). On x86-32 PAE kernels, mmap() supports at most 16TB memory only. This limitation comes from the fact that the third argument of remap_pfn_range(), pfn, is of 32-bit length on x86-32: unsigned long. Signed-off-by: HATAYAMA Daisuke <d.hatayama@jp.fujitsu.com> --- fs/proc/vmcore.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 72 insertions(+), 0 deletions(-) diff --git a/fs/proc/vmcore.c b/fs/proc/vmcore.c index dd1d601..bc4848c 100644 --- a/fs/proc/vmcore.c +++ b/fs/proc/vmcore.c @@ -185,9 +185,81 @@ static ssize_t read_vmcore(struct file *file, char __user *buffer, return acc; } +static int mmap_vmcore(struct file *file, struct vm_area_struct *vma) +{ + size_t size = vma->vm_end - vma->vm_start; + u64 start, end, len, tsz; + struct vmcore *m; + + if (!support_mmap_vmcore) + return -ENODEV; + + start = (u64)vma->vm_pgoff << PAGE_SHIFT; + end = start + size; + + if (size > vmcore_size || end > vmcore_size) + return -EINVAL; + + if (vma->vm_flags & (VM_WRITE | VM_EXEC)) + return -EPERM; + + vma->vm_flags &= ~(VM_MAYWRITE | VM_MAYEXEC); + + len = 0; + + if (start < elfcorebuf_sz) { + u64 pfn; + + tsz = elfcorebuf_sz - start; + if (size < tsz) + tsz = size; + pfn = __pa(elfcorebuf + start) >> PAGE_SHIFT; + if (remap_pfn_range(vma, vma->vm_start, pfn, tsz, + vma->vm_page_prot)) + return -EAGAIN; + size -= tsz; + start += tsz; + len += tsz; + + if (size == 0) + return 0; + } + + list_for_each_entry(m, &vmcore_list, list) { + if (start < m->offset + m->size) { + u64 pfn = 0; + + tsz = m->offset + m->size - start; + if (size < tsz) + tsz = size; + if (m->flag & MEM_TYPE_CURRENT_KERNEL) { + pfn = __pa(m->buf + start - m->offset) + >> PAGE_SHIFT; + } else { + pfn = (m->paddr + (start - m->offset)) + >> PAGE_SHIFT; + } + if (remap_pfn_range(vma, vma->vm_start + len, pfn, tsz, + vma->vm_page_prot)) { + do_munmap(vma->vm_mm, vma->vm_start, len); + return -EAGAIN; + } + size -= tsz; + start += tsz; + len += tsz; + + if (size == 0) + return 0; + } + } + + return 0; +} + static const struct file_operations proc_vmcore_operations = { .read = read_vmcore, .llseek = default_llseek, + .mmap = mmap_vmcore, }; static struct vmcore* __init get_new_element(void)
WARNING: multiple messages have this Message-ID (diff)
From: HATAYAMA Daisuke <d.hatayama@jp.fujitsu.com> To: vgoyal@redhat.com, ebiederm@xmission.com, cpw@sgi.com, kumagai-atsushi@mxc.nes.nec.co.jp, lisa.mitchell@hp.com, heiko.carstens@de.ibm.com, akpm@linux-foundation.org Cc: zhangyanfei@cn.fujitsu.com, kexec@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH v3 21/21] vmcore: introduce mmap_vmcore() Date: Sat, 16 Mar 2013 13:02:45 +0900 [thread overview] Message-ID: <20130316040245.15064.91206.stgit@localhost6.localdomain6> (raw) In-Reply-To: <20130316040003.15064.62308.stgit@localhost6.localdomain6> This patch introduces mmap_vmcore(). If flag MEM_TYPE_CURRENT_KERNEL is set, remapped is the buffer on the 2nd kernel. If not set, remapped is some area in old memory. Neither writable nor executable mapping is permitted even with mprotect(). Non-writable mapping is also requirement of remap_pfn_range() when mapping linear pages on non-consequtive physical pages; see is_cow_mapping(). On x86-32 PAE kernels, mmap() supports at most 16TB memory only. This limitation comes from the fact that the third argument of remap_pfn_range(), pfn, is of 32-bit length on x86-32: unsigned long. Signed-off-by: HATAYAMA Daisuke <d.hatayama@jp.fujitsu.com> --- fs/proc/vmcore.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 72 insertions(+), 0 deletions(-) diff --git a/fs/proc/vmcore.c b/fs/proc/vmcore.c index dd1d601..bc4848c 100644 --- a/fs/proc/vmcore.c +++ b/fs/proc/vmcore.c @@ -185,9 +185,81 @@ static ssize_t read_vmcore(struct file *file, char __user *buffer, return acc; } +static int mmap_vmcore(struct file *file, struct vm_area_struct *vma) +{ + size_t size = vma->vm_end - vma->vm_start; + u64 start, end, len, tsz; + struct vmcore *m; + + if (!support_mmap_vmcore) + return -ENODEV; + + start = (u64)vma->vm_pgoff << PAGE_SHIFT; + end = start + size; + + if (size > vmcore_size || end > vmcore_size) + return -EINVAL; + + if (vma->vm_flags & (VM_WRITE | VM_EXEC)) + return -EPERM; + + vma->vm_flags &= ~(VM_MAYWRITE | VM_MAYEXEC); + + len = 0; + + if (start < elfcorebuf_sz) { + u64 pfn; + + tsz = elfcorebuf_sz - start; + if (size < tsz) + tsz = size; + pfn = __pa(elfcorebuf + start) >> PAGE_SHIFT; + if (remap_pfn_range(vma, vma->vm_start, pfn, tsz, + vma->vm_page_prot)) + return -EAGAIN; + size -= tsz; + start += tsz; + len += tsz; + + if (size == 0) + return 0; + } + + list_for_each_entry(m, &vmcore_list, list) { + if (start < m->offset + m->size) { + u64 pfn = 0; + + tsz = m->offset + m->size - start; + if (size < tsz) + tsz = size; + if (m->flag & MEM_TYPE_CURRENT_KERNEL) { + pfn = __pa(m->buf + start - m->offset) + >> PAGE_SHIFT; + } else { + pfn = (m->paddr + (start - m->offset)) + >> PAGE_SHIFT; + } + if (remap_pfn_range(vma, vma->vm_start + len, pfn, tsz, + vma->vm_page_prot)) { + do_munmap(vma->vm_mm, vma->vm_start, len); + return -EAGAIN; + } + size -= tsz; + start += tsz; + len += tsz; + + if (size == 0) + return 0; + } + } + + return 0; +} + static const struct file_operations proc_vmcore_operations = { .read = read_vmcore, .llseek = default_llseek, + .mmap = mmap_vmcore, }; static struct vmcore* __init get_new_element(void) _______________________________________________ kexec mailing list kexec@lists.infradead.org http://lists.infradead.org/mailman/listinfo/kexec
next prev parent reply other threads:[~2013-03-19 2:32 UTC|newest] Thread overview: 152+ messages / expand[flat|nested] mbox.gz Atom feed top 2013-03-16 4:00 [PATCH v3 00/21] kdump, vmcore: support mmap() on /proc/vmcore HATAYAMA Daisuke 2013-03-16 4:00 ` HATAYAMA Daisuke 2013-03-16 4:00 ` [PATCH v3 01/21] vmcore: reference e_phoff member explicitly to get position of program header table HATAYAMA Daisuke 2013-03-16 4:00 ` HATAYAMA Daisuke 2013-03-19 21:44 ` Eric W. Biederman 2013-03-19 21:44 ` Eric W. Biederman 2013-03-21 2:50 ` HATAYAMA Daisuke 2013-03-21 2:50 ` HATAYAMA Daisuke 2013-03-21 6:11 ` Eric W. Biederman 2013-03-21 6:11 ` Eric W. Biederman 2013-03-21 14:12 ` Vivek Goyal 2013-03-21 14:12 ` Vivek Goyal 2013-03-22 0:25 ` HATAYAMA Daisuke 2013-03-22 0:25 ` HATAYAMA Daisuke 2013-03-16 4:00 ` [PATCH v3 02/21] vmcore: clean up by removing unnecessary variable HATAYAMA Daisuke 2013-03-16 4:00 ` HATAYAMA Daisuke 2013-03-16 4:01 ` [PATCH v3 03/21] vmcore: rearrange program headers without assuming consequtive PT_NOTE entries HATAYAMA Daisuke 2013-03-16 4:01 ` HATAYAMA Daisuke 2013-03-19 21:59 ` Eric W. Biederman 2013-03-19 21:59 ` Eric W. Biederman 2013-03-16 4:01 ` [PATCH v3 04/21] vmcore, sysfs: export ELF note segment size instead of vmcoreinfo data size HATAYAMA Daisuke 2013-03-16 4:01 ` HATAYAMA Daisuke 2013-03-16 4:01 ` [PATCH v3 05/21] vmcore: allocate buffer for ELF headers on page-size alignment HATAYAMA Daisuke 2013-03-16 4:01 ` HATAYAMA Daisuke 2013-03-16 4:01 ` [PATCH v3 06/21] vmcore: round up buffer size of ELF headers by PAGE_SIZE HATAYAMA Daisuke 2013-03-16 4:01 ` HATAYAMA Daisuke 2013-03-19 22:07 ` Eric W. Biederman 2013-03-19 22:07 ` Eric W. Biederman 2013-03-16 4:01 ` [PATCH v3 07/21] vmcore, procfs: introduce a flag to distinguish objects copied in 2nd kernel HATAYAMA Daisuke 2013-03-16 4:01 ` HATAYAMA Daisuke 2013-03-19 19:35 ` Andrew Morton 2013-03-19 19:35 ` Andrew Morton 2013-03-16 4:01 ` [PATCH v3 08/21] vmcore: copy non page-size aligned head and tail pages " HATAYAMA Daisuke 2013-03-16 4:01 ` HATAYAMA Daisuke 2013-03-19 19:37 ` Andrew Morton 2013-03-19 19:37 ` Andrew Morton 2013-03-19 20:59 ` Eric W. Biederman 2013-03-19 20:59 ` Eric W. Biederman 2013-03-19 21:22 ` Vivek Goyal 2013-03-19 21:22 ` Vivek Goyal 2013-03-19 23:35 ` Eric W. Biederman 2013-03-19 23:35 ` Eric W. Biederman 2013-03-16 4:01 ` [PATCH v3 09/21] vmcore: modify vmcore clean-up function to free buffer on " HATAYAMA Daisuke 2013-03-16 4:01 ` HATAYAMA Daisuke 2013-03-16 4:01 ` [PATCH v3 10/21] vmcore: clean up read_vmcore() HATAYAMA Daisuke 2013-03-16 4:01 ` HATAYAMA Daisuke 2013-03-16 4:01 ` [PATCH v3 11/21] vmcore: read buffers for vmcore objects copied from old memory HATAYAMA Daisuke 2013-03-16 4:01 ` HATAYAMA Daisuke 2013-03-16 4:01 ` [PATCH v3 12/21] vmcore: allocate per-cpu crash_notes objects on page-size boundary HATAYAMA Daisuke 2013-03-16 4:01 ` HATAYAMA Daisuke 2013-03-19 21:06 ` Eric W. Biederman 2013-03-19 21:06 ` Eric W. Biederman 2013-03-19 22:12 ` Eric W. Biederman 2013-03-19 22:12 ` Eric W. Biederman 2013-03-20 13:48 ` Vivek Goyal 2013-03-20 13:48 ` Vivek Goyal 2013-03-20 20:48 ` Eric W. Biederman 2013-03-20 20:48 ` Eric W. Biederman 2013-03-16 4:02 ` [PATCH v3 13/21] kexec: allocate vmcoreinfo note buffer " HATAYAMA Daisuke 2013-03-16 4:02 ` HATAYAMA Daisuke 2013-03-19 21:07 ` Eric W. Biederman 2013-03-19 21:07 ` Eric W. Biederman 2013-03-19 22:12 ` Eric W. Biederman 2013-03-19 22:12 ` Eric W. Biederman 2013-03-16 4:02 ` [PATCH v3 14/21] kexec, elf: introduce NT_VMCORE_DEBUGINFO note type HATAYAMA Daisuke 2013-03-16 4:02 ` HATAYAMA Daisuke 2013-03-16 4:02 ` [PATCH v3 15/21] elf: introduce NT_VMCORE_PAD type HATAYAMA Daisuke 2013-03-16 4:02 ` HATAYAMA Daisuke 2013-03-16 4:02 ` [PATCH v3 16/21] kexec: fill note buffers by NT_VMCORE_PAD notes in page-size boundary HATAYAMA Daisuke 2013-03-16 4:02 ` HATAYAMA Daisuke 2013-03-19 22:17 ` Eric W. Biederman 2013-03-19 22:17 ` Eric W. Biederman 2013-03-16 4:02 ` [PATCH v3 17/21] vmcore: check NT_VMCORE_PAD as a mark indicating the end of ELF note buffer HATAYAMA Daisuke 2013-03-16 4:02 ` HATAYAMA Daisuke 2013-03-19 21:11 ` Eric W. Biederman 2013-03-19 21:11 ` Eric W. Biederman 2013-03-21 2:59 ` HATAYAMA Daisuke 2013-03-21 2:59 ` HATAYAMA Daisuke 2013-03-21 3:54 ` Eric W. Biederman 2013-03-21 3:54 ` Eric W. Biederman 2013-03-21 14:36 ` Vivek Goyal 2013-03-21 14:36 ` Vivek Goyal 2013-03-22 0:30 ` HATAYAMA Daisuke 2013-03-22 0:30 ` HATAYAMA Daisuke 2013-03-22 0:41 ` Eric W. Biederman 2013-03-22 0:41 ` Eric W. Biederman 2013-03-19 22:20 ` Eric W. Biederman 2013-03-19 22:20 ` Eric W. Biederman 2013-03-16 4:02 ` [PATCH v3 18/21] vmcore: check if vmcore objects satify mmap()'s page-size boundary requirement HATAYAMA Daisuke 2013-03-16 4:02 ` HATAYAMA Daisuke 2013-03-19 20:02 ` Andrew Morton 2013-03-19 20:02 ` Andrew Morton 2013-03-19 21:22 ` Eric W. Biederman 2013-03-19 21:22 ` Eric W. Biederman 2013-03-20 13:51 ` Vivek Goyal 2013-03-20 13:51 ` Vivek Goyal 2013-03-19 22:38 ` Eric W. Biederman 2013-03-19 22:38 ` Eric W. Biederman 2013-03-20 13:57 ` Vivek Goyal 2013-03-20 13:57 ` Vivek Goyal 2013-03-20 20:55 ` Eric W. Biederman 2013-03-20 20:55 ` Eric W. Biederman 2013-03-21 3:25 ` HATAYAMA Daisuke 2013-03-21 3:25 ` HATAYAMA Daisuke 2013-03-21 4:18 ` Eric W. Biederman 2013-03-21 4:18 ` Eric W. Biederman 2013-03-21 6:14 ` HATAYAMA Daisuke 2013-03-21 6:14 ` HATAYAMA Daisuke 2013-03-21 6:29 ` Eric W. Biederman 2013-03-21 6:29 ` Eric W. Biederman 2013-03-21 6:46 ` HATAYAMA Daisuke 2013-03-21 6:46 ` HATAYAMA Daisuke 2013-03-21 7:07 ` Eric W. Biederman 2013-03-21 7:07 ` Eric W. Biederman 2013-03-21 15:21 ` Vivek Goyal 2013-03-21 15:21 ` Vivek Goyal 2013-03-21 15:27 ` Vivek Goyal 2013-03-21 15:27 ` Vivek Goyal 2013-03-22 0:43 ` HATAYAMA Daisuke 2013-03-22 0:43 ` HATAYAMA Daisuke 2013-03-22 0:54 ` Eric W. Biederman 2013-03-22 0:54 ` Eric W. Biederman 2013-03-22 2:30 ` HATAYAMA Daisuke 2013-03-22 2:30 ` HATAYAMA Daisuke 2013-03-21 14:57 ` Vivek Goyal 2013-03-21 14:57 ` Vivek Goyal 2013-03-21 7:22 ` Eric W. Biederman 2013-03-21 7:22 ` Eric W. Biederman 2013-03-21 14:49 ` Vivek Goyal 2013-03-21 14:49 ` Vivek Goyal 2013-03-22 7:11 ` HATAYAMA Daisuke 2013-03-22 7:11 ` HATAYAMA Daisuke 2013-03-21 13:50 ` Vivek Goyal 2013-03-21 13:50 ` Vivek Goyal 2013-03-16 4:02 ` [PATCH v3 19/21] vmcore: round-up offset of vmcore object in page-size boundary HATAYAMA Daisuke 2013-03-16 4:02 ` HATAYAMA Daisuke 2013-03-16 4:02 ` [PATCH v3 20/21] vmcore: count holes generated by round-up operation for vmcore size HATAYAMA Daisuke 2013-03-16 4:02 ` HATAYAMA Daisuke 2013-03-16 4:02 ` HATAYAMA Daisuke [this message] 2013-03-16 4:02 ` [PATCH v3 21/21] vmcore: introduce mmap_vmcore() HATAYAMA Daisuke 2013-03-19 19:30 ` [PATCH v3 00/21] kdump, vmcore: support mmap() on /proc/vmcore Andrew Morton 2013-03-19 19:30 ` Andrew Morton 2013-03-21 3:52 ` HATAYAMA Daisuke 2013-03-21 3:52 ` HATAYAMA Daisuke 2013-03-21 6:16 ` Eric W. Biederman 2013-03-21 6:16 ` Eric W. Biederman 2013-03-21 6:35 ` HATAYAMA Daisuke 2013-03-21 6:35 ` HATAYAMA Daisuke 2013-03-21 7:14 ` Eric W. Biederman 2013-03-21 7:14 ` Eric W. Biederman 2013-03-19 23:16 ` Eric W. Biederman 2013-03-19 23:16 ` Eric W. Biederman
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20130316040245.15064.91206.stgit@localhost6.localdomain6 \ --to=d.hatayama@jp.fujitsu.com \ --cc=akpm@linux-foundation.org \ --cc=cpw@sgi.com \ --cc=ebiederm@xmission.com \ --cc=heiko.carstens@de.ibm.com \ --cc=kexec@lists.infradead.org \ --cc=kumagai-atsushi@mxc.nes.nec.co.jp \ --cc=linux-kernel@vger.kernel.org \ --cc=lisa.mitchell@hp.com \ --cc=vgoyal@redhat.com \ --cc=zhangyanfei@cn.fujitsu.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.