drm/ttm: add new function to check if bo is allowable to evict or swapout
authorRoger He <Hongbo.He@amd.com>
Thu, 21 Dec 2017 09:42:52 +0000 (17:42 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 28 Dec 2017 14:48:20 +0000 (09:48 -0500)
extract a function as ttm_bo_evict_swapout_allowable since eviction and
swapout can share same logic.

v2: modify commit message and add description in the code

Reviewed-by: Thomas Hellström <thellstrom@vmware.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Chuming Zhou <david1.zhou@amd.com>
Signed-off-by: Roger He <Hongbo.He@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/ttm/ttm_bo.c

index b3a71ac..ac2ab20 100644 (file)
@@ -708,6 +708,34 @@ bool ttm_bo_eviction_valuable(struct ttm_buffer_object *bo,
 }
 EXPORT_SYMBOL(ttm_bo_eviction_valuable);
 
+/**
+ * Check the target bo is allowable to be evicted or swapout, including cases:
+ *
+ * a. if share same reservation object with ctx->resv, have assumption
+ * reservation objects should already be locked, so not lock again and
+ * return true directly when either the opreation allow_reserved_eviction
+ * or the target bo already is in delayed free list;
+ *
+ * b. Otherwise, trylock it.
+ */
+static bool ttm_bo_evict_swapout_allowable(struct ttm_buffer_object *bo,
+                       struct ttm_operation_ctx *ctx, bool *locked)
+{
+       bool ret = false;
+
+       *locked = false;
+       if (bo->resv == ctx->resv) {
+               reservation_object_assert_held(bo->resv);
+               if (ctx->allow_reserved_eviction || !list_empty(&bo->ddestroy))
+                       ret = true;
+       } else {
+               *locked = reservation_object_trylock(bo->resv);
+               ret = *locked;
+       }
+
+       return ret;
+}
+
 static int ttm_mem_evict_first(struct ttm_bo_device *bdev,
                               uint32_t mem_type,
                               const struct ttm_place *place,
@@ -723,21 +751,13 @@ static int ttm_mem_evict_first(struct ttm_bo_device *bdev,
        spin_lock(&glob->lru_lock);
        for (i = 0; i < TTM_MAX_BO_PRIORITY; ++i) {
                list_for_each_entry(bo, &man->lru[i], lru) {
-                       if (bo->resv == ctx->resv) {
-                               if (!ctx->allow_reserved_eviction &&
-                                   list_empty(&bo->ddestroy))
-                                       continue;
-                       } else {
-                               locked = reservation_object_trylock(bo->resv);
-                               if (!locked)
-                                       continue;
-                       }
+                       if (!ttm_bo_evict_swapout_allowable(bo, ctx, &locked))
+                               continue;
 
                        if (place && !bdev->driver->eviction_valuable(bo,
                                                                      place)) {
                                if (locked)
                                        reservation_object_unlock(bo->resv);
-                               locked = false;
                                continue;
                        }
                        break;