lkml.org 
[lkml]   [2023]   [May]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    Subject[PATCH v5 33/34] perf pmus: Remove perf_pmus__has_hybrid
    From
    perf_pmus__has_hybrid was used to detect when there was >1 core PMU,
    this can be achieved with perf_pmus__num_core_pmus that doesn't depend
    upon is_pmu_hybrid and PMU name comparisons. When modifying the
    function calls take the opportunity to improve comments,
    enable/simplify tests that were previously failing for hybrid but now
    pass and to simplify generic code.

    Signed-off-by: Ian Rogers <irogers@google.com>
    Reviewed-by: Kan Liang <kan.liang@linux.intel.com>
    ---
    tools/perf/arch/x86/tests/hybrid.c | 2 +-
    tools/perf/arch/x86/util/evlist.c | 2 +-
    tools/perf/arch/x86/util/perf_regs.c | 2 +-
    tools/perf/builtin-record.c | 4 ++--
    tools/perf/tests/attr.c | 9 ++++++++-
    tools/perf/tests/parse-metric.c | 7 ++-----
    tools/perf/tests/switch-tracking.c | 12 +-----------
    tools/perf/tests/topology.c | 14 ++------------
    tools/perf/util/cputopo.c | 10 ++--------
    tools/perf/util/evsel.c | 2 +-
    tools/perf/util/header.c | 2 +-
    tools/perf/util/mem-events.c | 18 +++++-------------
    tools/perf/util/metricgroup.c | 2 +-
    tools/perf/util/pmus.c | 18 ------------------
    tools/perf/util/pmus.h | 1 -
    tools/perf/util/python.c | 4 ++--
    tools/perf/util/stat-display.c | 2 +-
    17 files changed, 31 insertions(+), 80 deletions(-)

    diff --git a/tools/perf/arch/x86/tests/hybrid.c b/tools/perf/arch/x86/tests/hybrid.c
    index e466735d68d5..eb152770f148 100644
    --- a/tools/perf/arch/x86/tests/hybrid.c
    +++ b/tools/perf/arch/x86/tests/hybrid.c
    @@ -281,7 +281,7 @@ static int test_events(const struct evlist_test *events, int cnt)

    int test__hybrid(struct test_suite *test __maybe_unused, int subtest __maybe_unused)
    {
    - if (!perf_pmus__has_hybrid())
    + if (perf_pmus__num_core_pmus() == 1)
    return TEST_SKIP;

    return test_events(test__hybrid_events, ARRAY_SIZE(test__hybrid_events));
    diff --git a/tools/perf/arch/x86/util/evlist.c b/tools/perf/arch/x86/util/evlist.c
    index 8a6a0b98b976..cbd582182932 100644
    --- a/tools/perf/arch/x86/util/evlist.c
    +++ b/tools/perf/arch/x86/util/evlist.c
    @@ -18,7 +18,7 @@ static int ___evlist__add_default_attrs(struct evlist *evlist,
    for (i = 0; i < nr_attrs; i++)
    event_attr_init(attrs + i);

    - if (!perf_pmus__has_hybrid())
    + if (perf_pmus__num_core_pmus() == 1)
    return evlist__add_attrs(evlist, attrs, nr_attrs);

    for (i = 0; i < nr_attrs; i++) {
    diff --git a/tools/perf/arch/x86/util/perf_regs.c b/tools/perf/arch/x86/util/perf_regs.c
    index 116384f19baf..8ad4112ad10c 100644
    --- a/tools/perf/arch/x86/util/perf_regs.c
    +++ b/tools/perf/arch/x86/util/perf_regs.c
    @@ -292,7 +292,7 @@ uint64_t arch__intr_reg_mask(void)
    */
    attr.sample_period = 1;

    - if (perf_pmus__has_hybrid()) {
    + if (perf_pmus__num_core_pmus() > 1) {
    struct perf_pmu *pmu = NULL;
    __u64 type = PERF_TYPE_RAW;

    diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
    index 4b9212f75493..aec18db7ff23 100644
    --- a/tools/perf/builtin-record.c
    +++ b/tools/perf/builtin-record.c
    @@ -1294,7 +1294,7 @@ static int record__open(struct record *rec)
    * of waiting or event synthesis.
    */
    if (opts->target.initial_delay || target__has_cpu(&opts->target) ||
    - perf_pmus__has_hybrid()) {
    + perf_pmus__num_core_pmus() > 1) {
    pos = evlist__get_tracking_event(evlist);
    if (!evsel__is_dummy_event(pos)) {
    /* Set up dummy event. */
    @@ -2193,7 +2193,7 @@ static void record__uniquify_name(struct record *rec)
    char *new_name;
    int ret;

    - if (!perf_pmus__has_hybrid())
    + if (perf_pmus__num_core_pmus() == 1)
    return;

    evlist__for_each_entry(evlist, pos) {
    diff --git a/tools/perf/tests/attr.c b/tools/perf/tests/attr.c
    index 674876e6c8e6..61186d0d1cfa 100644
    --- a/tools/perf/tests/attr.c
    +++ b/tools/perf/tests/attr.c
    @@ -185,8 +185,15 @@ static int test__attr(struct test_suite *test __maybe_unused, int subtest __mayb
    char path_dir[PATH_MAX];
    char *exec_path;

    - if (perf_pmus__has_hybrid())
    + if (perf_pmus__num_core_pmus() > 1) {
    + /*
    + * TODO: Attribute tests hard code the PMU type. If there are >1
    + * core PMU then each PMU will have a different type whic
    + * requires additional support.
    + */
    + pr_debug("Skip test on hybrid systems");
    return TEST_SKIP;
    + }

    /* First try development tree tests. */
    if (!lstat("./tests", &st))
    diff --git a/tools/perf/tests/parse-metric.c b/tools/perf/tests/parse-metric.c
    index 1d6493a5a956..2c28fb50dc24 100644
    --- a/tools/perf/tests/parse-metric.c
    +++ b/tools/perf/tests/parse-metric.c
    @@ -302,11 +302,8 @@ static int test__parse_metric(struct test_suite *test __maybe_unused, int subtes
    TEST_ASSERT_VAL("DCache_L2 failed", test_dcache_l2() == 0);
    TEST_ASSERT_VAL("recursion fail failed", test_recursion_fail() == 0);
    TEST_ASSERT_VAL("Memory bandwidth", test_memory_bandwidth() == 0);
    -
    - if (!perf_pmus__has_hybrid()) {
    - TEST_ASSERT_VAL("cache_miss_cycles failed", test_cache_miss_cycles() == 0);
    - TEST_ASSERT_VAL("test metric group", test_metric_group() == 0);
    - }
    + TEST_ASSERT_VAL("cache_miss_cycles failed", test_cache_miss_cycles() == 0);
    + TEST_ASSERT_VAL("test metric group", test_metric_group() == 0);
    return 0;
    }

    diff --git a/tools/perf/tests/switch-tracking.c b/tools/perf/tests/switch-tracking.c
    index cff6ab87b2f6..e52b031bedc5 100644
    --- a/tools/perf/tests/switch-tracking.c
    +++ b/tools/perf/tests/switch-tracking.c
    @@ -375,17 +375,7 @@ static int test__switch_tracking(struct test_suite *test __maybe_unused, int sub
    cpu_clocks_evsel = evlist__last(evlist);

    /* Second event */
    - if (perf_pmus__has_hybrid()) {
    - cycles = "cpu_core/cycles/u";
    - err = parse_event(evlist, cycles);
    - if (err) {
    - cycles = "cpu_atom/cycles/u";
    - pr_debug("Trying %s\n", cycles);
    - err = parse_event(evlist, cycles);
    - }
    - } else {
    - err = parse_event(evlist, cycles);
    - }
    + err = parse_event(evlist, cycles);
    if (err) {
    pr_debug("Failed to parse event %s\n", cycles);
    goto out_err;
    diff --git a/tools/perf/tests/topology.c b/tools/perf/tests/topology.c
    index 49e80d15420b..9dee63734e66 100644
    --- a/tools/perf/tests/topology.c
    +++ b/tools/perf/tests/topology.c
    @@ -41,18 +41,8 @@ static int session_write_header(char *path)
    session = perf_session__new(&data, NULL);
    TEST_ASSERT_VAL("can't get session", !IS_ERR(session));

    - if (!perf_pmus__has_hybrid()) {
    - session->evlist = evlist__new_default();
    - TEST_ASSERT_VAL("can't get evlist", session->evlist);
    - } else {
    - struct parse_events_error err;
    -
    - session->evlist = evlist__new();
    - TEST_ASSERT_VAL("can't get evlist", session->evlist);
    - parse_events_error__init(&err);
    - parse_events(session->evlist, "cpu_core/cycles/", &err);
    - parse_events_error__exit(&err);
    - }
    + session->evlist = evlist__new_default();
    + TEST_ASSERT_VAL("can't get evlist", session->evlist);

    perf_header__set_feat(&session->header, HEADER_CPU_TOPOLOGY);
    perf_header__set_feat(&session->header, HEADER_NRCPUS);
    diff --git a/tools/perf/util/cputopo.c b/tools/perf/util/cputopo.c
    index 729142ec9a9a..81cfc85f4668 100644
    --- a/tools/perf/util/cputopo.c
    +++ b/tools/perf/util/cputopo.c
    @@ -472,15 +472,9 @@ struct hybrid_topology *hybrid_topology__new(void)
    {
    struct perf_pmu *pmu = NULL;
    struct hybrid_topology *tp = NULL;
    - u32 nr = 0, i = 0;
    + int nr = perf_pmus__num_core_pmus(), i = 0;

    - if (!perf_pmus__has_hybrid())
    - return NULL;
    -
    - while ((pmu = perf_pmus__scan_core(pmu)) != NULL)
    - nr++;
    -
    - if (nr == 0)
    + if (nr <= 1)
    return NULL;

    tp = zalloc(sizeof(*tp) + sizeof(tp->nodes[0]) * nr);
    diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
    index b4237fc713d5..ec2ce39d66d8 100644
    --- a/tools/perf/util/evsel.c
    +++ b/tools/perf/util/evsel.c
    @@ -3140,7 +3140,7 @@ void evsel__zero_per_pkg(struct evsel *evsel)
    */
    bool evsel__is_hybrid(const struct evsel *evsel)
    {
    - if (!perf_pmus__has_hybrid())
    + if (perf_pmus__num_core_pmus() == 1)
    return false;

    return evsel->core.is_pmu_core;
    diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c
    index 2dde3ca20de5..0c69109c0a3b 100644
    --- a/tools/perf/util/header.c
    +++ b/tools/perf/util/header.c
    @@ -1605,7 +1605,7 @@ static int write_pmu_caps(struct feat_fd *ff,
    * Write hybrid pmu caps first to maintain compatibility with
    * older perf tool.
    */
    - if (perf_pmus__has_hybrid()) {
    + if (perf_pmus__num_core_pmus() > 1) {
    pmu = NULL;
    while ((pmu = perf_pmus__scan_core(pmu))) {
    ret = __write_pmu_caps(ff, pmu, true);
    diff --git a/tools/perf/util/mem-events.c b/tools/perf/util/mem-events.c
    index c5596230a308..be15aadb6b14 100644
    --- a/tools/perf/util/mem-events.c
    +++ b/tools/perf/util/mem-events.c
    @@ -121,6 +121,7 @@ int perf_mem_events__init(void)
    for (j = 0; j < PERF_MEM_EVENTS__MAX; j++) {
    struct perf_mem_event *e = perf_mem_events__ptr(j);
    char sysfs_name[100];
    + struct perf_pmu *pmu = NULL;

    /*
    * If the event entry isn't valid, skip initialization
    @@ -129,18 +130,9 @@ int perf_mem_events__init(void)
    if (!e->tag)
    continue;

    - if (!perf_pmus__has_hybrid()) {
    - scnprintf(sysfs_name, sizeof(sysfs_name),
    - e->sysfs_name, "cpu");
    - e->supported = perf_mem_event__supported(mnt, sysfs_name);
    - } else {
    - struct perf_pmu *pmu = NULL;
    -
    - while ((pmu = perf_pmus__scan_core(pmu)) != NULL) {
    - scnprintf(sysfs_name, sizeof(sysfs_name),
    - e->sysfs_name, pmu->name);
    - e->supported |= perf_mem_event__supported(mnt, sysfs_name);
    - }
    + while ((pmu = perf_pmus__scan_core(pmu)) != NULL) {
    + scnprintf(sysfs_name, sizeof(sysfs_name), e->sysfs_name, pmu->name);
    + e->supported |= perf_mem_event__supported(mnt, sysfs_name);
    }

    if (e->supported)
    @@ -196,7 +188,7 @@ int perf_mem_events__record_args(const char **rec_argv, int *argv_nr,
    if (!e->record)
    continue;

    - if (!perf_pmus__has_hybrid()) {
    + if (perf_pmus__num_core_pmus() == 1) {
    if (!e->supported) {
    pr_err("failed: event '%s' not supported\n",
    perf_mem_events__name(j, NULL));
    diff --git a/tools/perf/util/metricgroup.c b/tools/perf/util/metricgroup.c
    index 092ed6386a39..70ef2e23a710 100644
    --- a/tools/perf/util/metricgroup.c
    +++ b/tools/perf/util/metricgroup.c
    @@ -274,7 +274,7 @@ static int setup_metric_events(const char *pmu, struct hashmap *ids,
    const char *metric_id;
    struct evsel *ev;
    size_t ids_size, matched_events, i;
    - bool all_pmus = !strcmp(pmu, "all") || !perf_pmus__has_hybrid() || !is_pmu_hybrid(pmu);
    + bool all_pmus = !strcmp(pmu, "all") || perf_pmus__num_core_pmus() == 1 || !is_pmu_core(pmu);

    *out_metric_events = NULL;
    ids_size = hashmap__size(ids);
    diff --git a/tools/perf/util/pmus.c b/tools/perf/util/pmus.c
    index bf927aed162e..53f11f6ce878 100644
    --- a/tools/perf/util/pmus.c
    +++ b/tools/perf/util/pmus.c
    @@ -464,24 +464,6 @@ bool perf_pmus__have_event(const char *pname, const char *name)
    return pmu && perf_pmu__have_event(pmu, name);
    }

    -bool perf_pmus__has_hybrid(void)
    -{
    - static bool hybrid_scanned, has_hybrid;
    -
    - if (!hybrid_scanned) {
    - struct perf_pmu *pmu = NULL;
    -
    - while ((pmu = perf_pmus__scan_core(pmu)) != NULL) {
    - if (is_pmu_hybrid(pmu->name)) {
    - has_hybrid = true;
    - break;
    - }
    - }
    - hybrid_scanned = true;
    - }
    - return has_hybrid;
    -}
    -
    int perf_pmus__num_core_pmus(void)
    {
    static int count;
    diff --git a/tools/perf/util/pmus.h b/tools/perf/util/pmus.h
    index 27400a027d41..1e710720aec7 100644
    --- a/tools/perf/util/pmus.h
    +++ b/tools/perf/util/pmus.h
    @@ -18,7 +18,6 @@ const struct perf_pmu *perf_pmus__pmu_for_pmu_filter(const char *str);
    int perf_pmus__num_mem_pmus(void);
    void perf_pmus__print_pmu_events(const struct print_callbacks *print_cb, void *print_state);
    bool perf_pmus__have_event(const char *pname, const char *name);
    -bool perf_pmus__has_hybrid(void);
    int perf_pmus__num_core_pmus(void);

    #endif /* __PMUS_H */
    diff --git a/tools/perf/util/python.c b/tools/perf/util/python.c
    index 7173f6fcdc11..8de1b759bbaa 100644
    --- a/tools/perf/util/python.c
    +++ b/tools/perf/util/python.c
    @@ -103,9 +103,9 @@ int perf_pmu__scan_file(struct perf_pmu *pmu, const char *name, const char *fmt,
    return EOF;
    }

    -bool perf_pmus__has_hybrid(void)
    +int perf_pmus__num_core_pmus(void)
    {
    - return false;
    + return 1;
    }

    bool evsel__is_aux_event(const struct evsel *evsel __maybe_unused)
    diff --git a/tools/perf/util/stat-display.c b/tools/perf/util/stat-display.c
    index 7ca69151136b..a2bbdc25d979 100644
    --- a/tools/perf/util/stat-display.c
    +++ b/tools/perf/util/stat-display.c
    @@ -696,7 +696,7 @@ static bool evlist__has_hybrid(struct evlist *evlist)
    {
    struct evsel *evsel;

    - if (!perf_pmus__has_hybrid())
    + if (perf_pmus__num_core_pmus() == 1)
    return false;

    evlist__for_each_entry(evlist, evsel) {
    --
    2.41.0.rc0.172.g3f132b7071-goog
    \
     
     \ /
      Last update: 2023-05-27 09:27    [W:4.378 / U:2.192 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site