perf tools: Use sscanf for parsing /proc/pid/maps
When reading those files to synthesize MMAP events. It makes the code shorter and cleaner. Signed-off-by: Namhyung Kim <namhyung@kernel.org> Cc: Ingo Molnar <mingo@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Stephane Eranian <eranian@google.com> Link: http://lkml.kernel.org/r/1352643651-13891-1-git-send-email-namhyung@kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
0020ce2386
commit
6064803313
1 changed files with 28 additions and 40 deletions
|
@ -193,55 +193,43 @@ static int perf_event__synthesize_mmap_events(struct perf_tool *tool,
|
||||||
event->header.misc = PERF_RECORD_MISC_USER;
|
event->header.misc = PERF_RECORD_MISC_USER;
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
char bf[BUFSIZ], *pbf = bf;
|
char bf[BUFSIZ];
|
||||||
int n;
|
char prot[5];
|
||||||
|
char execname[PATH_MAX];
|
||||||
|
char anonstr[] = "//anon";
|
||||||
size_t size;
|
size_t size;
|
||||||
|
|
||||||
if (fgets(bf, sizeof(bf), fp) == NULL)
|
if (fgets(bf, sizeof(bf), fp) == NULL)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
/* ensure null termination since stack will be reused. */
|
||||||
|
strcpy(execname, "");
|
||||||
|
|
||||||
/* 00400000-0040c000 r-xp 00000000 fd:01 41038 /bin/cat */
|
/* 00400000-0040c000 r-xp 00000000 fd:01 41038 /bin/cat */
|
||||||
n = hex2u64(pbf, &event->mmap.start);
|
sscanf(bf, "%"PRIx64"-%"PRIx64" %s %"PRIx64" %*x:%*x %*u %s\n",
|
||||||
if (n < 0)
|
&event->mmap.start, &event->mmap.len, prot,
|
||||||
|
&event->mmap.pgoff, execname);
|
||||||
|
|
||||||
|
if (prot[2] != 'x')
|
||||||
continue;
|
continue;
|
||||||
pbf += n + 1;
|
|
||||||
n = hex2u64(pbf, &event->mmap.len);
|
|
||||||
if (n < 0)
|
|
||||||
continue;
|
|
||||||
pbf += n + 3;
|
|
||||||
if (*pbf == 'x') { /* vm_exec */
|
|
||||||
char anonstr[] = "//anon\n";
|
|
||||||
char *execname = strchr(bf, '/');
|
|
||||||
|
|
||||||
/* Catch VDSO */
|
if (!strcmp(execname, ""))
|
||||||
if (execname == NULL)
|
strcpy(execname, anonstr);
|
||||||
execname = strstr(bf, "[vdso]");
|
|
||||||
|
|
||||||
/* Catch anonymous mmaps */
|
size = strlen(execname) + 1;
|
||||||
if ((execname == NULL) && !strstr(bf, "["))
|
memcpy(event->mmap.filename, execname, size);
|
||||||
execname = anonstr;
|
size = PERF_ALIGN(size, sizeof(u64));
|
||||||
|
event->mmap.len -= event->mmap.start;
|
||||||
|
event->mmap.header.size = (sizeof(event->mmap) -
|
||||||
|
(sizeof(event->mmap.filename) - size));
|
||||||
|
memset(event->mmap.filename + size, 0, machine->id_hdr_size);
|
||||||
|
event->mmap.header.size += machine->id_hdr_size;
|
||||||
|
event->mmap.pid = tgid;
|
||||||
|
event->mmap.tid = pid;
|
||||||
|
|
||||||
if (execname == NULL)
|
if (process(tool, event, &synth_sample, machine) != 0) {
|
||||||
continue;
|
rc = -1;
|
||||||
|
break;
|
||||||
pbf += 3;
|
|
||||||
n = hex2u64(pbf, &event->mmap.pgoff);
|
|
||||||
|
|
||||||
size = strlen(execname);
|
|
||||||
execname[size - 1] = '\0'; /* Remove \n */
|
|
||||||
memcpy(event->mmap.filename, execname, size);
|
|
||||||
size = PERF_ALIGN(size, sizeof(u64));
|
|
||||||
event->mmap.len -= event->mmap.start;
|
|
||||||
event->mmap.header.size = (sizeof(event->mmap) -
|
|
||||||
(sizeof(event->mmap.filename) - size));
|
|
||||||
memset(event->mmap.filename + size, 0, machine->id_hdr_size);
|
|
||||||
event->mmap.header.size += machine->id_hdr_size;
|
|
||||||
event->mmap.pid = tgid;
|
|
||||||
event->mmap.tid = pid;
|
|
||||||
|
|
||||||
if (process(tool, event, &synth_sample, machine) != 0) {
|
|
||||||
rc = -1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue