lkml.org 
[lkml]   [2019]   [Nov]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v5 08/13] perf stat: Factor out open error handling
    Date
    From: Andi Kleen <ak@linux.intel.com>

    Factor out the open error handling into a separate function.
    This is useful for followon patches who need to duplicate this.

    No behavior change intended.

    Signed-off-by: Andi Kleen <ak@linux.intel.com>
    ---
    tools/perf/builtin-stat.c | 100 +++++++++++++++++++++++---------------
    1 file changed, 60 insertions(+), 40 deletions(-)

    diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c
    index c88d4e118409..1a586009e5a7 100644
    --- a/tools/perf/builtin-stat.c
    +++ b/tools/perf/builtin-stat.c
    @@ -420,6 +420,57 @@ static bool is_target_alive(struct target *_target,
    return false;
    }

    +enum counter_recovery {
    + COUNTER_SKIP,
    + COUNTER_RETRY,
    + COUNTER_FATAL,
    +};
    +
    +static enum counter_recovery stat_handle_error(struct evsel *counter)
    +{
    + char msg[BUFSIZ];
    + /*
    + * PPC returns ENXIO for HW counters until 2.6.37
    + * (behavior changed with commit b0a873e).
    + */
    + if (errno == EINVAL || errno == ENOSYS ||
    + errno == ENOENT || errno == EOPNOTSUPP ||
    + errno == ENXIO) {
    + if (verbose > 0)
    + ui__warning("%s event is not supported by the kernel.\n",
    + perf_evsel__name(counter));
    + counter->supported = false;
    +
    + if ((counter->leader != counter) ||
    + !(counter->leader->core.nr_members > 1))
    + return COUNTER_SKIP;
    + } else if (perf_evsel__fallback(counter, errno, msg, sizeof(msg))) {
    + if (verbose > 0)
    + ui__warning("%s\n", msg);
    + return COUNTER_RETRY;
    + } else if (target__has_per_thread(&target) &&
    + evsel_list->core.threads &&
    + evsel_list->core.threads->err_thread != -1) {
    + /*
    + * For global --per-thread case, skip current
    + * error thread.
    + */
    + if (!thread_map__remove(evsel_list->core.threads,
    + evsel_list->core.threads->err_thread)) {
    + evsel_list->core.threads->err_thread = -1;
    + return COUNTER_RETRY;
    + }
    + }
    +
    + perf_evsel__open_strerror(counter, &target,
    + errno, msg, sizeof(msg));
    + ui__error("%s\n", msg);
    +
    + if (child_pid != -1)
    + kill(child_pid, SIGTERM);
    + return COUNTER_FATAL;
    +}
    +
    static int __run_perf_stat(int argc, const char **argv, int run_idx)
    {
    int interval = stat_config.interval;
    @@ -469,47 +520,16 @@ static int __run_perf_stat(int argc, const char **argv, int run_idx)
    goto try_again;
    }

    - /*
    - * PPC returns ENXIO for HW counters until 2.6.37
    - * (behavior changed with commit b0a873e).
    - */
    - if (errno == EINVAL || errno == ENOSYS ||
    - errno == ENOENT || errno == EOPNOTSUPP ||
    - errno == ENXIO) {
    - if (verbose > 0)
    - ui__warning("%s event is not supported by the kernel.\n",
    - perf_evsel__name(counter));
    - counter->supported = false;
    -
    - if ((counter->leader != counter) ||
    - !(counter->leader->core.nr_members > 1))
    - continue;
    - } else if (perf_evsel__fallback(counter, errno, msg, sizeof(msg))) {
    - if (verbose > 0)
    - ui__warning("%s\n", msg);
    - goto try_again;
    - } else if (target__has_per_thread(&target) &&
    - evsel_list->core.threads &&
    - evsel_list->core.threads->err_thread != -1) {
    - /*
    - * For global --per-thread case, skip current
    - * error thread.
    - */
    - if (!thread_map__remove(evsel_list->core.threads,
    - evsel_list->core.threads->err_thread)) {
    - evsel_list->core.threads->err_thread = -1;
    - goto try_again;
    - }
    + switch (stat_handle_error(counter)) {
    + case COUNTER_FATAL:
    + return -1;
    + case COUNTER_RETRY:
    + goto try_again;
    + case COUNTER_SKIP:
    + continue;
    + default:
    + break;
    }
    -
    - perf_evsel__open_strerror(counter, &target,
    - errno, msg, sizeof(msg));
    - ui__error("%s\n", msg);
    -
    - if (child_pid != -1)
    - kill(child_pid, SIGTERM);
    -
    - return -1;
    }
    counter->supported = true;

    --
    2.23.0
    \
     
     \ /
      Last update: 2019-11-07 19:17    [W:5.254 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site