mirror of
https://github.com/torvalds/linux.git
synced 2026-07-27 01:32:21 +02:00
perf test cs-etm: Remove unused Coresight workloads
These are now unused and had various issues like not working with out of source builds and being slow to compile. Delete them. Signed-off-by: James Clark <james.clark@linaro.org> Tested-by: Leo Yan <leo.yan@arm.com> Cc: Amir Ayupov <aaupov@meta.com> Cc: Ian Rogers <irogers@google.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Jonathan Corbet <corbet@lwn.net> Cc: Mike Leach <mike.leach@arm.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Paschalis Mpeis <Paschalis.Mpeis@arm.com> Cc: Shuah Khan <skhan@linuxfoundation.org> Cc: Suzuki Poulouse <suzuki.poulose@arm.com> Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
04d8a36625
commit
2f36f22f2b
|
|
@ -112,78 +112,6 @@ Example for triggering AUX pause and resume with PMU event::
|
|||
Perf test - Verify kernel and userspace perf CoreSight work
|
||||
-----------------------------------------------------------
|
||||
|
||||
When you run perf test, it will do a lot of self tests. Some of those
|
||||
tests will cover CoreSight (only if enabled and on ARM64). You
|
||||
generally would run perf test from the tools/perf directory in the
|
||||
kernel tree. Some tests will check some internal perf support like:
|
||||
There are a set of Perf tests for CoreSight which can be run with::
|
||||
|
||||
Check Arm CoreSight trace data recording and synthesized samples
|
||||
Check Arm SPE trace data recording and synthesized samples
|
||||
|
||||
Some others will actually use perf record and some test binaries that
|
||||
are in tests/shell/coresight and will collect traces to ensure a
|
||||
minimum level of functionality is met. The scripts that launch these
|
||||
tests are in the same directory. These will all look like:
|
||||
|
||||
CoreSight / ASM Pure Loop
|
||||
CoreSight / Memcpy 16k 10 Threads
|
||||
CoreSight / Thread Loop 10 Threads - Check TID
|
||||
etc.
|
||||
|
||||
These perf record tests will not run if the tool binaries do not exist
|
||||
in tests/shell/coresight/\*/ and will be skipped. If you do not have
|
||||
CoreSight support in hardware then either do not build perf with
|
||||
CoreSight support or remove these binaries in order to not have these
|
||||
tests fail and have them skip instead.
|
||||
|
||||
These tests will log historical results in the current working
|
||||
directory (e.g. tools/perf) and will be named stats-\*.csv like:
|
||||
|
||||
stats-asm_pure_loop-out.csv
|
||||
stats-memcpy_thread-16k_10.csv
|
||||
...
|
||||
|
||||
These statistic files log some aspects of the AUX data sections in
|
||||
the perf data output counting some numbers of certain encodings (a
|
||||
good way to know that it's working in a very simple way). One problem
|
||||
with CoreSight is that given a large enough amount of data needing to
|
||||
be logged, some of it can be lost due to the processor not waking up
|
||||
in time to read out all the data from buffers etc.. You will notice
|
||||
that the amount of data collected can vary a lot per run of perf test.
|
||||
If you wish to see how this changes over time, simply run perf test
|
||||
multiple times and all these csv files will have more and more data
|
||||
appended to it that you can later examine, graph and otherwise use to
|
||||
figure out if things have become worse or better.
|
||||
|
||||
This means sometimes these tests fail as they don't capture all the
|
||||
data needed. This is about tracking quality and amount of data
|
||||
produced over time and to see when changes to the Linux kernel improve
|
||||
quality of traces.
|
||||
|
||||
Be aware that some of these tests take quite a while to run, specifically
|
||||
in processing the perf data file and dumping contents to then examine what
|
||||
is inside.
|
||||
|
||||
You can change where these csv logs are stored by setting the
|
||||
PERF_TEST_CORESIGHT_STATDIR environment variable before running perf
|
||||
test like::
|
||||
|
||||
export PERF_TEST_CORESIGHT_STATDIR=/var/tmp
|
||||
perf test
|
||||
|
||||
They will also store resulting perf output data in the current
|
||||
directory for later inspection like::
|
||||
|
||||
perf-asm_pure_loop-out.data
|
||||
perf-memcpy_thread-16k_10.data
|
||||
...
|
||||
|
||||
You can alter where the perf data files are stored by setting the
|
||||
PERF_TEST_CORESIGHT_DATADIR environment variable such as::
|
||||
|
||||
PERF_TEST_CORESIGHT_DATADIR=/var/tmp
|
||||
perf test
|
||||
|
||||
You may wish to set these above environment variables if you wish to
|
||||
keep the output of tests outside of the current working directory for
|
||||
longer term storage and examination.
|
||||
sudo perf test coresight
|
||||
|
|
|
|||
|
|
@ -2751,7 +2751,6 @@ F: tools/perf/arch/arm/util/cs-etm.h
|
|||
F: tools/perf/arch/arm/util/pmu.c
|
||||
F: tools/perf/tests/shell/*coresight*
|
||||
F: tools/perf/tests/shell/coresight/*
|
||||
F: tools/perf/tests/shell/lib/*coresight*
|
||||
F: tools/perf/util/cs-etm-decoder/*
|
||||
F: tools/perf/util/cs-etm.*
|
||||
|
||||
|
|
|
|||
|
|
@ -512,16 +512,7 @@ arm64-sysreg-defs-clean:
|
|||
$(Q)$(MAKE) -C $(arm64_gen_sysreg_dir) O=$(arm64_gen_sysreg_outdir) \
|
||||
prefix= subdir= clean > /dev/null
|
||||
|
||||
TESTS_CORESIGHT_DIR := $(srctree)/tools/perf/tests/shell/coresight
|
||||
|
||||
tests-coresight-targets: FORCE
|
||||
$(Q)$(MAKE) -C $(TESTS_CORESIGHT_DIR)
|
||||
|
||||
tests-coresight-targets-clean:
|
||||
$(call QUIET_CLEAN, coresight)
|
||||
$(Q)$(MAKE) -C $(TESTS_CORESIGHT_DIR) O=$(OUTPUT) clean >/dev/null
|
||||
|
||||
all: shell_compatibility_test $(ALL_PROGRAMS) $(LANG_BINDINGS) $(OTHER_PROGRAMS) tests-coresight-targets
|
||||
all: shell_compatibility_test $(ALL_PROGRAMS) $(LANG_BINDINGS) $(OTHER_PROGRAMS)
|
||||
|
||||
# Create python binding output directory if not already present
|
||||
$(shell [ -d '$(OUTPUT)python' ] || mkdir -p '$(OUTPUT)python')
|
||||
|
|
@ -900,7 +891,6 @@ install-tests: all install-gtk
|
|||
$(INSTALL) tests/shell/base_report/*.txt '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/tests/shell/base_report'; \
|
||||
$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/tests/shell/coresight' ; \
|
||||
$(INSTALL) tests/shell/coresight/*.sh '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/tests/shell/coresight'
|
||||
$(Q)$(MAKE) -C tests/shell/coresight install-tests
|
||||
|
||||
install-bin: install-tools install-tests
|
||||
|
||||
|
|
@ -943,7 +933,7 @@ endif
|
|||
|
||||
clean:: $(LIBAPI)-clean $(LIBBPF)-clean $(LIBSUBCMD)-clean $(LIBSYMBOL)-clean $(LIBPERF)-clean \
|
||||
arm64-sysreg-defs-clean fixdep-clean python-clean bpf-skel-clean \
|
||||
tests-coresight-targets-clean pmu-events-clean
|
||||
pmu-events-clean
|
||||
$(call QUIET_CLEAN, core-objs) $(RM) $(LIBPERF_A) $(OUTPUT)perf-archive \
|
||||
$(OUTPUT)perf-iostat $(LANG_BINDINGS)
|
||||
$(Q)find $(or $(OUTPUT),.) -name '*.o' -delete -o -name '*.a' -delete -o \
|
||||
|
|
|
|||
|
|
@ -1,29 +0,0 @@
|
|||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
# Carsten Haitzler <carsten.haitzler@arm.com>, 2021
|
||||
include ../../../../../tools/scripts/Makefile.include
|
||||
include ../../../../../tools/scripts/Makefile.arch
|
||||
include ../../../../../tools/scripts/utilities.mak
|
||||
|
||||
SUBDIRS = \
|
||||
asm_pure_loop \
|
||||
memcpy_thread \
|
||||
thread_loop \
|
||||
unroll_loop_thread
|
||||
|
||||
all: $(SUBDIRS)
|
||||
$(SUBDIRS):
|
||||
@$(MAKE) -C $@ >/dev/null
|
||||
|
||||
INSTALLDIRS = $(SUBDIRS:%=install-%)
|
||||
|
||||
install-tests: $(INSTALLDIRS)
|
||||
$(INSTALLDIRS):
|
||||
@$(MAKE) -C $(@:install-%=%) install-tests >/dev/null
|
||||
|
||||
CLEANDIRS = $(SUBDIRS:%=clean-%)
|
||||
|
||||
clean: $(CLEANDIRS)
|
||||
$(CLEANDIRS):
|
||||
$(call QUIET_CLEAN, test-$(@:clean-%=%)) $(MAKE) -C $(@:clean-%=%) clean >/dev/null
|
||||
|
||||
.PHONY: all clean $(SUBDIRS) $(CLEANDIRS) $(INSTALLDIRS)
|
||||
|
|
@ -1,14 +0,0 @@
|
|||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
# Carsten Haitzler <carsten.haitzler@arm.com>, 2021
|
||||
|
||||
ifndef DESTDIR
|
||||
prefix ?= $(HOME)
|
||||
endif
|
||||
|
||||
DESTDIR_SQ = $(subst ','\'',$(DESTDIR))
|
||||
INSTALL = install
|
||||
INSTDIR_SUB = tests/shell/coresight
|
||||
|
||||
include ../../../../../scripts/Makefile.include
|
||||
include ../../../../../scripts/Makefile.arch
|
||||
include ../../../../../scripts/utilities.mak
|
||||
|
|
@ -1 +0,0 @@
|
|||
asm_pure_loop
|
||||
|
|
@ -1,34 +0,0 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
# Carsten Haitzler <carsten.haitzler@arm.com>, 2021
|
||||
|
||||
include ../Makefile.miniconfig
|
||||
|
||||
# Binary to produce
|
||||
BIN=asm_pure_loop
|
||||
# Any linking/libraries needed for the binary - empty if none needed
|
||||
LIB=
|
||||
|
||||
all: $(BIN)
|
||||
|
||||
$(BIN): $(BIN).S
|
||||
ifdef CORESIGHT
|
||||
ifeq ($(ARCH),arm64)
|
||||
# Build line - this is raw asm with no libc to have an always exact binary
|
||||
$(Q)$(CC) $(BIN).S -nostdlib -static -o $(BIN) $(LIB)
|
||||
endif
|
||||
endif
|
||||
|
||||
install-tests: all
|
||||
ifdef CORESIGHT
|
||||
ifeq ($(ARCH),arm64)
|
||||
# Install the test tool in the right place
|
||||
$(call QUIET_INSTALL, tests) \
|
||||
$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/$(INSTDIR_SUB)/$(BIN)'; \
|
||||
$(INSTALL) $(BIN) '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/$(INSTDIR_SUB)/$(BIN)/$(BIN)'
|
||||
endif
|
||||
endif
|
||||
|
||||
clean:
|
||||
$(Q)$(RM) -f $(BIN)
|
||||
|
||||
.PHONY: all clean install-tests
|
||||
|
|
@ -1,30 +0,0 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/* Tamas Zsoldos <tamas.zsoldos@arm.com>, 2021 */
|
||||
|
||||
.globl _start
|
||||
_start:
|
||||
mov x0, 0x0000ffff
|
||||
mov x1, xzr
|
||||
loop:
|
||||
nop
|
||||
nop
|
||||
cbnz x1, noskip
|
||||
nop
|
||||
nop
|
||||
adrp x2, skip
|
||||
add x2, x2, :lo12:skip
|
||||
br x2
|
||||
nop
|
||||
nop
|
||||
noskip:
|
||||
nop
|
||||
nop
|
||||
skip:
|
||||
sub x0, x0, 1
|
||||
cbnz x0, loop
|
||||
|
||||
mov x0, #0
|
||||
mov x8, #93 // __NR_exit syscall
|
||||
svc #0
|
||||
|
||||
.section .note.GNU-stack, "", @progbits
|
||||
|
|
@ -1 +0,0 @@
|
|||
memcpy_thread
|
||||
|
|
@ -1,33 +0,0 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
# Carsten Haitzler <carsten.haitzler@arm.com>, 2021
|
||||
include ../Makefile.miniconfig
|
||||
|
||||
# Binary to produce
|
||||
BIN=memcpy_thread
|
||||
# Any linking/libraries needed for the binary - empty if none needed
|
||||
LIB=-pthread
|
||||
|
||||
all: $(BIN)
|
||||
|
||||
$(BIN): $(BIN).c
|
||||
ifdef CORESIGHT
|
||||
ifeq ($(ARCH),arm64)
|
||||
# Build line
|
||||
$(Q)$(CC) $(BIN).c -o $(BIN) $(LIB)
|
||||
endif
|
||||
endif
|
||||
|
||||
install-tests: all
|
||||
ifdef CORESIGHT
|
||||
ifeq ($(ARCH),arm64)
|
||||
# Install the test tool in the right place
|
||||
$(call QUIET_INSTALL, tests) \
|
||||
$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/$(INSTDIR_SUB)/$(BIN)'; \
|
||||
$(INSTALL) $(BIN) '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/$(INSTDIR_SUB)/$(BIN)/$(BIN)'
|
||||
endif
|
||||
endif
|
||||
|
||||
clean:
|
||||
$(Q)$(RM) -f $(BIN)
|
||||
|
||||
.PHONY: all clean install-tests
|
||||
|
|
@ -1,80 +0,0 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
// Carsten Haitzler <carsten.haitzler@arm.com>, 2021
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include <pthread.h>
|
||||
|
||||
struct args {
|
||||
unsigned long loops;
|
||||
unsigned long size;
|
||||
pthread_t th;
|
||||
void *ret;
|
||||
};
|
||||
|
||||
static void *thrfn(void *arg)
|
||||
{
|
||||
struct args *a = arg;
|
||||
unsigned long i, len = a->loops;
|
||||
unsigned char *src, *dst;
|
||||
|
||||
src = malloc(a->size * 1024);
|
||||
dst = malloc(a->size * 1024);
|
||||
if ((!src) || (!dst)) {
|
||||
printf("ERR: Can't allocate memory\n");
|
||||
exit(1);
|
||||
}
|
||||
for (i = 0; i < len; i++)
|
||||
memcpy(dst, src, a->size * 1024);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static pthread_t new_thr(void *(*fn) (void *arg), void *arg)
|
||||
{
|
||||
pthread_t t;
|
||||
pthread_attr_t attr;
|
||||
|
||||
pthread_attr_init(&attr);
|
||||
pthread_create(&t, &attr, fn, arg);
|
||||
return t;
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
unsigned long i, len, size, thr;
|
||||
struct args args[256];
|
||||
long long v;
|
||||
|
||||
if (argc < 4) {
|
||||
printf("ERR: %s [copysize Kb] [numthreads] [numloops (hundreds)]\n", argv[0]);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
v = atoll(argv[1]);
|
||||
if ((v < 1) || (v > (1024 * 1024))) {
|
||||
printf("ERR: max memory 1GB (1048576 KB)\n");
|
||||
exit(1);
|
||||
}
|
||||
size = v;
|
||||
thr = atol(argv[2]);
|
||||
if ((thr < 1) || (thr > 256)) {
|
||||
printf("ERR: threads 1-256\n");
|
||||
exit(1);
|
||||
}
|
||||
v = atoll(argv[3]);
|
||||
if ((v < 1) || (v > 40000000000ll)) {
|
||||
printf("ERR: loops 1-40000000000 (hundreds)\n");
|
||||
exit(1);
|
||||
}
|
||||
len = v * 100;
|
||||
for (i = 0; i < thr; i++) {
|
||||
args[i].loops = len;
|
||||
args[i].size = size;
|
||||
args[i].th = new_thr(thrfn, &(args[i]));
|
||||
}
|
||||
for (i = 0; i < thr; i++)
|
||||
pthread_join(args[i].th, &(args[i].ret));
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -1 +0,0 @@
|
|||
thread_loop
|
||||
|
|
@ -1,33 +0,0 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
# Carsten Haitzler <carsten.haitzler@arm.com>, 2021
|
||||
include ../Makefile.miniconfig
|
||||
|
||||
# Binary to produce
|
||||
BIN=thread_loop
|
||||
# Any linking/libraries needed for the binary - empty if none needed
|
||||
LIB=-pthread
|
||||
|
||||
all: $(BIN)
|
||||
|
||||
$(BIN): $(BIN).c
|
||||
ifdef CORESIGHT
|
||||
ifeq ($(ARCH),arm64)
|
||||
# Build line
|
||||
$(Q)$(CC) $(BIN).c -o $(BIN) $(LIB)
|
||||
endif
|
||||
endif
|
||||
|
||||
install-tests: all
|
||||
ifdef CORESIGHT
|
||||
ifeq ($(ARCH),arm64)
|
||||
# Install the test tool in the right place
|
||||
$(call QUIET_INSTALL, tests) \
|
||||
$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/$(INSTDIR_SUB)/$(BIN)'; \
|
||||
$(INSTALL) $(BIN) '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/$(INSTDIR_SUB)/$(BIN)/$(BIN)'
|
||||
endif
|
||||
endif
|
||||
|
||||
clean:
|
||||
$(Q)$(RM) -f $(BIN)
|
||||
|
||||
.PHONY: all clean install-tests
|
||||
|
|
@ -1,85 +0,0 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
// Carsten Haitzler <carsten.haitzler@arm.com>, 2021
|
||||
|
||||
// define this for gettid()
|
||||
#define _GNU_SOURCE
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include <pthread.h>
|
||||
#include <sys/syscall.h>
|
||||
#ifndef SYS_gettid
|
||||
// gettid is 178 on arm64
|
||||
# define SYS_gettid 178
|
||||
#endif
|
||||
#define gettid() syscall(SYS_gettid)
|
||||
|
||||
struct args {
|
||||
unsigned int loops;
|
||||
pthread_t th;
|
||||
void *ret;
|
||||
};
|
||||
|
||||
static void *thrfn(void *arg)
|
||||
{
|
||||
struct args *a = arg;
|
||||
int i = 0, len = a->loops;
|
||||
|
||||
if (getenv("SHOW_TID")) {
|
||||
unsigned long long tid = gettid();
|
||||
|
||||
printf("%llu\n", tid);
|
||||
}
|
||||
asm volatile(
|
||||
"loop:\n"
|
||||
"add %w[i], %w[i], #1\n"
|
||||
"cmp %w[i], %w[len]\n"
|
||||
"blt loop\n"
|
||||
: /* out */
|
||||
: /* in */ [i] "r" (i), [len] "r" (len)
|
||||
: /* clobber */
|
||||
);
|
||||
return (void *)(long)i;
|
||||
}
|
||||
|
||||
static pthread_t new_thr(void *(*fn) (void *arg), void *arg)
|
||||
{
|
||||
pthread_t t;
|
||||
pthread_attr_t attr;
|
||||
|
||||
pthread_attr_init(&attr);
|
||||
pthread_create(&t, &attr, fn, arg);
|
||||
return t;
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
unsigned int i, len, thr;
|
||||
struct args args[256];
|
||||
|
||||
if (argc < 3) {
|
||||
printf("ERR: %s [numthreads] [numloops (millions)]\n", argv[0]);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
thr = atoi(argv[1]);
|
||||
if ((thr < 1) || (thr > 256)) {
|
||||
printf("ERR: threads 1-256\n");
|
||||
exit(1);
|
||||
}
|
||||
len = atoi(argv[2]);
|
||||
if ((len < 1) || (len > 4000)) {
|
||||
printf("ERR: max loops 4000 (millions)\n");
|
||||
exit(1);
|
||||
}
|
||||
len *= 1000000;
|
||||
for (i = 0; i < thr; i++) {
|
||||
args[i].loops = len;
|
||||
args[i].th = new_thr(thrfn, &(args[i]));
|
||||
}
|
||||
for (i = 0; i < thr; i++)
|
||||
pthread_join(args[i].th, &(args[i].ret));
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -1 +0,0 @@
|
|||
unroll_loop_thread
|
||||
|
|
@ -1,33 +0,0 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
# Carsten Haitzler <carsten.haitzler@arm.com>, 2021
|
||||
include ../Makefile.miniconfig
|
||||
|
||||
# Binary to produce
|
||||
BIN=unroll_loop_thread
|
||||
# Any linking/libraries needed for the binary - empty if none needed
|
||||
LIB=-pthread
|
||||
|
||||
all: $(BIN)
|
||||
|
||||
$(BIN): $(BIN).c
|
||||
ifdef CORESIGHT
|
||||
ifeq ($(ARCH),arm64)
|
||||
# Build line
|
||||
$(Q)$(CC) $(BIN).c -o $(BIN) $(LIB)
|
||||
endif
|
||||
endif
|
||||
|
||||
install-tests: all
|
||||
ifdef CORESIGHT
|
||||
ifeq ($(ARCH),arm64)
|
||||
# Install the test tool in the right place
|
||||
$(call QUIET_INSTALL, tests) \
|
||||
$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/$(INSTDIR_SUB)/$(BIN)'; \
|
||||
$(INSTALL) $(BIN) '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/$(INSTDIR_SUB)/$(BIN)/$(BIN)'
|
||||
endif
|
||||
endif
|
||||
|
||||
clean:
|
||||
$(Q)$(RM) -f $(BIN)
|
||||
|
||||
.PHONY: all clean install-tests
|
||||
|
|
@ -1,75 +0,0 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
// Carsten Haitzler <carsten.haitzler@arm.com>, 2021
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include <pthread.h>
|
||||
|
||||
struct args {
|
||||
pthread_t th;
|
||||
unsigned int in;
|
||||
void *ret;
|
||||
};
|
||||
|
||||
static void *thrfn(void *arg)
|
||||
{
|
||||
struct args *a = arg;
|
||||
unsigned int i, in = a->in;
|
||||
|
||||
for (i = 0; i < 10000; i++) {
|
||||
asm volatile (
|
||||
// force an unroll of thia add instruction so we can test long runs of code
|
||||
#define SNIP1 "add %w[in], %w[in], #1\n"
|
||||
// 10
|
||||
#define SNIP2 SNIP1 SNIP1 SNIP1 SNIP1 SNIP1 SNIP1 SNIP1 SNIP1 SNIP1 SNIP1
|
||||
// 100
|
||||
#define SNIP3 SNIP2 SNIP2 SNIP2 SNIP2 SNIP2 SNIP2 SNIP2 SNIP2 SNIP2 SNIP2
|
||||
// 1000
|
||||
#define SNIP4 SNIP3 SNIP3 SNIP3 SNIP3 SNIP3 SNIP3 SNIP3 SNIP3 SNIP3 SNIP3
|
||||
// 10000
|
||||
#define SNIP5 SNIP4 SNIP4 SNIP4 SNIP4 SNIP4 SNIP4 SNIP4 SNIP4 SNIP4 SNIP4
|
||||
// 100000
|
||||
SNIP5 SNIP5 SNIP5 SNIP5 SNIP5 SNIP5 SNIP5 SNIP5 SNIP5 SNIP5
|
||||
: /* out */
|
||||
: /* in */ [in] "r" (in)
|
||||
: /* clobber */
|
||||
);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static pthread_t new_thr(void *(*fn) (void *arg), void *arg)
|
||||
{
|
||||
pthread_t t;
|
||||
pthread_attr_t attr;
|
||||
|
||||
pthread_attr_init(&attr);
|
||||
pthread_create(&t, &attr, fn, arg);
|
||||
return t;
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
unsigned int i, thr;
|
||||
struct args args[256];
|
||||
|
||||
if (argc < 2) {
|
||||
printf("ERR: %s [numthreads]\n", argv[0]);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
thr = atoi(argv[1]);
|
||||
if ((thr > 256) || (thr < 1)) {
|
||||
printf("ERR: threads 1-256\n");
|
||||
exit(1);
|
||||
}
|
||||
for (i = 0; i < thr; i++) {
|
||||
args[i].in = rand();
|
||||
args[i].th = new_thr(thrfn, &(args[i]));
|
||||
}
|
||||
for (i = 0; i < thr; i++)
|
||||
pthread_join(args[i].th, &(args[i].ret));
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -1,134 +0,0 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
# Carsten Haitzler <carsten.haitzler@arm.com>, 2021
|
||||
|
||||
# This is sourced from a driver script so no need for #!/bin... etc. at the
|
||||
# top - the assumption below is that it runs as part of sourcing after the
|
||||
# test sets up some basic env vars to say what it is.
|
||||
|
||||
# This currently works with ETMv4 / ETF not any other packet types at thi
|
||||
# point. This will need changes if that changes.
|
||||
|
||||
# perf record options for the perf tests to use
|
||||
PERFRECMEM="-m ,16M"
|
||||
PERFRECOPT="$PERFRECMEM -e cs_etm//u"
|
||||
|
||||
TOOLS=$(dirname $0)
|
||||
DIR="$TOOLS/$TEST"
|
||||
BIN="$DIR/$TEST"
|
||||
# If the test tool/binary does not exist and is executable then skip the test
|
||||
if ! test -x "$BIN"; then exit 2; fi
|
||||
# If CoreSight is not available, skip the test
|
||||
perf list pmu | grep -q cs_etm || exit 2
|
||||
DATD="."
|
||||
# If the data dir env is set then make the data dir use that instead of ./
|
||||
if test -n "$PERF_TEST_CORESIGHT_DATADIR"; then
|
||||
DATD="$PERF_TEST_CORESIGHT_DATADIR";
|
||||
fi
|
||||
# If the stat dir env is set then make the data dir use that instead of ./
|
||||
STATD="."
|
||||
if test -n "$PERF_TEST_CORESIGHT_STATDIR"; then
|
||||
STATD="$PERF_TEST_CORESIGHT_STATDIR";
|
||||
fi
|
||||
|
||||
# Called if the test fails - error code 1
|
||||
err() {
|
||||
echo "$1"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Check that some statistics from our perf
|
||||
check_val_min() {
|
||||
STATF="$4"
|
||||
if test "$2" -lt "$3"; then
|
||||
echo ", FAILED" >> "$STATF"
|
||||
err "Sanity check number of $1 is too low ($2 < $3)"
|
||||
fi
|
||||
}
|
||||
|
||||
perf_dump_aux_verify() {
|
||||
# Some basic checking that the AUX chunk contains some sensible data
|
||||
# to see that we are recording something and at least a minimum
|
||||
# amount of it. We should almost always see Fn packets in just about
|
||||
# anything but certainly we will see some trace info and async
|
||||
# packets
|
||||
DUMP="$DATD/perf-tmp-aux-dump.txt"
|
||||
perf report --stdio --dump -i "$1" | \
|
||||
grep -o -e I_ATOM_F -e I_ASYNC -e I_TRACE_INFO > "$DUMP"
|
||||
# Simply count how many of these packets we find to see that we are
|
||||
# producing a reasonable amount of data - exact checks are not sane
|
||||
# as this is a lossy process where we may lose some blocks and the
|
||||
# compiler may produce different code depending on the compiler and
|
||||
# optimization options, so this is rough just to see if we're
|
||||
# either missing almost all the data or all of it
|
||||
ATOM_FX_NUM=$(grep -c I_ATOM_F "$DUMP")
|
||||
ASYNC_NUM=$(grep -c I_ASYNC "$DUMP")
|
||||
TRACE_INFO_NUM=$(grep -c I_TRACE_INFO "$DUMP")
|
||||
rm -f "$DUMP"
|
||||
|
||||
# Arguments provide minimums for a pass
|
||||
CHECK_FX_MIN="$2"
|
||||
CHECK_ASYNC_MIN="$3"
|
||||
CHECK_TRACE_INFO_MIN="$4"
|
||||
|
||||
# Write out statistics, so over time you can track results to see if
|
||||
# there is a pattern - for example we have less "noisy" results that
|
||||
# produce more consistent amounts of data each run, to see if over
|
||||
# time any techinques to minimize data loss are having an effect or
|
||||
# not
|
||||
STATF="$STATD/stats-$TEST-$DATV.csv"
|
||||
if ! test -f "$STATF"; then
|
||||
echo "ATOM Fx Count, Minimum, ASYNC Count, Minimum, TRACE INFO Count, Minimum" > "$STATF"
|
||||
fi
|
||||
echo -n "$ATOM_FX_NUM, $CHECK_FX_MIN, $ASYNC_NUM, $CHECK_ASYNC_MIN, $TRACE_INFO_NUM, $CHECK_TRACE_INFO_MIN" >> "$STATF"
|
||||
|
||||
# Actually check to see if we passed or failed.
|
||||
check_val_min "ATOM_FX" "$ATOM_FX_NUM" "$CHECK_FX_MIN" "$STATF"
|
||||
check_val_min "ASYNC" "$ASYNC_NUM" "$CHECK_ASYNC_MIN" "$STATF"
|
||||
check_val_min "TRACE_INFO" "$TRACE_INFO_NUM" "$CHECK_TRACE_INFO_MIN" "$STATF"
|
||||
echo ", Ok" >> "$STATF"
|
||||
}
|
||||
|
||||
perf_dump_aux_tid_verify() {
|
||||
# Specifically crafted test will produce a list of Tread ID's to
|
||||
# stdout that need to be checked to see that they have had trace
|
||||
# info collected in AUX blocks in the perf data. This will go
|
||||
# through all the TID's that are listed as CID=0xabcdef and see
|
||||
# that all the Thread IDs the test tool reports are in the perf
|
||||
# data AUX chunks
|
||||
|
||||
# The TID test tools will print a TID per stdout line that are being
|
||||
# tested
|
||||
TIDS=$(cat "$2")
|
||||
# Scan the perf report to find the TIDs that are actually CID in hex
|
||||
# and build a list of the ones found
|
||||
FOUND_TIDS=$(perf report --stdio --dump -i "$1" | \
|
||||
grep -o "CID=0x[0-9a-z]\+" | sed 's/CID=//g' | \
|
||||
uniq | sort | uniq)
|
||||
# No CID=xxx found - maybe your kernel is reporting these as
|
||||
# VMID=xxx so look there
|
||||
if test -z "$FOUND_TIDS"; then
|
||||
FOUND_TIDS=$(perf report --stdio --dump -i "$1" | \
|
||||
grep -o "VMID=0x[0-9a-z]\+" | sed 's/VMID=//g' | \
|
||||
uniq | sort | uniq)
|
||||
fi
|
||||
|
||||
# Iterate over the list of TIDs that the test says it has and find
|
||||
# them in the TIDs found in the perf report
|
||||
MISSING=""
|
||||
for TID2 in $TIDS; do
|
||||
FOUND=""
|
||||
for TIDHEX in $FOUND_TIDS; do
|
||||
TID=$(printf "%i" $TIDHEX)
|
||||
if test "$TID" -eq "$TID2"; then
|
||||
FOUND="y"
|
||||
break
|
||||
fi
|
||||
done
|
||||
if test -z "$FOUND"; then
|
||||
MISSING="$MISSING $TID"
|
||||
fi
|
||||
done
|
||||
if test -n "$MISSING"; then
|
||||
err "Thread IDs $MISSING not found in perf AUX data"
|
||||
fi
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user