On Sun, Jul 14, 2013 at 7:17 AM, Oleg Nesterov <oleg@xxxxxxxxxx> wrote: > On 07/11, Colin Cross wrote: >> >> +static void seq_print_vma_name(struct seq_file *m, struct vm_area_struct *vma) >> +{ >> + const char __user *name = vma_get_anon_name(vma); >> + struct mm_struct *mm = vma->vm_mm; >> + >> + unsigned long page_start_vaddr; >> + unsigned long page_offset; >> + unsigned long num_pages; >> + unsigned long max_len = NAME_MAX; >> + int i; >> + >> + page_start_vaddr = (unsigned long)name & PAGE_MASK; >> + page_offset = (unsigned long)name - page_start_vaddr; >> + num_pages = DIV_ROUND_UP(page_offset + max_len, PAGE_SIZE); >> + >> + seq_puts(m, "[anon:"); >> + >> + for (i = 0; i < num_pages; i++) { >> + int len; >> + int write_len; >> + const char *kaddr; >> + long pages_pinned; >> + struct page *page; >> + >> + pages_pinned = get_user_pages(current, mm, page_start_vaddr, >> + 1, 0, 0, &page, NULL); >> + if (pages_pinned < 1) { >> + seq_puts(m, "<fault>]"); >> + return; >> + } >> + >> + kaddr = (const char *)kmap(page); >> + len = min(max_len, PAGE_SIZE - page_offset); >> + write_len = strnlen(kaddr + page_offset, len); >> + seq_write(m, kaddr + page_offset, write_len); >> + kunmap(page); >> + put_page(page); >> + >> + /* if strnlen hit a null terminator then we're done */ >> + if (write_len != len) >> + break; >> + >> + max_len -= len; >> + page_offset = 0; >> + page_start_vaddr += PAGE_SIZE; >> + } >> + >> + seq_putc(m, ']'); >> +} > > Again, sorry if this was already discussed... > > But for what? This moves the policy into the kernel and afaics buys nothing. > Can't it simply print the number? > > If an application reads its own /proc/pid/maps, surely it knows how it should > interpret the numeric values. > > If another process reads this file, and if it assumes that this number is a > pointer into that task's memory, it can do sys_process_vm_readv() ? I think there is value in keeping /proc/pid/maps human readable. A userspace tool could certainly put together the same information, but there would be no easy way to do it from the command line. -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>