summaryrefslogtreecommitdiff
path: root/benchmarks/gem_wsim.c
diff options
context:
space:
mode:
authorTvrtko Ursulin <tvrtko.ursulin@intel.com>2017-05-16 07:56:20 +0100
committerTvrtko Ursulin <tvrtko.ursulin@intel.com>2017-05-16 08:02:40 +0100
commit2e10dc96c57373c9e5ece2a641a2012db9f07331 (patch)
treefb96deca8619f7536289b459cf80a5dd18026f2d /benchmarks/gem_wsim.c
parentfeaf779de5adb587214faa3f935360e0e4aa0c25 (diff)
gem_wsim: Add append workload
Used with the '-a' command line switch which follows the same usage as '-w' and '-W', it enables to add append workload steps to the end of all normal workloads. This for example allows running any workload in the real-time mode: gem_wsim -w <some-workload> -a p.16667 Makes a workload to be run with the 60 Hz period. At the same time fix the periodic mode execution with dropped frames, or almost dropped frames. Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Diffstat (limited to 'benchmarks/gem_wsim.c')
-rw-r--r--benchmarks/gem_wsim.c65
1 files changed, 58 insertions, 7 deletions
diff --git a/benchmarks/gem_wsim.c b/benchmarks/gem_wsim.c
index e09ef257..93ffc1f2 100644
--- a/benchmarks/gem_wsim.c
+++ b/benchmarks/gem_wsim.c
@@ -209,7 +209,8 @@ parse_dependencies(unsigned int nr_steps, struct w_step *w, char *_desc)
return 0;
}
-static struct workload *parse_workload(char *_desc, unsigned int flags)
+static struct workload *
+parse_workload(char *_desc, unsigned int flags, struct workload *app_w)
{
struct workload *wrk;
unsigned int nr_steps = 0;
@@ -439,6 +440,22 @@ add_step:
free(token);
}
+ if (app_w) {
+ unsigned int i;
+
+ steps = realloc(steps, sizeof(step) *
+ (nr_steps + app_w->nr_steps));
+ igt_assert(steps);
+
+ memcpy(&steps[nr_steps], app_w->steps,
+ sizeof(step) * app_w->nr_steps);
+
+ for (i = 0; i < app_w->nr_steps; i++)
+ steps[nr_steps + i].idx += nr_steps;
+
+ nr_steps += app_w->nr_steps;
+ }
+
wrk = malloc(sizeof(*wrk));
igt_assert(wrk);
@@ -1249,11 +1266,10 @@ run_workload(unsigned int id, struct workload *wrk,
do_sleep = w->wait -
elapsed_us(&wrk->repeat_start, &now);
if (do_sleep < 0) {
- if (verbose > 1) {
+ if (verbose > 1)
printf("%u: Dropped period @ %u/%u (%dus late)!\n",
id, j, i, do_sleep);
- continue;
- }
+ continue;
}
} else if (w->type == SYNC) {
unsigned int s_idx = i + w->wait;
@@ -1270,11 +1286,13 @@ run_workload(unsigned int id, struct workload *wrk,
continue;
}
- if (do_sleep) {
+ if (do_sleep || w->type == PERIOD) {
usleep(do_sleep);
continue;
}
+ igt_assert(w->type == BATCH);
+
wrk->nr_bb[engine]++;
if (engine == VCS && balancer) {
engine = balancer->balance(balancer, wrk, w);
@@ -1439,6 +1457,7 @@ static void print_help(void)
" Only one master workload can be optinally specified in which\n"
" case all other workloads become background ones and run as\n"
" long as the master.\n"
+" -a <desc|path> Append a workload to all other workloads.\n"
" -r <n> How many times to emit the workload.\n"
" -c <n> Fork N clients emitting the workload simultaneously.\n"
" -x Swap VCS1 and VCS2 engines in every other client.\n"
@@ -1571,8 +1590,10 @@ int main(int argc, char **argv)
unsigned int flags = 0;
struct timespec t_start, t_end;
struct workload **w, **wrk = NULL;
+ struct workload *app_w = NULL;
unsigned int nr_w_args = 0;
int master_workload = -1;
+ char *append_workload_arg = NULL;
char **w_args = NULL;
unsigned int tolerance_pct = 1;
const struct workload_balancer *balancer = NULL;
@@ -1591,7 +1612,7 @@ int main(int argc, char **argv)
init_clocks();
- while ((c = getopt(argc, argv, "hqv2RSHxc:n:r:w:W:t:b:")) != -1) {
+ while ((c = getopt(argc, argv, "hqv2RSHxc:n:r:w:W:a:t:b:")) != -1) {
switch (c) {
case 'W':
if (master_workload >= 0) {
@@ -1605,6 +1626,15 @@ int main(int argc, char **argv)
case 'w':
w_args = add_workload_arg(w_args, ++nr_w_args, optarg);
break;
+ case 'a':
+ if (append_workload_arg) {
+ if (verbose)
+ fprintf(stderr,
+ "Only one append workload can be given!\n");
+ return 1;
+ }
+ append_workload_arg = optarg;
+ break;
case 'c':
clients = strtol(optarg, NULL, 0);
break;
@@ -1695,6 +1725,27 @@ int main(int argc, char **argv)
return 1;
}
+ if (append_workload_arg) {
+ append_workload_arg = load_workload_descriptor(append_workload_arg);
+ if (!append_workload_arg) {
+ if (verbose)
+ fprintf(stderr,
+ "Failed to load append workload descriptor!\n");
+ return 1;
+ }
+ }
+
+ if (append_workload_arg) {
+ app_w = parse_workload(append_workload_arg, flags, NULL);
+ if (!app_w) {
+ if (verbose)
+ fprintf(stderr,
+ "Failed to parse append workload %u!\n",
+ i);
+ return 1;
+ }
+ }
+
wrk = calloc(nr_w_args, sizeof(*wrk));
igt_assert(wrk);
@@ -1709,7 +1760,7 @@ int main(int argc, char **argv)
return 1;
}
- wrk[i] = parse_workload(w_args[i], flags);
+ wrk[i] = parse_workload(w_args[i], flags, app_w);
if (!wrk[i]) {
if (verbose)
fprintf(stderr,