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.lahti...@linux.intel.com>
Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk>
Cc: Joonas Lahtinen <joonas.lahti...@linux.intel.com>
Reviewed-by: Tvrtko Ursulin <tvrtko.ursu...@intel.com>
---
 .../gpu/drm/i915/gem/i915_gem_execbuffer.c    | 21 ++++++++++++-------
 1 file changed, 14 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c 
b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
index e4f5c269150a..c88948e4094b 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
@@ -2193,15 +2193,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;
-- 
2.24.0.rc0

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to