From nobody Thu Apr 2 23:54:10 2026 Received: from mail-dl1-f74.google.com (mail-dl1-f74.google.com [74.125.82.74]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 823523242B5 for ; Wed, 25 Mar 2026 18:31:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774463464; cv=none; b=UmDkGYGdjJY03bKNLwy0uqD5sW88swbCPAboCGxrlqZDdw3CwtPRilDTM2VizVUQ6ViX2ezf3I8mJH9Vp98m7aLerwLaS1bEDn302MGD5d49mxyM3qJSMGTL43H3lUzHsOCbBp0lVwcMc/4E/8fayaviLgjqMkKjCmazx9AxZBo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774463464; c=relaxed/simple; bh=0WOy2NZ8brl4GT27BE3KFiJ/dvJfyupGxapI//1TW38=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=gJtfrOW5Yb2llXjpgfkqTQ0MwTQwtY6qF/s3IyqZKbfyG4IKIu4dIbYgDWf4+goVsv5S3EiVIHlg67s3FDboSXRE2kGq6FAxdqLYDwSOOetigyuXf2S0CwIsFVlxU62pZezObuegECRiOZNMmC5z7/U6+Jkmt9a+5GFrTQ76aSQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=vz12U0Ow; arc=none smtp.client-ip=74.125.82.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="vz12U0Ow" Received: by mail-dl1-f74.google.com with SMTP id a92af1059eb24-1275c6fc58aso151126c88.0 for ; Wed, 25 Mar 2026 11:31:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1774463462; x=1775068262; darn=vger.kernel.org; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=aPgOPsAhWCfNO17xOm73Nfj9+10gwnemPMV7tmJj/Rg=; b=vz12U0OwkPgLymbAyyI2ce161cxKyDpdtlLfe1vsJxk4QJ0uGL357WzL4HdM+XiVZH +VZXM5Zvmi1cAseOxGITbj4PA+X9DNzTezbRReSLab6NgbnRIUMVpbv3vGt3ZLZRcBxV ulfu7XHr84v72snKmSnnAS3jIBiJDWWhoh9w0lVaSa/zd2tyBSF47Z1BNJ0/QkCWK1IX jyqULv3rutnjWb1RWW2XpWxITa/3qPQ1Es+Y6oUDfddv2rnBmvTaFwsgci4PlI+ZbTA/ 8T55P+xIfntNer2Ar9UL1wl1sa1BtOMilD5gbcERNLxkdAjTL2Og1X5cca9InSVNzj6Y cedQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774463462; x=1775068262; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=aPgOPsAhWCfNO17xOm73Nfj9+10gwnemPMV7tmJj/Rg=; b=hZQVc5rWdBtaHixQpE8Heonp/uzeFjGSq1MsE7bhoO3v3RK5Cis/Qd2FW47VUu67Tb h3p8hK9tbXGF95PTsJB+DTG1p+7S2P6v5pPuzTUJUwarkzzJIe9hUIu+a2eh4Ceq4I2+ B0TURlZSx6AGiZKUEpMJSmPDlUMy1mDAWthyt1U/0PkVIkVbOZibEIh+QYk75Y7evz0s 6UbM90YfWtQuoeR3w/rb//Y7JiBC0zcwz9D+n95JiuVXLsButqgBz8UuMoXjKFaibfYY StsYBsbk9IXwwTvnUa+DiJQrX2q/lH+wEZ9XojipThixeUJpHyWlbgB2C6iIx0ZlINLj gfzw== X-Forwarded-Encrypted: i=1; AJvYcCX9HkQVYSFEihPxMIcOxSRfJsA2/qiAOHnZSiVGy6takAn7wGYAGv9JvII3kCfrQAP4oqVcZCYQLzYRN+k=@vger.kernel.org X-Gm-Message-State: AOJu0Yw4/rnTrC7lwf4Wqq3mBUBvlRHTRW0TulOgF5gntDfgGz1PQoZa q3+Ks8nD3exy3majkXpZgZw++7fNw+fxLTUtX9FXKvNx3l5L3XTh4QMegRvtipvSmRwJ1dQmhZe WpTSSSOomZg== X-Received: from dlb34.prod.google.com ([2002:a05:7022:622:b0:12a:78f6:c8f6]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:7022:618b:b0:128:d715:b717 with SMTP id a92af1059eb24-12a96e5ea93mr2281132c88.13.1774463461518; Wed, 25 Mar 2026 11:31:01 -0700 (PDT) Date: Wed, 25 Mar 2026 11:30:44 -0700 In-Reply-To: <20260325183045.1229502-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260325183045.1229502-1-irogers@google.com> X-Mailer: git-send-email 2.53.0.1018.g2bb0e51243-goog Message-ID: <20260325183045.1229502-2-irogers@google.com> Subject: [PATCH v1 1/2] perf tests: Add test for uncore event sorting From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Collin Funk , Dmitrii Dolgov <9erthalion6@gmail.com>, German Gomez , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add a test for uncore event sorting matching multiple PMUs. Uncore PMUs may have a common prefix, like the PMUs uncore_imc_free_running_0 and uncore_imc_free_running_1 have a prefix of uncore_imc_free_running. Parsing an event group like "{data_read,data_write}" for those PMUs should result with two groups "{uncore_imc_free_running_0/data_read/,uncore_imc_free_running_0/data_write= /}, {uncore_imc_free_running_1/data_read/,uncore_imc_free_running_1/data_write/= }" which means the evsels need resorting as when initially parsed the evsels are ordered with mixed PMUs: "{uncore_imc_free_running_0/data_read/,uncore_imc_free_running_1/data_read/, uncore_imc_free_running_0/data_write/,uncore_imc_free_running_1/data_write/= }". Signed-off-by: Ian Rogers Tested-by: Zide Chen --- tools/perf/tests/Build | 1 + tools/perf/tests/builtin-test.c | 1 + tools/perf/tests/tests.h | 1 + tools/perf/tests/uncore-event-sorting.c | 125 ++++++++++++++++++++++++ 4 files changed, 128 insertions(+) create mode 100644 tools/perf/tests/uncore-event-sorting.c diff --git a/tools/perf/tests/Build b/tools/perf/tests/Build index c2a67ce45941..66944a4f4968 100644 --- a/tools/perf/tests/Build +++ b/tools/perf/tests/Build @@ -3,6 +3,7 @@ perf-test-y +=3D builtin-test.o perf-test-y +=3D tests-scripts.o perf-test-y +=3D parse-events.o +perf-test-y +=3D uncore-event-sorting.o perf-test-y +=3D dso-data.o perf-test-y +=3D vmlinux-kallsyms.o perf-test-y +=3D openat-syscall.o diff --git a/tools/perf/tests/builtin-test.c b/tools/perf/tests/builtin-tes= t.c index 06507066213b..f2c135891477 100644 --- a/tools/perf/tests/builtin-test.c +++ b/tools/perf/tests/builtin-test.c @@ -71,6 +71,7 @@ static struct test_suite *generic_tests[] =3D { &suite__basic_mmap, &suite__mem, &suite__parse_events, + &suite__uncore_event_sorting, &suite__expr, &suite__PERF_RECORD, &suite__pmu, diff --git a/tools/perf/tests/tests.h b/tools/perf/tests/tests.h index f5f1238d1f7f..ee00518bf36f 100644 --- a/tools/perf/tests/tests.h +++ b/tools/perf/tests/tests.h @@ -177,6 +177,7 @@ DECLARE_SUITE(sigtrap); DECLARE_SUITE(event_groups); DECLARE_SUITE(symbols); DECLARE_SUITE(util); +DECLARE_SUITE(uncore_event_sorting); DECLARE_SUITE(subcmd_help); DECLARE_SUITE(kallsyms_split); =20 diff --git a/tools/perf/tests/uncore-event-sorting.c b/tools/perf/tests/unc= ore-event-sorting.c new file mode 100644 index 000000000000..91e1a580709b --- /dev/null +++ b/tools/perf/tests/uncore-event-sorting.c @@ -0,0 +1,125 @@ +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +#include "tests.h" +#include "debug.h" +#include "parse-events.h" +#include "pmu.h" +#include "pmus.h" +#include "evlist.h" +#include + +struct match_state { + char *event1; + char *event2; +}; + +static int event_cb(void *state, struct pmu_event_info *info) +{ + struct match_state *m =3D state; + + if (!m->event1) { + m->event1 =3D strdup(info->name); + } else if (!m->event2) { + if (strcmp(m->event1, info->name)) { + m->event2 =3D strdup(info->name); + return 1; + } + } + return 0; +} + +static int test__uncore_event_sorting(struct test_suite *test __maybe_unus= ed, + int subtest __maybe_unused) +{ + struct evlist *evlist; + struct parse_events_error err; + struct evsel *evsel; + struct perf_pmu *pmu =3D NULL; + char *pmu_prefix =3D NULL; + struct match_state m =3D { NULL, NULL }; + char buf[1024]; + int ret; + + while ((pmu =3D perf_pmus__scan(pmu)) !=3D NULL) { + size_t len; + struct perf_pmu *sibling; + + if (pmu->is_core) + continue; + + len =3D pmu_name_len_no_suffix(pmu->name); + if (len =3D=3D strlen(pmu->name)) + continue; + + sibling =3D pmu; + while ((sibling =3D perf_pmus__scan(sibling)) !=3D NULL) { + if (sibling->is_core) + continue; + if (pmu_name_len_no_suffix(sibling->name) =3D=3D len && + !strncmp(pmu->name, sibling->name, len)) + break; + } + + if (!sibling) + continue; + + m.event1 =3D m.event2 =3D NULL; + perf_pmu__for_each_event(pmu, false, &m, event_cb); + + if (m.event1 && m.event2) { + pmu_prefix =3D strndup(pmu->name, len); + break; + } + free(m.event1); + } + + if (!pmu_prefix) { + pr_debug("No suitable uncore PMU found\n"); + return TEST_SKIP; + } + + evlist =3D evlist__new(); + if (!evlist) + return TEST_FAIL; + + snprintf(buf, sizeof(buf), "{%s/%s/,%s/%s/}", + pmu_prefix, m.event1, pmu_prefix, m.event2); + pr_debug("Parsing: %s\n", buf); + + parse_events_error__init(&err); + ret =3D parse_events(evlist, buf, &err); + if (ret) { + pr_debug("parse_events failed\n"); + goto out_err; + } + + TEST_ASSERT_VAL("Number of events is > 0", evlist->core.nr_entries > 0); + TEST_ASSERT_EQUAL("Number of events is a multiple of 2", evlist->core.nr_= entries % 2, 0); + + evlist__for_each_entry(evlist, evsel) { + if (evsel__is_group_leader(evsel)) { + struct evsel *next =3D evsel__next(evsel); + + TEST_ASSERT_EQUAL("Group size is 2", evsel->core.nr_members, 2); + TEST_ASSERT_VAL("PMU match", evsel->pmu =3D=3D next->pmu); + TEST_ASSERT_VAL("First event name", strstr(evsel->name, m.event1) !=3D = NULL); + TEST_ASSERT_VAL("Second event name", strstr(next->name, m.event2) !=3D = NULL); + } + } + + evlist__delete(evlist); + parse_events_error__exit(&err); + free(pmu_prefix); + free(m.event1); + free(m.event2); + return TEST_OK; + +out_err: + evlist__delete(evlist); + parse_events_error__exit(&err); + free(pmu_prefix); + free(m.event1); + free(m.event2); + return TEST_FAIL; +} + +DEFINE_SUITE("Uncore event sorting", uncore_event_sorting); --=20 2.53.0.1018.g2bb0e51243-goog From nobody Thu Apr 2 23:54:10 2026 Received: from mail-dy1-f201.google.com (mail-dy1-f201.google.com [74.125.82.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 87910335091 for ; Wed, 25 Mar 2026 18:31:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774463465; cv=none; b=eo5VdRrcYnnFaX74eLFOnmBV29ANQRnypGtKV3noYhm7RNuw75hiqXf9NDPkZJhGIOBwHlXHqX2KOQe9vNkFM88gai3BYU/0QPmpU/q87XW1MR7pcK9YTfPEBVxxUJUgA/ORi4nh5+V+auzDo/qaI44FKQVEe6D9ILW4BQiwkgc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774463465; c=relaxed/simple; bh=RxLyGj0p40q7qMnq7YnB2EZn0Eju2U32g7F/XeWxLKY=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=JXn3Ac0hct7/tOaI0wCMqX6NccUWO0YWudhTPrRtIlrl9ByN+ODBumzh4R3Dtg6+2q0rcTFUXpYPzColE675m8eifsyRWtDHBSFkPFeLpnBo0J6JUmGgRI3FveZin/mDl9aGTF0b8Rb+TEUEhwjbYLI3cvy41974MiNNEW4tk5U= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=jR6Bp4Hx; arc=none smtp.client-ip=74.125.82.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="jR6Bp4Hx" Received: by mail-dy1-f201.google.com with SMTP id 5a478bee46e88-2bdf75bc88fso155129eec.0 for ; Wed, 25 Mar 2026 11:31:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1774463464; x=1775068264; darn=vger.kernel.org; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=o8qJxJ/GHSQvGo2ujlSRyJ41ufgIK9jW7P1k0RAfVag=; b=jR6Bp4HxpZrYIOVU4mtmUffACdDE7/jBsWiYwfbJUKlUL6cfA4PnxqP8pe8jMZnMdM CzUHZLOoXK/+0ZppiaCcOy1xxmdMx8anGUsqSHzWN68d2i+vFZ3AMZ0NAZ9eLTdkzqxU G/LeP3DwuX6WI7gKn6bKaZffuEgtVZF+liEQAr8SMz80j6u7+uecpqcy9EHaWv17Ynkx VHuRmv+94lRiWHwObMduZXy1k6j6F7UZkHdL1Pn9Sv0I47IrMP2l8nlQRzpm/DilmTnK c2ZKmKPGCiUukMI0aWVP26RQfA3+vBYaJuBoq5Rk3LJZFbCOljrihD2kFBYVPVdgZ/wi 4wNg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774463464; x=1775068264; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=o8qJxJ/GHSQvGo2ujlSRyJ41ufgIK9jW7P1k0RAfVag=; b=Fhu0pXc5ySjz+C1NSnIFcSvXeI99upumCoJvIbBhtSqMyK0NTBeN+/iSpEIj07cK/l rw2lOaUgeOIju8RuHktI3445tbvVVXH3FYiRZjFNmJIcWOHwDekrbHY9aJIV7CJpAVKF i6b9ORpALCooVtva1nxKGNXJmbcsWCWU7qo+0V86zJqeIQyrSEssSYbnsDR1W8wIuSWV mKbgqHXhUQRxQzxyNGjw8ho3YChXt0wRMt0Wc7oKtBMW16DCVbAUTpf1vo3oJKONx2/H weYSMAXgkh8u2Ug9GhTpYn01FmNZU14XhhK8MiED9Pf2G509RF26RNeEbls+3ZzVMWHt 94kg== X-Forwarded-Encrypted: i=1; AJvYcCVYX8y+S7mwv5q9SeICtvT5WEx2CtGHqI+s259k+olq31Z10bhnJKvK2mxpHjpZco3mV6wTM4ziGvo3F+M=@vger.kernel.org X-Gm-Message-State: AOJu0YyLEzk1wvh90IcIWrSeAMTv5Qpy3BXuCjK+HYdBMegBEzyKadTL 9CujnIYvBe/4Ph+VPdHBPIU2ege23MBgOkdrStjOhECh+c3rYgCOqSzEexdZgdB6WWd7pbGRFAs bE8rDj8f7LA== X-Received: from dyz3.prod.google.com ([2002:a05:693c:4083:b0:2c0:ff82:5859]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:7300:b505:b0:2ba:a60a:15e6 with SMTP id 5a478bee46e88-2c15d3db165mr2395259eec.16.1774463463485; Wed, 25 Mar 2026 11:31:03 -0700 (PDT) Date: Wed, 25 Mar 2026 11:30:45 -0700 In-Reply-To: <20260325183045.1229502-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260325183045.1229502-1-irogers@google.com> X-Mailer: git-send-email 2.53.0.1018.g2bb0e51243-goog Message-ID: <20260325183045.1229502-3-irogers@google.com> Subject: [PATCH v1 2/2] perf arch x86 tests: Add test for topdown event sorting From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Collin Funk , Dmitrii Dolgov <9erthalion6@gmail.com>, German Gomez , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add a test to capture the comment in tools/perf/arch/x86/util/evlist.c. Test that slots and topdown-retiring get appropriately sorted with respect to instructions when they're all specified together. When the PMU requires topdown event grouping (indicated by the pressence of the slots event) metric events should be after slots, which should be the group leader. Add a related test that when the slots event isn't given it is injected into the appropriate group. Signed-off-by: Ian Rogers --- tools/perf/arch/x86/tests/topdown.c | 137 +++++++++++++++++++++++++++- 1 file changed, 136 insertions(+), 1 deletion(-) diff --git a/tools/perf/arch/x86/tests/topdown.c b/tools/perf/arch/x86/test= s/topdown.c index 3ee4e5e71be3..aca7faa16fc7 100644 --- a/tools/perf/arch/x86/tests/topdown.c +++ b/tools/perf/arch/x86/tests/topdown.c @@ -75,4 +75,139 @@ static int test__x86_topdown(struct test_suite *test __= maybe_unused, int subtest return ret; } =20 -DEFINE_SUITE("x86 topdown", x86_topdown); +static int test_sort(const char *str, int expected_slots_group_size, + int expected_instructions_group_size) +{ + struct evlist *evlist; + struct parse_events_error err; + struct evsel *evsel; + int ret; + + evlist =3D evlist__new(); + if (!evlist) + return TEST_FAIL; + + parse_events_error__init(&err); + ret =3D parse_events(evlist, str, &err); + if (ret) { + pr_debug("parse_events failed for %s\n", str); + goto out_err; + } + + evlist__for_each_entry(evlist, evsel) { + if (evsel__is_group_leader(evsel)) { + if (strstr(evsel->name, "slots")) { + /* + * Slots as a leader means the PMU is for a perf + * metric group as the slots event isn't present + * when not. + */ + TEST_ASSERT_EQUAL("slots group size", evsel->core.nr_members, + expected_slots_group_size); + if (expected_slots_group_size =3D=3D 3) { + struct evsel *next =3D evsel__next(evsel); + struct evsel *next2 =3D evsel__next(next); + + TEST_ASSERT_VAL("slots second event is instructions", + strstr(next->name, "instructions") + !=3D NULL); + TEST_ASSERT_VAL("slots third event is topdown-retiring", + strstr(next2->name, "topdown-retiring") + !=3D NULL); + } else if (expected_slots_group_size =3D=3D 2) { + struct evsel *next =3D evsel__next(evsel); + + TEST_ASSERT_VAL("slots second event is topdown-retiring", + strstr(next->name, "topdown-retiring") + !=3D NULL); + } + } else if (strstr(evsel->name, "instructions")) { + TEST_ASSERT_EQUAL("instructions group size", evsel->core.nr_members, + expected_instructions_group_size); + if (expected_instructions_group_size =3D=3D 2) { + /* + * The instructions event leads a group + * with a topdown-retiring event, + * neither of which need reordering for + * perf metric event support. + */ + struct evsel *next =3D evsel__next(evsel); + + TEST_ASSERT_VAL("instructions second event is topdown-retiring", + strstr(next->name, "topdown-retiring") + !=3D NULL); + } + } else if (strstr(evsel->name, "topdown-retiring")) { + /* + * A perf metric event where the PMU doesn't + * require slots as a leader. + */ + TEST_ASSERT_EQUAL("topdown-retiring group size", + evsel->core.nr_members, 1); + } else if (strstr(evsel->name, "cycles")) { + TEST_ASSERT_EQUAL("cycles group size", evsel->core.nr_members, 1); + } + } + } + + evlist__delete(evlist); + parse_events_error__exit(&err); + return TEST_OK; + +out_err: + evlist__delete(evlist); + parse_events_error__exit(&err); + return TEST_FAIL; +} + +static int test__x86_topdown_sorting(struct test_suite *test __maybe_unuse= d, + int subtest __maybe_unused) +{ + if (!topdown_sys_has_perf_metrics()) + return TEST_OK; + + TEST_ASSERT_EQUAL("all events in a group", + test_sort("{instructions,topdown-retiring,slots}", 3, 2), TEST_OK); + TEST_ASSERT_EQUAL("all events not in a group", + test_sort("instructions,topdown-retiring,slots", 2, 1), TEST_OK); + TEST_ASSERT_EQUAL("slots event in a group but topdown metrics events outs= ide the group", + test_sort("{instructions,slots},topdown-retiring", 2, 1), TEST_OK); + TEST_ASSERT_EQUAL("slots event and topdown metrics events in two groups", + test_sort("{instructions,slots},{topdown-retiring}", 2, 1), TEST_OK); + TEST_ASSERT_EQUAL("slots event and metrics event are not in a group and n= ot adjacent", + test_sort("{instructions,slots},cycles,topdown-retiring", 2, 1), TEST= _OK); + + return TEST_OK; +} + +static int test__x86_topdown_slots_injection(struct test_suite *test __may= be_unused, + int subtest __maybe_unused) +{ + if (!topdown_sys_has_perf_metrics()) + return TEST_OK; + + TEST_ASSERT_EQUAL("all events in a group", + test_sort("{instructions,topdown-retiring}", 3, 2), TEST_OK); + TEST_ASSERT_EQUAL("all events not in a group", + test_sort("instructions,topdown-retiring", 2, 1), TEST_OK); + TEST_ASSERT_EQUAL("event in a group but topdown metrics events outside th= e group", + test_sort("{instructions},topdown-retiring", 2, 1), TEST_OK); + TEST_ASSERT_EQUAL("event and topdown metrics events in two groups", + test_sort("{instructions},{topdown-retiring}", 2, 1), TEST_OK); + TEST_ASSERT_EQUAL("event and metrics event are not in a group and not adj= acent", + test_sort("{instructions},cycles,topdown-retiring", 2, 1), TEST_OK); + + return TEST_OK; +} + +static struct test_case x86_topdown_tests[] =3D { + TEST_CASE("topdown events", x86_topdown), + TEST_CASE("topdown sorting", x86_topdown_sorting), + TEST_CASE("topdown slots injection", x86_topdown_slots_injection), + { .name =3D NULL, } +}; + +struct test_suite suite__x86_topdown =3D { + .desc =3D "x86 topdown", + .test_cases =3D x86_topdown_tests, +}; --=20 2.53.0.1018.g2bb0e51243-goog