firmware/br-ext-chip-allwinner/board/v83x/kernel/patches/00000-fs_proc_task_mmu.c.patch

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);