Commit cb4d5dc3 authored by Chris Wilson's avatar Chris Wilson

drm/i915/gem: Honour O_NONBLOCK before throttling execbuf submissions

Check the user's flags on the struct file before deciding whether or not
to stall before submitting a request. This allows us to reasonably
cheaply honour O_NONBLOCK without checking at more critical phases
during request submission.
Suggested-by: default avatarJoonas Lahtinen <joonas.lahtinen@linux.intel.com>
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Cc: Steve Carbonari <steven.carbonari@intel.com>
Reviewed-by: default avatarTvrtko Ursulin <tvrtko.ursulin@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200225192206.1107336-3-chris@chris-wilson.co.uk
parent 88be76cd
...@@ -2327,15 +2327,22 @@ static int __eb_pin_engine(struct i915_execbuffer *eb, struct intel_context *ce) ...@@ -2327,15 +2327,22 @@ static int __eb_pin_engine(struct i915_execbuffer *eb, struct intel_context *ce)
intel_context_timeline_unlock(tl); intel_context_timeline_unlock(tl);
if (rq) { if (rq) {
if (i915_request_wait(rq, bool nonblock = eb->file->filp->f_flags & O_NONBLOCK;
I915_WAIT_INTERRUPTIBLE, long timeout;
MAX_SCHEDULE_TIMEOUT) < 0) {
i915_request_put(rq); timeout = MAX_SCHEDULE_TIMEOUT;
err = -EINTR; if (nonblock)
goto err_exit; timeout = 0;
}
timeout = i915_request_wait(rq,
I915_WAIT_INTERRUPTIBLE,
timeout);
i915_request_put(rq); i915_request_put(rq);
if (timeout < 0) {
err = nonblock ? -EWOULDBLOCK : timeout;
goto err_exit;
}
} }
eb->engine = ce->engine; eb->engine = ce->engine;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment