Commit e8232f1a authored by Namhyung Kim's avatar Namhyung Kim Committed by Arnaldo Carvalho de Melo

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: default avatarNamhyung 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.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 885b5930
...@@ -28,74 +28,55 @@ __thread struct callchain_cursor callchain_cursor; ...@@ -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;
/* get the output mode */ return 0;
if (!strncmp(tok, "graph", strlen(arg))) { }
callchain_param.mode = CHAIN_GRAPH_ABS;
} else if (!strncmp(tok, "flat", strlen(arg))) {
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 */ /* try to get the output mode */
tok2 = strtok(NULL, ","); if (!strncmp(tok, "graph", strlen(tok)))
if (!tok2) callchain_param.mode = CHAIN_GRAPH_ABS;
goto setup; 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;
}
if (tok2[0] != 'c') { arg = NULL;
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;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment