mirror of https://github.com/OpenIPC/firmware.git
126 lines
3.3 KiB
Diff
126 lines
3.3 KiB
Diff
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, "<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, ']');
|
|
+}
|
|
+
|
|
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);
|