Re: [PATCH 4/5] perf record: Allow to specify max stack depth of fp callchain
From: Ian Rogers
Date: Thu Jun 02 2022 - 02:30:25 EST
On Tue, May 31, 2022 at 11:58 PM Namhyung Kim <namhyung@xxxxxxxxxx> wrote:
>
> Currently it has no interface to specify the max stack depth for perf
> record. Extend the command line parameter to accept a number after
> 'fp' to specify the depth like '--call-graph fp,32'.
It is valid to have call-graph=fp as a modifier on an event. To
support a depth with that we couldn't use ',' as it is already the
separator between modifiers. For consistency maybe a different
separator should be used here?
Thanks,
Ian
>
> Signed-off-by: Namhyung Kim <namhyung@xxxxxxxxxx>
> ---
> tools/perf/Documentation/perf-record.txt | 5 +++++
> tools/perf/util/callchain.c | 18 ++++++++++++------
> 2 files changed, 17 insertions(+), 6 deletions(-)
>
> diff --git a/tools/perf/Documentation/perf-record.txt b/tools/perf/Documentation/perf-record.txt
> index b4e9ef7edfef..d2759e2ccf9e 100644
> --- a/tools/perf/Documentation/perf-record.txt
> +++ b/tools/perf/Documentation/perf-record.txt
> @@ -275,6 +275,11 @@ OPTIONS
> User can change the size by passing the size after comma like
> "--call-graph dwarf,4096".
>
> + When "fp" recording is used, perf tries to save stack enties
> + up to the number specified in sysctl.kernel.perf_event_max_stack
> + by default. User can change the number by passing it after comma
> + like "--call-graph fp,32".
> +
> -q::
> --quiet::
> Don't print any message, useful for scripting.
> diff --git a/tools/perf/util/callchain.c b/tools/perf/util/callchain.c
> index 5c27a4b2e7a7..7e663673f79f 100644
> --- a/tools/perf/util/callchain.c
> +++ b/tools/perf/util/callchain.c
> @@ -31,6 +31,7 @@
> #include "callchain.h"
> #include "branch.h"
> #include "symbol.h"
> +#include "util.h"
> #include "../perf.h"
>
> #define CALLCHAIN_PARAM_DEFAULT \
> @@ -266,12 +267,17 @@ int parse_callchain_record(const char *arg, struct callchain_param *param)
> do {
> /* Framepointer style */
> if (!strncmp(name, "fp", sizeof("fp"))) {
> - if (!strtok_r(NULL, ",", &saveptr)) {
> - param->record_mode = CALLCHAIN_FP;
> - ret = 0;
> - } else
> - pr_err("callchain: No more arguments "
> - "needed for --call-graph fp\n");
> + ret = 0;
> + param->record_mode = CALLCHAIN_FP;
> +
> + tok = strtok_r(NULL, ",", &saveptr);
> + if (tok) {
> + unsigned long size;
> +
> + size = strtoul(tok, &name, 0);
> + if (size < (unsigned) sysctl__max_stack())
> + param->max_stack = size;
> + }
> break;
>
> /* Dwarf style */
> --
> 2.36.1.255.ge46751e96f-goog
>