All of lore.kernel.org
 help / color / mirror / Atom feed
* [RFC] perf tools: Add hugetlbfs memory recognition
@ 2015-06-27  8:49 Hou Pengyang
  2015-06-27  9:08 ` Hou Pengyang
  0 siblings, 1 reply; 8+ messages in thread
From: Hou Pengyang @ 2015-06-27  8:49 UTC (permalink / raw)
  To: acme, mingo, namhyung, a.p.zijlstra; +Cc: wangnan0, linux-kernel, zhu.wen-jie

Maps for JIT is helpful for symbols-parsing for anon-executable-memory.
What we need to do is to add (START, SIZE, symbolname) to /tmp/perf-%d.map
(%d = pid of process), and perf would parse symbol located in this area
according to /tmp/perf-%d.map. It works well for normal mmap.

However, when we alloc such memory from hugetlbfs by the following code:

......

    fd = open("/mnt/huge/hugepagefile", O_CREAT | O_RDWR, 0755);
    if (fd < 0) {
        perror("Open failed");
        exit(1);
    }   
    addr = mmap(ADDR, LENGTH, PROT_READ | PROT_WRITE |     \   
        PROT_EXEC, MAP_SHARED, fd, 0); 

......
where hugetlbfs is mounted in /mnt/huge. Symbols could not be parsed correctly:

#perf report
   86.96%     0.00%  hugepage-mmap  hugepagefile      [.] 0xffffffe00000005c      
   86.96%     0.00%  hugepage-mmap  hugepagefile      [.] 0xffffffe0000000ac

This is because such mmap area's file backed is "/mnt/huge/hugepagefile", a node 
in pseudo filesystem, it is useless for symbol-parsing. so wo had better recognize 
such hugetlbfs area, and rename it's filename to /tmp/perf-%d.map, just as anon-memory
and no_dso_memory do. 

This patch imports a new function named is_hugetlb_memory to check if this memory
is from hugetlbfs. If true, change its name.  

After this patch:
#perf report 
   86.96%     0.00%  hugepage-mmap  perf-182.map        [.] 0x000000200000005c 
   86.96%     0.00%  hugepage-mmap  perf-182.map        [.] 0x00000020000000ac

We can add maps info to perf-182.map for further symbols-parsing.

Signed-off-by: Hou Pengyang <houpengyang@huawei.com>
---
 tools/perf/util/map.c | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/tools/perf/util/map.c b/tools/perf/util/map.c
index b5a5e9c..796db08 100644
--- a/tools/perf/util/map.c
+++ b/tools/perf/util/map.c
@@ -15,6 +15,7 @@
 #include "debug.h"
 #include "machine.h"
 #include <linux/string.h>
+#include <sys/mman.h>
 
 static void __maps__insert(struct maps *maps, struct map *map);
 
@@ -43,6 +44,11 @@ static inline int is_android_lib(const char *filename)
 	       !strncmp(filename, "/system/lib", 11);
 }
 
+static inline int is_hugetlb_memory(u32 flags)
+{
+	return flags & MAP_HUGETLB;
+}
+
 static inline bool replace_android_lib(const char *filename, char *newfilename)
 {
 	const char *libname;
@@ -151,12 +157,13 @@ struct map *map__new(struct machine *machine, u64 start, u64 len,
 	if (map != NULL) {
 		char newfilename[PATH_MAX];
 		struct dso *dso;
-		int anon, no_dso, vdso, android;
+		int anon, no_dso, vdso, android, hugetlb;
 
 		android = is_android_lib(filename);
 		anon = is_anon_memory(filename);
 		vdso = is_vdso_map(filename);
 		no_dso = is_no_dso_memory(filename);
+		hugetlb = is_hugetlb_memory(flags);
 
 		map->maj = d_maj;
 		map->min = d_min;
@@ -165,7 +172,7 @@ struct map *map__new(struct machine *machine, u64 start, u64 len,
 		map->prot = prot;
 		map->flags = flags;
 
-		if ((anon || no_dso) && type == MAP__FUNCTION) {
+		if ((anon || no_dso || hugetlb) && type == MAP__FUNCTION) {
 			snprintf(newfilename, sizeof(newfilename), "/tmp/perf-%d.map", pid);
 			filename = newfilename;
 		}
-- 
1.8.3.4


^ permalink raw reply related	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2015-07-03 15:17 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-06-27  8:49 [RFC] perf tools: Add hugetlbfs memory recognition Hou Pengyang
2015-06-27  9:08 ` Hou Pengyang
2015-06-29 13:23   ` Arnaldo Carvalho de Melo
2015-06-29 13:42     ` Arnaldo Carvalho de Melo
2015-06-30  9:33       ` Hou Pengyang
2015-06-30 14:50         ` Arnaldo Carvalho de Melo
2015-07-03 10:21           ` Hou Pengyang
2015-07-03 15:16             ` Arnaldo Carvalho de Melo

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.