summaryrefslogtreecommitdiff
path: root/benchmarks/gem_wsim.c
diff options
context:
space:
mode:
authorTvrtko Ursulin <tvrtko.ursulin@intel.com>2018-08-14 10:41:30 +0100
committerTvrtko Ursulin <tvrtko.ursulin@intel.com>2018-09-14 12:53:27 +0100
commit0ff0804b0d52e034459a80ab27c39965d5ea1e39 (patch)
treee1bb6b7f1166ce592f462db775071a08cea2231a /benchmarks/gem_wsim.c
parent5cdff3c00bdff3dc8c6ab4f5b2f11978bf06e59e (diff)
gem_wsim: Context priority support
A new workload command ('P') is added which enables per context dynamic priority control. Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com> Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'benchmarks/gem_wsim.c')
-rw-r--r--benchmarks/gem_wsim.c48
1 files changed, 47 insertions, 1 deletions
diff --git a/benchmarks/gem_wsim.c b/benchmarks/gem_wsim.c
index 395a5dff..282b986d 100644
--- a/benchmarks/gem_wsim.c
+++ b/benchmarks/gem_wsim.c
@@ -82,7 +82,8 @@ enum w_type
THROTTLE,
QD_THROTTLE,
SW_FENCE,
- SW_FENCE_SIGNAL
+ SW_FENCE_SIGNAL,
+ CTX_PRIORITY
};
struct deps
@@ -114,6 +115,7 @@ struct w_step
int target;
int throttle;
int fence_signal;
+ int priority;
};
/* Implementation details */
@@ -162,6 +164,7 @@ struct workload
unsigned int nr_ctxs;
struct {
uint32_t id;
+ int priority;
unsigned int static_vcs;
} *ctx_list;
@@ -342,6 +345,36 @@ parse_workload(struct w_arg *arg, unsigned int flags, struct workload *app_w)
step.period = tmp;
goto add_step;
}
+ } else if (!strcmp(field, "P")) {
+ unsigned int nr = 0;
+ while ((field = strtok_r(fstart, ".", &fctx)) !=
+ NULL) {
+ tmp = atoi(field);
+ if (tmp <= 0 && nr == 0) {
+ if (verbose)
+ fprintf(stderr,
+ "Invalid context at step %u!\n",
+ nr_steps);
+ return NULL;
+ }
+
+ if (nr == 0) {
+ step.context = tmp;
+ } else if (nr == 1) {
+ step.priority = tmp;
+ } else {
+ if (verbose)
+ fprintf(stderr,
+ "Invalid priority format at step %u!\n",
+ nr_steps);
+ return NULL;
+ }
+
+ nr++;
+ }
+
+ step.type = CTX_PRIORITY;
+ goto add_step;
} else if (!strcmp(field, "s")) {
if ((field = strtok_r(fstart, ".", &fctx)) !=
NULL) {
@@ -1790,6 +1823,19 @@ static void *run_workload(void *data)
inc = cur_seqno - wrk->sync_seqno;
sw_sync_timeline_inc(wrk->sync_timeline, inc);
continue;
+ } else if (w->type == CTX_PRIORITY) {
+ if (w->priority != wrk->ctx_list[w->context].priority) {
+ struct drm_i915_gem_context_param param = {
+ .ctx_id = wrk->ctx_list[w->context].id,
+ .param = I915_CONTEXT_PARAM_PRIORITY,
+ .value = w->priority,
+ };
+
+ gem_context_set_param(fd, &param);
+ wrk->ctx_list[w->context].priority =
+ w->priority;
+ }
+ continue;
}
if (do_sleep || w->type == PERIOD) {