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() ? Oleg. -- 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>