The patch titled Subject: vmcore: introduce mmap_vmcore() has been added to the -mm tree. Its filename is vmcore-introduce-mmap_vmcore.patch Before you just go and hit "reply", please: a) Consider who else should be cc'ed b) Prefer to cc a suitable mailing list as well c) Ideally: find the original patch on the mailing list and do a reply-to-all to that, adding suitable additional cc's *** Remember to use Documentation/SubmitChecklist when testing your code *** The -mm tree is included into linux-next and is updated there every 3-4 working days ------------------------------------------------------ From: HATAYAMA Daisuke <d.hatayama@xxxxxxxxxxxxxx> Subject: vmcore: introduce mmap_vmcore() 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@xxxxxxxxxxxxxx> Cc: Zhang Yanfei <zhangyanfei@xxxxxxxxxxxxxx> Cc: Vivek Goyal <vgoyal@xxxxxxxxxx> Cc: "Eric W. Biederman" <ebiederm@xxxxxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> --- fs/proc/vmcore.c | 72 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) diff -puN fs/proc/vmcore.c~vmcore-introduce-mmap_vmcore fs/proc/vmcore.c --- a/fs/proc/vmcore.c~vmcore-introduce-mmap_vmcore +++ a/fs/proc/vmcore.c @@ -185,9 +185,81 @@ static ssize_t read_vmcore(struct file * 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) _ Patches currently in -mm which might be from d.hatayama@xxxxxxxxxxxxxx are vmcore-reference-e_phoff-member-explicitly-to-get-position-of-program-header-table.patch vmcore-clean-up-by-removing-unnecessary-variable.patch vmcore-rearrange-program-headers-without-assuming-consequtive-pt_note-entries.patch vmcore-sysfs-export-elf-note-segment-size-instead-of-vmcoreinfo-data-size.patch vmcore-allocate-buffer-for-elf-headers-on-page-size-alignment.patch vmcore-round-up-buffer-size-of-elf-headers-by-page_size.patch vmcore-procfs-introduce-a-flag-to-distinguish-objects-copied-in-2nd-kernel.patch vmcore-copy-non-page-size-aligned-head-and-tail-pages-in-2nd-kernel.patch vmcore-modify-vmcore-clean-up-function-to-free-buffer-on-2nd-kernel.patch vmcore-clean-up-read_vmcore.patch vmcore-read-buffers-for-vmcore-objects-copied-from-old-memory.patch vmcore-allocate-per-cpu-crash_notes-objects-on-page-size-boundary.patch kexec-allocate-vmcoreinfo-note-buffer-on-page-size-boundary.patch kexec-elf-introduce-nt_vmcore_debuginfo-note-type.patch elf-introduce-nt_vmcore_pad-type.patch kexec-fill-note-buffers-by-nt_vmcore_pad-notes-in-page-size-boundary.patch vmcore-check-nt_vmcore_pad-as-a-mark-indicating-the-end-of-elf-note-buffer.patch vmcore-check-if-vmcore-objects-satify-mmaps-page-size-boundary-requirement.patch vmcore-round-up-offset-of-vmcore-object-in-page-size-boundary.patch vmcore-count-holes-generated-by-round-up-operation-for-vmcore-size.patch vmcore-introduce-mmap_vmcore.patch -- To unsubscribe from this list: send the line "unsubscribe mm-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html