drm/i915/gem: Honour O_NONBLOCK before throttling execbuf submissions
authorChris Wilson <chris@chris-wilson.co.uk>
Tue, 25 Feb 2020 19:22:06 +0000 (19:22 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Tue, 25 Feb 2020 19:23:21 +0000 (19:23 +0000)
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: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Cc: Steve Carbonari <steven.carbonari@intel.com>
Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200225192206.1107336-3-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c

index 4f9c1f5..fe1e509 100644 (file)
@@ -2327,15 +2327,22 @@ static int __eb_pin_engine(struct i915_execbuffer *eb, struct intel_context *ce)
        intel_context_timeline_unlock(tl);
 
        if (rq) {
-               if (i915_request_wait(rq,
-                                     I915_WAIT_INTERRUPTIBLE,
-                                     MAX_SCHEDULE_TIMEOUT) < 0) {
-                       i915_request_put(rq);
-                       err = -EINTR;
-                       goto err_exit;
-               }
+               bool nonblock = eb->file->filp->f_flags & O_NONBLOCK;
+               long timeout;
+
+               timeout = MAX_SCHEDULE_TIMEOUT;
+               if (nonblock)
+                       timeout = 0;
 
+               timeout = i915_request_wait(rq,
+                                           I915_WAIT_INTERRUPTIBLE,
+                                           timeout);
                i915_request_put(rq);
+
+               if (timeout < 0) {
+                       err = nonblock ? -EWOULDBLOCK : timeout;
+                       goto err_exit;
+               }
        }
 
        eb->engine = ce->engine;