mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-01-11 17:10:13 +00:00
perf test: Move PERF_SAMPLE_WEIGHT_STRUCT parsing to common test
test__x86_sample_parsing is identical to test__sample_parsing except it explicitly tested PERF_SAMPLE_WEIGHT_STRUCT. Now the parsing code is common move the PERF_SAMPLE_WEIGHT_STRUCT to the common sample parsing test and remove the x86 version. Signed-off-by: Ian Rogers <irogers@google.com> Link: https://lore.kernel.org/r/20250724163302.596743-22-irogers@google.com Signed-off-by: Namhyung Kim <namhyung@kernel.org>
This commit is contained in:
parent
8882095b1d
commit
a563c9f3bb
@ -14,7 +14,6 @@ int test__insn_x86(struct test_suite *test, int subtest);
|
||||
int test__intel_pt_pkt_decoder(struct test_suite *test, int subtest);
|
||||
int test__intel_pt_hybrid_compat(struct test_suite *test, int subtest);
|
||||
int test__bp_modify(struct test_suite *test, int subtest);
|
||||
int test__x86_sample_parsing(struct test_suite *test, int subtest);
|
||||
int test__amd_ibs_via_core_pmu(struct test_suite *test, int subtest);
|
||||
int test__amd_ibs_period(struct test_suite *test, int subtest);
|
||||
int test__hybrid(struct test_suite *test, int subtest);
|
||||
|
||||
@ -2,7 +2,6 @@ perf-test-$(CONFIG_DWARF_UNWIND) += regs_load.o
|
||||
perf-test-$(CONFIG_DWARF_UNWIND) += dwarf-unwind.o
|
||||
|
||||
perf-test-y += arch-tests.o
|
||||
perf-test-y += sample-parsing.o
|
||||
perf-test-y += hybrid.o
|
||||
perf-test-$(CONFIG_AUXTRACE) += intel-pt-test.o
|
||||
ifeq ($(CONFIG_EXTRA_TESTS),y)
|
||||
|
||||
@ -23,7 +23,6 @@ struct test_suite suite__intel_pt = {
|
||||
#if defined(__x86_64__)
|
||||
DEFINE_SUITE("x86 bp modify", bp_modify);
|
||||
#endif
|
||||
DEFINE_SUITE("x86 Sample parsing", x86_sample_parsing);
|
||||
DEFINE_SUITE("AMD IBS via core pmu", amd_ibs_via_core_pmu);
|
||||
DEFINE_SUITE_EXCLUSIVE("AMD IBS sample period", amd_ibs_period);
|
||||
static struct test_case hybrid_tests[] = {
|
||||
@ -49,7 +48,6 @@ struct test_suite *arch_tests[] = {
|
||||
#if defined(__x86_64__)
|
||||
&suite__bp_modify,
|
||||
#endif
|
||||
&suite__x86_sample_parsing,
|
||||
&suite__amd_ibs_via_core_pmu,
|
||||
&suite__amd_ibs_period,
|
||||
&suite__hybrid,
|
||||
|
||||
@ -1,125 +0,0 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
#include <stdbool.h>
|
||||
#include <inttypes.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
#include "event.h"
|
||||
#include "evsel.h"
|
||||
#include "debug.h"
|
||||
#include "util/sample.h"
|
||||
#include "util/synthetic-events.h"
|
||||
|
||||
#include "tests/tests.h"
|
||||
#include "arch-tests.h"
|
||||
|
||||
#define COMP(m) do { \
|
||||
if (s1->m != s2->m) { \
|
||||
pr_debug("Samples differ at '"#m"'\n"); \
|
||||
return false; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
static bool samples_same(const struct perf_sample *s1,
|
||||
const struct perf_sample *s2,
|
||||
u64 type)
|
||||
{
|
||||
if (type & PERF_SAMPLE_WEIGHT_STRUCT) {
|
||||
COMP(ins_lat);
|
||||
COMP(weight3);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static int do_test(u64 sample_type)
|
||||
{
|
||||
struct evsel evsel = {
|
||||
.needs_swap = false,
|
||||
.core = {
|
||||
. attr = {
|
||||
.sample_type = sample_type,
|
||||
.read_format = 0,
|
||||
},
|
||||
},
|
||||
};
|
||||
union perf_event *event;
|
||||
struct perf_sample sample = {
|
||||
.weight = 101,
|
||||
.ins_lat = 102,
|
||||
.weight3 = 103,
|
||||
};
|
||||
struct perf_sample sample_out;
|
||||
size_t i, sz, bufsz;
|
||||
int err, ret = -1;
|
||||
|
||||
sz = perf_event__sample_event_size(&sample, sample_type, 0);
|
||||
bufsz = sz + 4096; /* Add a bit for overrun checking */
|
||||
event = malloc(bufsz);
|
||||
if (!event) {
|
||||
pr_debug("malloc failed\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
memset(event, 0xff, bufsz);
|
||||
event->header.type = PERF_RECORD_SAMPLE;
|
||||
event->header.misc = 0;
|
||||
event->header.size = sz;
|
||||
|
||||
err = perf_event__synthesize_sample(event, sample_type, 0, &sample);
|
||||
if (err) {
|
||||
pr_debug("%s failed for sample_type %#"PRIx64", error %d\n",
|
||||
"perf_event__synthesize_sample", sample_type, err);
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
/* The data does not contain 0xff so we use that to check the size */
|
||||
for (i = bufsz; i > 0; i--) {
|
||||
if (*(i - 1 + (u8 *)event) != 0xff)
|
||||
break;
|
||||
}
|
||||
if (i != sz) {
|
||||
pr_debug("Event size mismatch: actual %zu vs expected %zu\n",
|
||||
i, sz);
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
evsel.sample_size = __evsel__sample_size(sample_type);
|
||||
|
||||
err = evsel__parse_sample(&evsel, event, &sample_out);
|
||||
if (err) {
|
||||
pr_debug("%s failed for sample_type %#"PRIx64", error %d\n",
|
||||
"evsel__parse_sample", sample_type, err);
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
if (!samples_same(&sample, &sample_out, sample_type)) {
|
||||
pr_debug("parsing failed for sample_type %#"PRIx64"\n",
|
||||
sample_type);
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
ret = 0;
|
||||
out_free:
|
||||
free(event);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* test__x86_sample_parsing - test X86 specific sample parsing
|
||||
*
|
||||
* This function implements a test that synthesizes a sample event, parses it
|
||||
* and then checks that the parsed sample matches the original sample. If the
|
||||
* test passes %0 is returned, otherwise %-1 is returned.
|
||||
*
|
||||
* For now, the PERF_SAMPLE_WEIGHT_STRUCT is the only X86 specific sample type.
|
||||
* The test only checks the PERF_SAMPLE_WEIGHT_STRUCT type.
|
||||
*/
|
||||
int test__x86_sample_parsing(struct test_suite *test __maybe_unused, int subtest __maybe_unused)
|
||||
{
|
||||
return do_test(PERF_SAMPLE_WEIGHT_STRUCT);
|
||||
}
|
||||
@ -152,6 +152,12 @@ static bool samples_same(struct perf_sample *s1,
|
||||
if (type & PERF_SAMPLE_WEIGHT)
|
||||
COMP(weight);
|
||||
|
||||
if (type & PERF_SAMPLE_WEIGHT_STRUCT) {
|
||||
COMP(weight);
|
||||
COMP(ins_lat);
|
||||
COMP(weight3);
|
||||
}
|
||||
|
||||
if (type & PERF_SAMPLE_DATA_SRC)
|
||||
COMP(data_src);
|
||||
|
||||
@ -269,6 +275,8 @@ static int do_test(u64 sample_type, u64 sample_regs, u64 read_format)
|
||||
.cgroup = 114,
|
||||
.data_page_size = 115,
|
||||
.code_page_size = 116,
|
||||
.ins_lat = 117,
|
||||
.weight3 = 118,
|
||||
.aux_sample = {
|
||||
.size = sizeof(aux_data),
|
||||
.data = (void *)aux_data,
|
||||
@ -439,6 +447,12 @@ static int test__sample_parsing(struct test_suite *test __maybe_unused, int subt
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
sample_type = (PERF_SAMPLE_MAX - 1) & ~PERF_SAMPLE_WEIGHT_STRUCT;
|
||||
for (i = 0; i < ARRAY_SIZE(rf); i++) {
|
||||
err = do_test(sample_type, sample_regs, rf[i]);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user