lkml.org 
[lkml]   [2019]   [Jun]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip:perf/core] perf trace: Exit when failing to build eBPF program
    Commit-ID:  012749caf9419f22636891259b664c6dd383e897
    Gitweb: https://git.kernel.org/tip/012749caf9419f22636891259b664c6dd383e897
    Author: Leo Yan <leo.yan@linaro.org>
    AuthorDate: Thu, 6 Jun 2019 10:38:59 -0300
    Committer: Arnaldo Carvalho de Melo <acme@redhat.com>
    CommitDate: Mon, 10 Jun 2019 15:49:43 -0300

    perf trace: Exit when failing to build eBPF program

    On my Juno board with ARM64 CPUs, perf trace command reports the eBPF
    program building failure but the command will not exit and continue to
    run. If we define an eBPF event in config file, the event will be
    parsed with below flow:

    perf_config()
    `> trace__config()
    `> parse_events_option()
    `> parse_events__scanner()
    `-> parse_events_parse()
    `> parse_events_load_bpf()
    `> llvm__compile_bpf()

    Though the low level functions return back error values when detect eBPF
    building failure, but parse_events_option() returns 1 for this case and
    trace__config() passes 1 to perf_config(); perf_config() doesn't treat
    the returned value 1 as failure and it continues to parse other
    configurations. Thus the perf command continues to run even without
    enabling eBPF event successfully.

    This patch changes error handling in trace__config(), when it detects
    failure it will return -1 rather than directly pass error value (1);
    finally, perf_config() will directly bail out and perf will exit for
    this case.

    Committer notes:

    Simplified the patch to just check directly the return of
    parse_events_option() and it it is non-zero, change err from its initial
    zero value to -1.

    Signed-off-by: Leo Yan <leo.yan@linaro.org>
    Cc: Adrian Hunter <adrian.hunter@intel.com>
    Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
    Cc: Alexei Starovoitov <ast@kernel.org>
    Cc: Daniel Borkmann <daniel@iogearbox.net>
    Cc: Jiri Olsa <jolsa@redhat.com>
    Cc: Martin KaFai Lau <kafai@fb.com>
    Cc: Mathieu Poirier <mathieu.poirier@linaro.org>
    Cc: Mike Leach <mike.leach@linaro.org>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Song Liu <songliubraving@fb.com>
    Cc: Suzuki Poulouse <suzuki.poulose@arm.com>
    Cc: Yonghong Song <yhs@fb.com>
    Fixes: ac96287cae08 ("perf trace: Allow specifying a set of events to add in perfconfig")
    Link: https://lkml.kernel.org/n/tip-x4i63f5kscykfok0hqim3zma@git.kernel.org
    Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
    ---
    tools/perf/builtin-trace.c | 7 ++++++-
    1 file changed, 6 insertions(+), 1 deletion(-)

    diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c
    index f7e4e50bddbd..1a2a605cf068 100644
    --- a/tools/perf/builtin-trace.c
    +++ b/tools/perf/builtin-trace.c
    @@ -3703,7 +3703,12 @@ static int trace__config(const char *var, const char *value, void *arg)
    struct option o = OPT_CALLBACK('e', "event", &trace->evlist, "event",
    "event selector. use 'perf list' to list available events",
    parse_events_option);
    - err = parse_events_option(&o, value, 0);
    + /*
    + * We can't propagate parse_event_option() return, as it is 1
    + * for failure while perf_config() expects -1.
    + */
    + if (parse_events_option(&o, value, 0))
    + err = -1;
    } else if (!strcmp(var, "trace.show_timestamp")) {
    trace->show_tstamp = perf_config_bool(var, value);
    } else if (!strcmp(var, "trace.show_duration")) {
    \
     
     \ /
      Last update: 2019-06-17 21:19    [W:4.596 / U:0.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site