]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
drm/i915: Move GEM object busy checking to its own file
authorChris Wilson <chris@chris-wilson.co.uk>
Tue, 28 May 2019 09:29:53 +0000 (10:29 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Tue, 28 May 2019 11:45:29 +0000 (12:45 +0100)
Continuing the decluttering of i915_gem.c by moving the object busy
checking into its own file.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190528092956.14910-12-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/Makefile
drivers/gpu/drm/i915/gem/i915_gem_busy.c [new file with mode: 0644]
drivers/gpu/drm/i915/i915_gem.c

index a4ea6f6b2ab7d9853c26f03aab8672aad9f2b49e..e1ed526b96bf9445bdb4a22f2d11d85f4718fe84 100644 (file)
@@ -88,6 +88,7 @@ i915-y += $(gt-y)
 # GEM (Graphics Execution Management) code
 obj-y += gem/
 gem-y += \
+       gem/i915_gem_busy.o \
        gem/i915_gem_clflush.o \
        gem/i915_gem_context.o \
        gem/i915_gem_dmabuf.o \
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_busy.c b/drivers/gpu/drm/i915/gem/i915_gem_busy.c
new file mode 100644 (file)
index 0000000..5a5eda3
--- /dev/null
@@ -0,0 +1,138 @@
+/*
+ * SPDX-License-Identifier: MIT
+ *
+ * Copyright © 2014-2016 Intel Corporation
+ */
+
+#include "gt/intel_engine.h"
+
+#include "i915_gem_ioctls.h"
+#include "i915_gem_object.h"
+
+static __always_inline u32 __busy_read_flag(u8 id)
+{
+       if (id == (u8)I915_ENGINE_CLASS_INVALID)
+               return 0xffff0000u;
+
+       GEM_BUG_ON(id >= 16);
+       return 0x10000u << id;
+}
+
+static __always_inline u32 __busy_write_id(u8 id)
+{
+       /*
+        * The uABI guarantees an active writer is also amongst the read
+        * engines. This would be true if we accessed the activity tracking
+        * under the lock, but as we perform the lookup of the object and
+        * its activity locklessly we can not guarantee that the last_write
+        * being active implies that we have set the same engine flag from
+        * last_read - hence we always set both read and write busy for
+        * last_write.
+        */
+       if (id == (u8)I915_ENGINE_CLASS_INVALID)
+               return 0xffffffffu;
+
+       return (id + 1) | __busy_read_flag(id);
+}
+
+static __always_inline unsigned int
+__busy_set_if_active(const struct dma_fence *fence, u32 (*flag)(u8 id))
+{
+       const struct i915_request *rq;
+
+       /*
+        * We have to check the current hw status of the fence as the uABI
+        * guarantees forward progress. We could rely on the idle worker
+        * to eventually flush us, but to minimise latency just ask the
+        * hardware.
+        *
+        * Note we only report on the status of native fences.
+        */
+       if (!dma_fence_is_i915(fence))
+               return 0;
+
+       /* opencode to_request() in order to avoid const warnings */
+       rq = container_of(fence, const struct i915_request, fence);
+       if (i915_request_completed(rq))
+               return 0;
+
+       /* Beware type-expansion follies! */
+       BUILD_BUG_ON(!typecheck(u8, rq->engine->uabi_class));
+       return flag(rq->engine->uabi_class);
+}
+
+static __always_inline unsigned int
+busy_check_reader(const struct dma_fence *fence)
+{
+       return __busy_set_if_active(fence, __busy_read_flag);
+}
+
+static __always_inline unsigned int
+busy_check_writer(const struct dma_fence *fence)
+{
+       if (!fence)
+               return 0;
+
+       return __busy_set_if_active(fence, __busy_write_id);
+}
+
+int
+i915_gem_busy_ioctl(struct drm_device *dev, void *data,
+                   struct drm_file *file)
+{
+       struct drm_i915_gem_busy *args = data;
+       struct drm_i915_gem_object *obj;
+       struct reservation_object_list *list;
+       unsigned int seq;
+       int err;
+
+       err = -ENOENT;
+       rcu_read_lock();
+       obj = i915_gem_object_lookup_rcu(file, args->handle);
+       if (!obj)
+               goto out;
+
+       /*
+        * A discrepancy here is that we do not report the status of
+        * non-i915 fences, i.e. even though we may report the object as idle,
+        * a call to set-domain may still stall waiting for foreign rendering.
+        * This also means that wait-ioctl may report an object as busy,
+        * where busy-ioctl considers it idle.
+        *
+        * We trade the ability to warn of foreign fences to report on which
+        * i915 engines are active for the object.
+        *
+        * Alternatively, we can trade that extra information on read/write
+        * activity with
+        *      args->busy =
+        *              !reservation_object_test_signaled_rcu(obj->resv, true);
+        * to report the overall busyness. This is what the wait-ioctl does.
+        *
+        */
+retry:
+       seq = raw_read_seqcount(&obj->resv->seq);
+
+       /* Translate the exclusive fence to the READ *and* WRITE engine */
+       args->busy = busy_check_writer(rcu_dereference(obj->resv->fence_excl));
+
+       /* Translate shared fences to READ set of engines */
+       list = rcu_dereference(obj->resv->fence);
+       if (list) {
+               unsigned int shared_count = list->shared_count, i;
+
+               for (i = 0; i < shared_count; ++i) {
+                       struct dma_fence *fence =
+                               rcu_dereference(list->shared[i]);
+
+                       args->busy |= busy_check_reader(fence);
+               }
+       }
+
+       if (args->busy && read_seqcount_retry(&obj->resv->seq, seq))
+               goto retry;
+
+       err = 0;
+out:
+       rcu_read_unlock();
+       return err;
+}
index a460563e4bb590dad5ce6a88a938db6ee8bf1220..6af4487360302fae536cf7a6ab2818fbc5d2143f 100644 (file)
@@ -1142,134 +1142,6 @@ i915_gem_object_ggtt_pin(struct drm_i915_gem_object *obj,
        return vma;
 }
 
-static __always_inline u32 __busy_read_flag(u8 id)
-{
-       if (id == (u8)I915_ENGINE_CLASS_INVALID)
-               return 0xffff0000u;
-
-       GEM_BUG_ON(id >= 16);
-       return 0x10000u << id;
-}
-
-static __always_inline u32 __busy_write_id(u8 id)
-{
-       /*
-        * The uABI guarantees an active writer is also amongst the read
-        * engines. This would be true if we accessed the activity tracking
-        * under the lock, but as we perform the lookup of the object and
-        * its activity locklessly we can not guarantee that the last_write
-        * being active implies that we have set the same engine flag from
-        * last_read - hence we always set both read and write busy for
-        * last_write.
-        */
-       if (id == (u8)I915_ENGINE_CLASS_INVALID)
-               return 0xffffffffu;
-
-       return (id + 1) | __busy_read_flag(id);
-}
-
-static __always_inline unsigned int
-__busy_set_if_active(const struct dma_fence *fence, u32 (*flag)(u8 id))
-{
-       const struct i915_request *rq;
-
-       /*
-        * We have to check the current hw status of the fence as the uABI
-        * guarantees forward progress. We could rely on the idle worker
-        * to eventually flush us, but to minimise latency just ask the
-        * hardware.
-        *
-        * Note we only report on the status of native fences.
-        */
-       if (!dma_fence_is_i915(fence))
-               return 0;
-
-       /* opencode to_request() in order to avoid const warnings */
-       rq = container_of(fence, const struct i915_request, fence);
-       if (i915_request_completed(rq))
-               return 0;
-
-       /* Beware type-expansion follies! */
-       BUILD_BUG_ON(!typecheck(u8, rq->engine->uabi_class));
-       return flag(rq->engine->uabi_class);
-}
-
-static __always_inline unsigned int
-busy_check_reader(const struct dma_fence *fence)
-{
-       return __busy_set_if_active(fence, __busy_read_flag);
-}
-
-static __always_inline unsigned int
-busy_check_writer(const struct dma_fence *fence)
-{
-       if (!fence)
-               return 0;
-
-       return __busy_set_if_active(fence, __busy_write_id);
-}
-
-int
-i915_gem_busy_ioctl(struct drm_device *dev, void *data,
-                   struct drm_file *file)
-{
-       struct drm_i915_gem_busy *args = data;
-       struct drm_i915_gem_object *obj;
-       struct reservation_object_list *list;
-       unsigned int seq;
-       int err;
-
-       err = -ENOENT;
-       rcu_read_lock();
-       obj = i915_gem_object_lookup_rcu(file, args->handle);
-       if (!obj)
-               goto out;
-
-       /*
-        * A discrepancy here is that we do not report the status of
-        * non-i915 fences, i.e. even though we may report the object as idle,
-        * a call to set-domain may still stall waiting for foreign rendering.
-        * This also means that wait-ioctl may report an object as busy,
-        * where busy-ioctl considers it idle.
-        *
-        * We trade the ability to warn of foreign fences to report on which
-        * i915 engines are active for the object.
-        *
-        * Alternatively, we can trade that extra information on read/write
-        * activity with
-        *      args->busy =
-        *              !reservation_object_test_signaled_rcu(obj->resv, true);
-        * to report the overall busyness. This is what the wait-ioctl does.
-        *
-        */
-retry:
-       seq = raw_read_seqcount(&obj->resv->seq);
-
-       /* Translate the exclusive fence to the READ *and* WRITE engine */
-       args->busy = busy_check_writer(rcu_dereference(obj->resv->fence_excl));
-
-       /* Translate shared fences to READ set of engines */
-       list = rcu_dereference(obj->resv->fence);
-       if (list) {
-               unsigned int shared_count = list->shared_count, i;
-
-               for (i = 0; i < shared_count; ++i) {
-                       struct dma_fence *fence =
-                               rcu_dereference(list->shared[i]);
-
-                       args->busy |= busy_check_reader(fence);
-               }
-       }
-
-       if (args->busy && read_seqcount_retry(&obj->resv->seq, seq))
-               goto retry;
-
-       err = 0;
-out:
-       rcu_read_unlock();
-       return err;
-}
-
 int
 i915_gem_throttle_ioctl(struct drm_device *dev, void *data,
                        struct drm_file *file_priv)