[09/12] perf test: Add 'brstack' test workload
Commit Message
The brstack is to run different kinds of branches repeatedly. This is
necessary for brstack test case to verify if it has correct branch info.
$ perf test -w brstack
I renamed the internal functions to have brstack_ prefix as it's too
generic name.
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
tools/perf/tests/builtin-test.c | 1 +
tools/perf/tests/tests.h | 1 +
tools/perf/tests/workloads/Build | 2 ++
tools/perf/tests/workloads/brstack.c | 39 ++++++++++++++++++++++++++++
4 files changed, 43 insertions(+)
create mode 100644 tools/perf/tests/workloads/brstack.c
Comments
On 10/11/2022 18:19, Namhyung Kim wrote:
[...]
> +
> +#define BENCH_RUNS 999999
> +
> +static volatile int cnt;
> +
> +static void brstack_bar(void) {
> +} /* return */
> +
> +static void brstack_foo(void) {
> + brstack_bar(); /* call */
> +} /* return */
> +
> +static void brstack_bench(void) {
> + void (*brstack_foo_ind)(void) = brstack_foo;
> +
> + if ((cnt++) % 3) /* branch (cond) */
> + brstack_foo(); /* call */
> + brstack_bar(); /* call */
> + brstack_foo_ind(); /* call (ind) */
> +}
> +
> +static int brstack(int argc, const char **argv)
> +{
> + if (argc > 0)
> + cnt = atoi(argv[0]);
> +
> + while (1) {
> + if ((cnt++) > BENCH_RUNS)
> + break;
Hi Namhyung,
I'm reading this as you can specify the number of loops as an argument.
In that case should it be more like this?
int num_loops = argc>0 ? atoi(argv[0]) : BENCH_RUNS;
if ((cnt++) > num_loops)
break;
> + brstack_bench();/* call */
> + } /* branch (uncond) */
> + return 0;
> +}
> +
> +DEFINE_WORKLOAD(brstack);
Hi James,
On Wed, Nov 16, 2022 at 3:39 AM James Clark <james.clark@arm.com> wrote:
>
>
>
> On 10/11/2022 18:19, Namhyung Kim wrote:
> [...]
> > +
> > +#define BENCH_RUNS 999999
> > +
> > +static volatile int cnt;
> > +
> > +static void brstack_bar(void) {
> > +} /* return */
> > +
> > +static void brstack_foo(void) {
> > + brstack_bar(); /* call */
> > +} /* return */
> > +
> > +static void brstack_bench(void) {
> > + void (*brstack_foo_ind)(void) = brstack_foo;
> > +
> > + if ((cnt++) % 3) /* branch (cond) */
> > + brstack_foo(); /* call */
> > + brstack_bar(); /* call */
> > + brstack_foo_ind(); /* call (ind) */
> > +}
> > +
> > +static int brstack(int argc, const char **argv)
> > +{
> > + if (argc > 0)
> > + cnt = atoi(argv[0]);
> > +
> > + while (1) {
> > + if ((cnt++) > BENCH_RUNS)
> > + break;
>
> Hi Namhyung,
>
> I'm reading this as you can specify the number of loops as an argument.
>
> In that case should it be more like this?
>
> int num_loops = argc>0 ? atoi(argv[0]) : BENCH_RUNS;
>
> if ((cnt++) > num_loops)
> break;
Yep, that's more intuitive. Will change!
Thanks,
Namhyung
@@ -123,6 +123,7 @@ static struct test_workload *workloads[] = {
&workload__thloop,
&workload__leafloop,
&workload__sqrtloop,
+ &workload__brstack,
};
static int num_subtests(const struct test_suite *t)
@@ -204,5 +204,6 @@ DECLARE_WORKLOAD(noploop);
DECLARE_WORKLOAD(thloop);
DECLARE_WORKLOAD(leafloop);
DECLARE_WORKLOAD(sqrtloop);
+DECLARE_WORKLOAD(brstack);
#endif /* TESTS_H */
@@ -4,5 +4,7 @@ perf-y += noploop.o
perf-y += thloop.o
perf-y += leafloop.o
perf-y += sqrtloop.o
+perf-y += brstack.o
CFLAGS_leafloop.o = -g -O0 -fno-inline -fno-omit-frame-pointer
+CFLAGS_brstack.o = -g -O0 -fno-inline
new file mode 100644
@@ -0,0 +1,39 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#include <stdlib.h>
+#include "../tests.h"
+
+
+#define BENCH_RUNS 999999
+
+static volatile int cnt;
+
+static void brstack_bar(void) {
+} /* return */
+
+static void brstack_foo(void) {
+ brstack_bar(); /* call */
+} /* return */
+
+static void brstack_bench(void) {
+ void (*brstack_foo_ind)(void) = brstack_foo;
+
+ if ((cnt++) % 3) /* branch (cond) */
+ brstack_foo(); /* call */
+ brstack_bar(); /* call */
+ brstack_foo_ind(); /* call (ind) */
+}
+
+static int brstack(int argc, const char **argv)
+{
+ if (argc > 0)
+ cnt = atoi(argv[0]);
+
+ while (1) {
+ if ((cnt++) > BENCH_RUNS)
+ break;
+ brstack_bench();/* call */
+ } /* branch (uncond) */
+ return 0;
+}
+
+DEFINE_WORKLOAD(brstack);