Commit 39281709 authored by Namhyung Kim's avatar Namhyung Kim Committed by Arnaldo Carvalho de Melo
Browse files

perf test: Add 'sqrtloop' test workload



The sqrtloop creates a child process to run an infinite loop calling
sqrt() with rand().  This is needed for ARM SPE fork test.

  $ perf test -w sqrtloop

It can take an optional argument to specify how long it will run in
seconds (default: 1).

Committer notes:

Explicitely ignored the sqrt() return to fix the build on systems where
the compiler complains it isn't being used.

And added a sqrtloop specific CFLAGS to disable optimizations to make
this a bit more robust wrt dead code elimination.

Doing that a -U_FORTIFY_SOURCE needs to be added, as -O0 is incompatible
with it.

Signed-off-by: default avatarNamhyung Kim <namhyung@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Athira Jajeev <atrajeev@linux.vnet.ibm.com>
Cc: German Gomez <german.gomez@arm.com>
Cc: Ian Rogers <irogers@google.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: James Clark <james.clark@arm.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Leo Yan <leo.yan@linaro.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Zhengjun Xing <zhengjun.xing@linux.intel.com>
Link: https://lore.kernel.org/r/20221116233854.1596378-8-namhyung@kernel.org


Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 7cf0b4a7
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -122,6 +122,7 @@ static struct test_workload *workloads[] = {
	&workload__noploop,
	&workload__noploop,
	&workload__thloop,
	&workload__thloop,
	&workload__leafloop,
	&workload__leafloop,
	&workload__sqrtloop,
};
};


static int num_subtests(const struct test_suite *t)
static int num_subtests(const struct test_suite *t)
+1 −0
Original line number Original line Diff line number Diff line
@@ -203,5 +203,6 @@ struct test_workload workload__##work = { \
DECLARE_WORKLOAD(noploop);
DECLARE_WORKLOAD(noploop);
DECLARE_WORKLOAD(thloop);
DECLARE_WORKLOAD(thloop);
DECLARE_WORKLOAD(leafloop);
DECLARE_WORKLOAD(leafloop);
DECLARE_WORKLOAD(sqrtloop);


#endif /* TESTS_H */
#endif /* TESTS_H */
+2 −0
Original line number Original line Diff line number Diff line
@@ -3,5 +3,7 @@
perf-y += noploop.o
perf-y += noploop.o
perf-y += thloop.o
perf-y += thloop.o
perf-y += leafloop.o
perf-y += leafloop.o
perf-y += sqrtloop.o


CFLAGS_sqrtloop.o         = -g -O0 -fno-inline -U_FORTIFY_SOURCE
CFLAGS_leafloop.o         = -g -O0 -fno-inline -fno-omit-frame-pointer -U_FORTIFY_SOURCE
CFLAGS_leafloop.o         = -g -O0 -fno-inline -fno-omit-frame-pointer -U_FORTIFY_SOURCE
+45 −0
Original line number Original line Diff line number Diff line
/* SPDX-License-Identifier: GPL-2.0 */
#include <math.h>
#include <signal.h>
#include <stdlib.h>
#include <unistd.h>
#include <linux/compiler.h>
#include <sys/wait.h>
#include "../tests.h"

static volatile sig_atomic_t done;

static void sighandler(int sig __maybe_unused)
{
	done = 1;
}

static int __sqrtloop(int sec)
{
	signal(SIGALRM, sighandler);
	alarm(sec);

	while (!done)
		(void)sqrt(rand());
	return 0;
}

static int sqrtloop(int argc, const char **argv)
{
	int sec = 1;

	if (argc > 0)
		sec = atoi(argv[0]);

	switch (fork()) {
	case 0:
		return __sqrtloop(sec);
	case -1:
		return -1;
	default:
		wait(NULL);
	}
	return 0;
}

DEFINE_WORKLOAD(sqrtloop);