drm/xe/bo: Evict VRAM to TT rather than to system
authorThomas Hellström <thomas.hellstrom@linux.intel.com>
Mon, 26 Jun 2023 18:17:41 +0000 (20:17 +0200)
committerRodrigo Vivi <rodrigo.vivi@intel.com>
Thu, 21 Dec 2023 16:35:04 +0000 (11:35 -0500)
The main difference is that we don't bounce and sync on eviction, allowing
for pipelined eviction. Moving forward we also need to be careful with
dma mappings which can be released in SYSTEM but may remain in TT.

v2:
- Remove a stale comment (Matthew Brost)

Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Reviewed-by: Matthew Brost <matthew.brost@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20230626181741.32820-5-thomas.hellstrom@linux.intel.com
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
drivers/gpu/drm/xe/tests/xe_dma_buf.c
drivers/gpu/drm/xe/xe_bo.c
drivers/gpu/drm/xe/xe_dma_buf.c

index 513a3b3362e9f26ce97e4193ab1c7503370501b4..810a035bf72005bd620b01bc4625f63736d8c61d 100644 (file)
@@ -72,7 +72,7 @@ static void check_residency(struct kunit *test, struct xe_bo *exported,
        }
 
        /* Verify that also importer has been evicted to SYSTEM */
-       if (!xe_bo_is_mem_type(imported, XE_PL_SYSTEM)) {
+       if (exported != imported && !xe_bo_is_mem_type(imported, XE_PL_SYSTEM)) {
                KUNIT_FAIL(test, "Importer wasn't properly evicted.\n");
                return;
        }
@@ -91,8 +91,7 @@ static void check_residency(struct kunit *test, struct xe_bo *exported,
         * possible, saving a migration step as the transfer is just
         * likely as fast from system memory.
         */
-       if (params->force_different_devices &&
-           params->mem_mask & XE_BO_CREATE_SYSTEM_BIT)
+       if (params->mem_mask & XE_BO_CREATE_SYSTEM_BIT)
                KUNIT_EXPECT_TRUE(test, xe_bo_is_mem_type(exported, XE_PL_TT));
        else
                KUNIT_EXPECT_TRUE(test, xe_bo_is_mem_type(exported, mem_type));
index 1f4d1790d57cd7ab61a13be35066ad8c2d1f2ba9..17c0c6c2ae65a06e9c1fed1d181d32b6397b59dd 100644 (file)
@@ -40,6 +40,20 @@ static struct ttm_placement sys_placement = {
        .busy_placement = &sys_placement_flags,
 };
 
+static const struct ttm_place tt_placement_flags = {
+       .fpfn = 0,
+       .lpfn = 0,
+       .mem_type = XE_PL_TT,
+       .flags = 0,
+};
+
+static struct ttm_placement tt_placement = {
+       .num_placement = 1,
+       .placement = &tt_placement_flags,
+       .num_busy_placement = 1,
+       .busy_placement = &sys_placement_flags,
+};
+
 bool mem_type_is_vram(u32 mem_type)
 {
        return mem_type >= XE_PL_VRAM0 && mem_type != XE_PL_STOLEN;
@@ -225,9 +239,10 @@ static void xe_evict_flags(struct ttm_buffer_object *tbo,
        case XE_PL_VRAM0:
        case XE_PL_VRAM1:
        case XE_PL_STOLEN:
+               *placement = tt_placement;
+               break;
        case XE_PL_TT:
        default:
-               /* for now kick out to system */
                *placement = sys_placement;
                break;
        }
index 975dee1f770ffd22f9323f4f86ab7f1a0a25a4b2..b9bf4b4dd8a5e5d4827a4c6c7fb9f9d4e840fb11 100644 (file)
@@ -81,13 +81,10 @@ static struct sg_table *xe_dma_buf_map(struct dma_buf_attachment *attach,
                return ERR_PTR(-EOPNOTSUPP);
 
        if (!xe_bo_is_pinned(bo)) {
-               if (!attach->peer2peer ||
-                   bo->ttm.resource->mem_type == XE_PL_SYSTEM) {
-                       if (xe_bo_can_migrate(bo, XE_PL_TT))
-                               r = xe_bo_migrate(bo, XE_PL_TT);
-                       else
-                               r = xe_bo_validate(bo, NULL, false);
-               }
+               if (!attach->peer2peer)
+                       r = xe_bo_migrate(bo, XE_PL_TT);
+               else
+                       r = xe_bo_validate(bo, NULL, false);
                if (r)
                        return ERR_PTR(r);
        }