aboutsummaryrefslogtreecommitdiff
path: root/fs/proc/task_mmu.c
diff options
context:
space:
mode:
authorAmit Pundir <amit.pundir@linaro.org>2016-02-18 00:20:12 +0530
committerAmit Pundir <amit.pundir@linaro.org>2016-02-18 00:20:12 +0530
commit02bbd06e489a9f56910973535152d3ec47f3fdcc (patch)
tree93a9a4d687da4d423c92cc4a82001f3792c0b259 /fs/proc/task_mmu.c
parent34f6d2c9d12a97271d55c7b204443b2da9e6c29e (diff)
parent3d0f8b944b0ab4ec79d8d0b93d8038971095337a (diff)
Merge branch 'android-4.4' of https://android.googlesource.com/kernel/commonlsk-v4.4-16.02-android
* android-4.4: (475 commits) android: base-cfg: Add CONFIG_IP_MULTICAST android: recommended.cfg: enable taskstats ANDROID: android: base-cfg: disable CONFIG_SYSVIPC android: configs: base: enable configfs gadget functions android: add CONFIG_DEBUG_RODATA to recommended config android: configs: remove CONFIG_BATTERY_ANDROID=y android: configs: base: enable IPV6 android: configs: Enable SELinux and its dependencies. android: base-cfg: disable ALARM_DEV android: base-cfg: turn off /dev/mem and /dev/kmem android: base-cfg: enable ARMV8_DEPRECATED and subfeatures android: base-cfg: enforce the needed XFRM_MODE_TUNNEL (for VPN) android: base-cfg: disable LOGGER android: base-cfg: enable DM_VERITY (used for secureboot) android: configs: add systrace support to recommended configs android: configs: update 3.10 options android: configs: Add CONFIG_NETFILTER_XT_TARGET_IDLETIMER android: configs: add IPV6 ROUTE INFO android: configs: add TIMER_STATS back, helps with sysrq t. android: configs: Add HIDRAW to recommended set ...
Diffstat (limited to 'fs/proc/task_mmu.c')
-rw-r--r--fs/proc/task_mmu.c62
1 files changed, 62 insertions, 0 deletions
diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c
index 187b3b5f242e..91698054b965 100644
--- a/fs/proc/task_mmu.c
+++ b/fs/proc/task_mmu.c
@@ -116,6 +116,56 @@ static void release_task_mempolicy(struct proc_maps_private *priv)
}
#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(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, ']');
+}
+
static void vma_stop(struct proc_maps_private *priv)
{
struct mm_struct *mm = priv->mm;
@@ -351,6 +401,12 @@ show_map_vma(struct seq_file *m, struct vm_area_struct *vma, int is_pid)
seq_pad(m, ' ');
seq_printf(m, "[stack:%d]", tid);
}
+ goto done;
+ }
+
+ if (vma_get_anon_name(vma)) {
+ seq_pad(m, ' ');
+ seq_print_vma_name(m, vma);
}
}
@@ -676,6 +732,12 @@ static int show_smap(struct seq_file *m, void *v, int is_pid)
show_map_vma(m, vma, is_pid);
+ if (vma_get_anon_name(vma)) {
+ seq_puts(m, "Name: ");
+ seq_print_vma_name(m, vma);
+ seq_putc(m, '\n');
+ }
+
seq_printf(m,
"Size: %8lu kB\n"
"Rss: %8lu kB\n"