-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
perf record: Add ability to name registers to record
This patch modifies the -I/--int-regs option to enablepassing the name of the registers to sample on interrupt. Registers can be specified by their symbolic names. For instance on x86, --intr-regs=ax,si. The motivation is to reduce the size of the perf.data file and the overhead of sampling by only collecting the registers useful to a specific analysis. For instance, for value profiling, sampling only the registers used to passed arguements to functions. With no parameter, the --intr-regs still records all possible registers based on the architecture. To name registers, it is necessary to use the long form of the option, i.e., --intr-regs: $ perf record --intr-regs=si,di,r8,r9 ..... To record any possible registers: $ perf record -I ..... $ perf report --intr-regs ... To display the register, one can use perf report -D To list the available registers: $ perf record --intr-regs=\? available registers: AX BX CX DX SI DI BP SP IP FLAGS CS SS R8 R9 R10 R11 R12 R13 R14 R15 Signed-off-by: Stephane Eranian <eranian@google.com> Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Andi Kleen <ak@linux.intel.com> Cc: David Ahern <dsahern@gmail.com> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Kan Liang <kan.liang@intel.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Link: http://lkml.kernel.org/r/1441039273-16260-4-git-send-email-eranian@google.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
- Loading branch information
Stephane Eranian
authored and
Arnaldo Carvalho de Melo
committed
Aug 31, 2015
1 parent
c5e991e
commit bcc84ec
Showing
7 changed files
with
89 additions
and
5 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,71 @@ | ||
#include "perf.h" | ||
#include "util/util.h" | ||
#include "util/debug.h" | ||
#include "util/parse-options.h" | ||
#include "util/parse-regs-options.h" | ||
|
||
int | ||
parse_regs(const struct option *opt, const char *str, int unset) | ||
{ | ||
uint64_t *mode = (uint64_t *)opt->value; | ||
const struct sample_reg *r; | ||
char *s, *os = NULL, *p; | ||
int ret = -1; | ||
|
||
if (unset) | ||
return 0; | ||
|
||
/* | ||
* cannot set it twice | ||
*/ | ||
if (*mode) | ||
return -1; | ||
|
||
/* str may be NULL in case no arg is passed to -I */ | ||
if (str) { | ||
/* because str is read-only */ | ||
s = os = strdup(str); | ||
if (!s) | ||
return -1; | ||
|
||
for (;;) { | ||
p = strchr(s, ','); | ||
if (p) | ||
*p = '\0'; | ||
|
||
if (!strcmp(s, "?")) { | ||
fprintf(stderr, "available registers: "); | ||
for (r = sample_reg_masks; r->name; r++) { | ||
fprintf(stderr, "%s ", r->name); | ||
} | ||
fputc('\n', stderr); | ||
/* just printing available regs */ | ||
return -1; | ||
} | ||
for (r = sample_reg_masks; r->name; r++) { | ||
if (!strcasecmp(s, r->name)) | ||
break; | ||
} | ||
if (!r->name) { | ||
ui__warning("unknown register %s," | ||
" check man page\n", s); | ||
goto error; | ||
} | ||
|
||
*mode |= r->mask; | ||
|
||
if (!p) | ||
break; | ||
|
||
s = p + 1; | ||
} | ||
} | ||
ret = 0; | ||
|
||
/* default to all possible regs */ | ||
if (*mode == 0) | ||
*mode = PERF_REGS_MASK; | ||
error: | ||
free(os); | ||
return ret; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
#ifndef _PERF_PARSE_REGS_OPTIONS_H | ||
#define _PERF_PARSE_REGS_OPTIONS_H 1 | ||
struct option; | ||
int parse_regs(const struct option *opt, const char *str, int unset); | ||
#endif /* _PERF_PARSE_REGS_OPTIONS_H */ |