diff -drupN a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c --- a/fs/proc/task_mmu.c 2018-08-06 17:23:04.000000000 +0300 +++ b/fs/proc/task_mmu.c 2022-06-12 05:28:14.000000000 +0300 @@ -127,6 +127,56 @@ static void release_task_mempolicy(struc } #endif +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_remote(current, mm, + page_start_vaddr, 1, 0, &page, NULL); + if (pages_pinned < 1) { + seq_puts(m, "]"); + 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, ']'); +} + static void vma_stop(struct proc_maps_private *priv) { struct mm_struct *mm = priv->mm; @@ -289,6 +339,7 @@ show_map_vma(struct seq_file *m, struct unsigned long start, end; dev_t dev = 0; const char *name = NULL; + int i; if (file) { struct inode *inode = file_inode(vma->vm_file); @@ -301,8 +352,8 @@ show_map_vma(struct seq_file *m, struct start = vma->vm_start; end = vma->vm_end; - seq_setwidth(m, 25 + sizeof(void *) * 6 - 1); - seq_printf(m, "%08lx-%08lx %c%c%c%c %08llx %02x:%02x %lu ", + seq_setwidth(m, 45 + sizeof(void *) * 6 - 1); + seq_printf(m, "%08lx-%08lx %c%c%c%c %08llx %02x:%02x %lu a:%d:%s %d:", start, end, flags & VM_READ ? 'r' : '-', @@ -310,7 +361,14 @@ show_map_vma(struct seq_file *m, struct flags & VM_EXEC ? 'x' : '-', flags & VM_MAYSHARE ? 's' : 'p', pgoff, - MAJOR(dev), MINOR(dev), ino); + MAJOR(dev), MINOR(dev), ino, + vma->aw_alloc_pid, vma->aw_alloc_comm, vma->access_vma_num); + + for (i = 0; i < vma->access_vma_num; i++) { + seq_printf(m, "%d", vma->access_vma_array[i]); + if (i != (vma->access_vma_num - 1)) + seq_printf(m, "-"); + } /* * Print the dentry name for named mappings, and a @@ -341,8 +399,15 @@ show_map_vma(struct seq_file *m, struct goto done; } - if (is_stack(priv, vma)) + if (is_stack(priv, vma)) { name = "[stack]"; + goto done; + } + + if (vma_get_anon_name(vma)) { + seq_pad(m, ' '); + seq_print_vma_name(m, vma); + } } done: @@ -795,6 +860,12 @@ static int show_smap(struct seq_file *m, (vma->vm_flags & VM_LOCKED) ? (unsigned long)(mss.pss >> (10 + PSS_SHIFT)) : 0); + if (vma_get_anon_name(vma)) { + seq_puts(m, "Name: "); + seq_print_vma_name(m, vma); + seq_putc(m, '\n'); + } + arch_show_smap(m, vma); show_smap_vma_flags(m, vma); m_cache_vma(m, vma);