mirror of
https://github.com/torvalds/linux.git
synced 2024-11-15 00:21:59 +00:00
perf report: Relax -g option parsing not to limit the option order
Current perf report -g/--call-graph option parser requires for option argument having following order: type,min_percent[,print_limit],order,key But sometimes it's annoying to type all even if one just wants to change the "order" or "key" setting. This patch fixes it to remove the ordering restriction so that one can use just "-g caller", for instance. The only remaining restriction is that the "print_limit" always comes after the "min_percent". Signed-off-by: Namhyung Kim <namhyung@kernel.org> Cc: Andi Kleen <andi@firstfloor.org> Cc: Arun Sharma <asharma@fb.com> Cc: David Ahern <dsahern@gmail.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Ingo Molnar <mingo@kernel.org> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Namhyung Kim <namhyung.kim@lge.com> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Rodrigo Campos <rodrigo@sdfg.com.ar> Link: http://lkml.kernel.org/r/1407996100-6359-2-git-send-email-namhyung@kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
885b5930d6
commit
e8232f1ad4
@ -28,74 +28,55 @@ __thread struct callchain_cursor callchain_cursor;
|
|||||||
int
|
int
|
||||||
parse_callchain_report_opt(const char *arg)
|
parse_callchain_report_opt(const char *arg)
|
||||||
{
|
{
|
||||||
char *tok, *tok2;
|
char *tok;
|
||||||
char *endptr;
|
char *endptr;
|
||||||
|
bool minpcnt_set = false;
|
||||||
|
|
||||||
symbol_conf.use_callchain = true;
|
symbol_conf.use_callchain = true;
|
||||||
|
|
||||||
if (!arg)
|
if (!arg)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
tok = strtok((char *)arg, ",");
|
while ((tok = strtok((char *)arg, ",")) != NULL) {
|
||||||
if (!tok)
|
if (!strncmp(tok, "none", strlen(tok))) {
|
||||||
return -1;
|
callchain_param.mode = CHAIN_NONE;
|
||||||
|
symbol_conf.use_callchain = false;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* get the output mode */
|
/* try to get the output mode */
|
||||||
if (!strncmp(tok, "graph", strlen(arg))) {
|
if (!strncmp(tok, "graph", strlen(tok)))
|
||||||
callchain_param.mode = CHAIN_GRAPH_ABS;
|
callchain_param.mode = CHAIN_GRAPH_ABS;
|
||||||
|
else if (!strncmp(tok, "flat", strlen(tok)))
|
||||||
|
callchain_param.mode = CHAIN_FLAT;
|
||||||
|
else if (!strncmp(tok, "fractal", strlen(tok)))
|
||||||
|
callchain_param.mode = CHAIN_GRAPH_REL;
|
||||||
|
/* try to get the call chain order */
|
||||||
|
else if (!strncmp(tok, "caller", strlen(tok)))
|
||||||
|
callchain_param.order = ORDER_CALLER;
|
||||||
|
else if (!strncmp(tok, "callee", strlen(tok)))
|
||||||
|
callchain_param.order = ORDER_CALLEE;
|
||||||
|
/* try to get the sort key */
|
||||||
|
else if (!strncmp(tok, "function", strlen(tok)))
|
||||||
|
callchain_param.key = CCKEY_FUNCTION;
|
||||||
|
else if (!strncmp(tok, "address", strlen(tok)))
|
||||||
|
callchain_param.key = CCKEY_ADDRESS;
|
||||||
|
/* try to get the min percent */
|
||||||
|
else if (!minpcnt_set) {
|
||||||
|
callchain_param.min_percent = strtod(tok, &endptr);
|
||||||
|
if (tok == endptr)
|
||||||
|
return -1;
|
||||||
|
minpcnt_set = true;
|
||||||
|
} else {
|
||||||
|
/* try print limit at last */
|
||||||
|
callchain_param.print_limit = strtoul(tok, &endptr, 0);
|
||||||
|
if (tok == endptr)
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
} else if (!strncmp(tok, "flat", strlen(arg))) {
|
arg = NULL;
|
||||||
callchain_param.mode = CHAIN_FLAT;
|
|
||||||
} else if (!strncmp(tok, "fractal", strlen(arg))) {
|
|
||||||
callchain_param.mode = CHAIN_GRAPH_REL;
|
|
||||||
} else if (!strncmp(tok, "none", strlen(arg))) {
|
|
||||||
callchain_param.mode = CHAIN_NONE;
|
|
||||||
symbol_conf.use_callchain = false;
|
|
||||||
return 0;
|
|
||||||
} else {
|
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* get the min percentage */
|
|
||||||
tok = strtok(NULL, ",");
|
|
||||||
if (!tok)
|
|
||||||
goto setup;
|
|
||||||
|
|
||||||
callchain_param.min_percent = strtod(tok, &endptr);
|
|
||||||
if (tok == endptr)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
/* get the print limit */
|
|
||||||
tok2 = strtok(NULL, ",");
|
|
||||||
if (!tok2)
|
|
||||||
goto setup;
|
|
||||||
|
|
||||||
if (tok2[0] != 'c') {
|
|
||||||
callchain_param.print_limit = strtoul(tok2, &endptr, 0);
|
|
||||||
tok2 = strtok(NULL, ",");
|
|
||||||
if (!tok2)
|
|
||||||
goto setup;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* get the call chain order */
|
|
||||||
if (!strncmp(tok2, "caller", strlen("caller")))
|
|
||||||
callchain_param.order = ORDER_CALLER;
|
|
||||||
else if (!strncmp(tok2, "callee", strlen("callee")))
|
|
||||||
callchain_param.order = ORDER_CALLEE;
|
|
||||||
else
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
/* Get the sort key */
|
|
||||||
tok2 = strtok(NULL, ",");
|
|
||||||
if (!tok2)
|
|
||||||
goto setup;
|
|
||||||
if (!strncmp(tok2, "function", strlen("function")))
|
|
||||||
callchain_param.key = CCKEY_FUNCTION;
|
|
||||||
else if (!strncmp(tok2, "address", strlen("address")))
|
|
||||||
callchain_param.key = CCKEY_ADDRESS;
|
|
||||||
else
|
|
||||||
return -1;
|
|
||||||
setup:
|
|
||||||
if (callchain_register_param(&callchain_param) < 0) {
|
if (callchain_register_param(&callchain_param) < 0) {
|
||||||
pr_err("Can't register callchain params\n");
|
pr_err("Can't register callchain params\n");
|
||||||
return -1;
|
return -1;
|
||||||
|
Loading…
Reference in New Issue
Block a user