Re: [PATCH v3 2/7] drm/i915: Break out the i915_deps utility

2021-12-21 Thread Matthew Auld

On 17/12/2021 14:52, Thomas Hellström wrote:

Since it's starting to be used outside the i915 TTM move code, move it
to a separate set of files.

v2:
- Update the documentation.

Signed-off-by: Thomas Hellström 

Reviewed-by: Matthew Auld 


[PATCH v3 2/7] drm/i915: Break out the i915_deps utility

2021-12-17 Thread Thomas Hellström
Since it's starting to be used outside the i915 TTM move code, move it
to a separate set of files.

v2:
- Update the documentation.

Signed-off-by: Thomas Hellström 
---
 drivers/gpu/drm/i915/Makefile|   1 +
 drivers/gpu/drm/i915/gem/i915_gem_ttm_move.c | 176 +
 drivers/gpu/drm/i915/gem/i915_gem_ttm_move.h |  17 --
 drivers/gpu/drm/i915/i915_deps.c | 244 +++
 drivers/gpu/drm/i915/i915_deps.h |  46 
 drivers/gpu/drm/i915/i915_request.c  |   2 +-
 6 files changed, 293 insertions(+), 193 deletions(-)
 create mode 100644 drivers/gpu/drm/i915/i915_deps.c
 create mode 100644 drivers/gpu/drm/i915/i915_deps.h

diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile
index 6ddd2d2bbaaf..1b62b9f65196 100644
--- a/drivers/gpu/drm/i915/Makefile
+++ b/drivers/gpu/drm/i915/Makefile
@@ -163,6 +163,7 @@ i915-y += \
  i915_active.o \
  i915_buddy.o \
  i915_cmd_parser.o \
+ i915_deps.o \
  i915_gem_evict.o \
  i915_gem_gtt.o \
  i915_gem_ww.o \
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_ttm_move.c 
b/drivers/gpu/drm/i915/gem/i915_gem_ttm_move.c
index 960145c8200f..e8a99e8cd129 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_ttm_move.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_ttm_move.c
@@ -5,6 +5,7 @@
 
 #include 
 
+#include "i915_deps.h"
 #include "i915_drv.h"
 #include "intel_memory_region.h"
 #include "intel_region_ttm.h"
@@ -41,181 +42,6 @@ void i915_ttm_migrate_set_failure_modes(bool gpu_migration,
 }
 #endif
 
-/**
- * DOC: Set of utilities to dynamically collect dependencies into a
- * structure which is fed into the GT migration code.
- *
- * Once we can do async unbinding, this is also needed to coalesce
- * the migration fence with the unbind fences if these are coalesced
- * post-migration.
- *
- * While collecting the individual dependencies, we store the refcounted
- * struct dma_fence pointers in a realloc-managed pointer array, since
- * that can be easily fed into a dma_fence_array. Other options are
- * available, like for example an xarray for similarity with drm/sched.
- * Can be changed easily if needed.
- *
- * A struct i915_deps need to be initialized using i915_deps_init().
- * If i915_deps_add_dependency() or i915_deps_add_resv() return an
- * error code they will internally call i915_deps_fini(), which frees
- * all internal references and allocations.
- *
- * We might want to break this out into a separate file as a utility.
- */
-
-#define I915_DEPS_MIN_ALLOC_CHUNK 8U
-
-static void i915_deps_reset_fences(struct i915_deps *deps)
-{
-   if (deps->fences != &deps->single)
-   kfree(deps->fences);
-   deps->num_deps = 0;
-   deps->fences_size = 1;
-   deps->fences = &deps->single;
-}
-
-static void i915_deps_init(struct i915_deps *deps, gfp_t gfp)
-{
-   deps->fences = NULL;
-   deps->gfp = gfp;
-   i915_deps_reset_fences(deps);
-}
-
-static void i915_deps_fini(struct i915_deps *deps)
-{
-   unsigned int i;
-
-   for (i = 0; i < deps->num_deps; ++i)
-   dma_fence_put(deps->fences[i]);
-
-   if (deps->fences != &deps->single)
-   kfree(deps->fences);
-}
-
-static int i915_deps_grow(struct i915_deps *deps, struct dma_fence *fence,
- const struct ttm_operation_ctx *ctx)
-{
-   int ret;
-
-   if (deps->num_deps >= deps->fences_size) {
-   unsigned int new_size = 2 * deps->fences_size;
-   struct dma_fence **new_fences;
-
-   new_size = max(new_size, I915_DEPS_MIN_ALLOC_CHUNK);
-   new_fences = kmalloc_array(new_size, sizeof(*new_fences), 
deps->gfp);
-   if (!new_fences)
-   goto sync;
-
-   memcpy(new_fences, deps->fences,
-  deps->fences_size * sizeof(*new_fences));
-   swap(new_fences, deps->fences);
-   if (new_fences != &deps->single)
-   kfree(new_fences);
-   deps->fences_size = new_size;
-   }
-   deps->fences[deps->num_deps++] = dma_fence_get(fence);
-   return 0;
-
-sync:
-   if (ctx->no_wait_gpu && !dma_fence_is_signaled(fence)) {
-   ret = -EBUSY;
-   goto unref;
-   }
-
-   ret = dma_fence_wait(fence, ctx->interruptible);
-   if (ret)
-   goto unref;
-
-   ret = fence->error;
-   if (ret)
-   goto unref;
-
-   return 0;
-
-unref:
-   i915_deps_fini(deps);
-   return ret;
-}
-
-static int i915_deps_sync(const struct i915_deps *deps,
- const struct ttm_operation_ctx *ctx)
-{
-   struct dma_fence **fences = deps->fences;
-   unsigned int i;
-   int ret = 0;
-
-   for (i = 0; i < deps->num_deps; ++i, ++fences) {
-   if (ctx->no_wait_gpu && !dma_fence_is_signaled(*fences)) {
-   ret = -EBUSY;
-