[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <1223052415-18956-3-git-send-email-mel@csn.ul.ie>
Date: Fri, 3 Oct 2008 17:46:55 +0100
From: Mel Gorman <mel@....ul.ie>
To: akpm@...ux-foundation.org
Cc: Mel Gorman <mel@....ul.ie>, kosaki.motohiro@...fujitsu.com,
dave@...ux.vnet.ibm.com, linux-mm@...ck.org,
linux-kernel@...r.kernel.org
Subject: [PATCH 2/2] Report the pagesize backing a VMA in /proc/pid/maps
This patch adds a new field for hugepage-backed memory regions to show the
pagesize in /proc/pid/maps. While the information is available in smaps,
maps is more human-readable and does not incur the cost of calculating Pss. An
example of a /proc/self/maps output for an application using hugepages with
this patch applied is;
08048000-0804c000 r-xp 00000000 03:01 49135 /bin/cat
0804c000-0804d000 rw-p 00003000 03:01 49135 /bin/cat
08400000-08800000 rw-p 00000000 00:10 4055 /mnt/libhugetlbfs.tmp.QzPPTJ (deleted) (hpagesize=4096kB)
b7daa000-b7dab000 rw-p b7daa000 00:00 0
b7dab000-b7ed2000 r-xp 00000000 03:01 116846 /lib/tls/i686/cmov/libc-2.3.6.so
b7ed2000-b7ed7000 r--p 00127000 03:01 116846 /lib/tls/i686/cmov/libc-2.3.6.so
b7ed7000-b7ed9000 rw-p 0012c000 03:01 116846 /lib/tls/i686/cmov/libc-2.3.6.so
b7ed9000-b7edd000 rw-p b7ed9000 00:00 0
b7ee1000-b7ee8000 r-xp 00000000 03:01 49262 /root/libhugetlbfs-git/obj32/libhugetlbfs.so
b7ee8000-b7ee9000 rw-p 00006000 03:01 49262 /root/libhugetlbfs-git/obj32/libhugetlbfs.so
b7ee9000-b7eed000 rw-p b7ee9000 00:00 0
b7eed000-b7f02000 r-xp 00000000 03:01 119345 /lib/ld-2.3.6.so
b7f02000-b7f04000 rw-p 00014000 03:01 119345 /lib/ld-2.3.6.so
bf8ef000-bf903000 rwxp bffeb000 00:00 0 [stack]
bf903000-bf904000 rw-p bffff000 00:00 0
ffffe000-fffff000 r-xp 00000000 00:00 0 [vdso]
To be predictable for parsers, the patch adds the notion of reporting on VMA
attributes by appending one or more fields that look like "(attribute)". This
already happens when a file is deleted and the user sees (deleted) after the
filename. The expectation is that existing parsers will not break as those
that read the filename should be reading forward after the inode number
and stopping when it sees something that is not part of the filename.
Parsers that assume everything after / is a filename will get confused by
(hpagesize=XkB) but are already broken due to (deleted).
Signed-off-by: Mel Gorman <mel@....ul.ie>
Signed-off-by: KOSAKI Motohiro <kosaki.motohiro@...fujitsu.com>
---
fs/proc/task_mmu.c | 21 ++++++++++++++-------
1 files changed, 14 insertions(+), 7 deletions(-)
diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c
index beb884d..793633b 100644
--- a/fs/proc/task_mmu.c
+++ b/fs/proc/task_mmu.c
@@ -198,7 +198,8 @@ static int do_maps_open(struct inode *inode, struct file *file,
return ret;
}
-static void show_map_vma(struct seq_file *m, struct vm_area_struct *vma)
+static void show_map_vma(struct seq_file *m, struct vm_area_struct *vma,
+ int showattributes)
{
struct mm_struct *mm = vma->vm_mm;
struct file *file = vma->vm_file;
@@ -227,8 +228,8 @@ static void show_map_vma(struct seq_file *m, struct vm_area_struct *vma)
* Print the dentry name for named mappings, and a
* special [heap] marker for the heap:
*/
+ pad_len_spaces(m, len);
if (file) {
- pad_len_spaces(m, len);
seq_path(m, &file->f_path, "\n");
} else {
const char *name = arch_vma_name(vma);
@@ -245,11 +246,17 @@ static void show_map_vma(struct seq_file *m, struct vm_area_struct *vma)
name = "[vdso]";
}
}
- if (name) {
- pad_len_spaces(m, len);
+ if (name)
seq_puts(m, name);
- }
}
+
+ /*
+ * Print additional attributes of the VMA of interest
+ * - hugepage size if hugepage-backed
+ */
+ if (showattributes && vma->vm_flags & VM_HUGETLB)
+ seq_printf(m, " (hpagesize=%lukB)",
+ vma_kernel_pagesize(vma) >> 10);
seq_putc(m, '\n');
}
@@ -262,7 +269,7 @@ static int show_map(struct seq_file *m, void *v)
if (maps_protect && !ptrace_may_access(task, PTRACE_MODE_READ))
return -EACCES;
- show_map_vma(m, vma);
+ show_map_vma(m, vma, 1);
if (m->count < m->size) /* vma is copied successfully */
m->version = (vma != get_gate_vma(task)) ? vma->vm_start : 0;
@@ -391,7 +398,7 @@ static int show_smap(struct seq_file *m, void *v)
if (maps_protect && !ptrace_may_access(task, PTRACE_MODE_READ))
return -EACCES;
- show_map_vma(m, vma);
+ show_map_vma(m, vma, 0);
seq_printf(m,
"Size: %8lu kB\n"
--
1.5.6.5
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists